From 27e2307d0c05ad134df166f264d1b993d823930e Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Fri, 17 Feb 2023 15:48:18 +0100 Subject: [PATCH 001/143] Python: Add import regression for refined variable --- .../experimental/import-resolution/importflow.ql | 3 +++ .../ql/test/experimental/import-resolution/main.py | 4 ++++ .../test/experimental/import-resolution/refined.py | 12 ++++++++++++ 3 files changed, 19 insertions(+) create mode 100644 python/ql/test/experimental/import-resolution/refined.py diff --git a/python/ql/test/experimental/import-resolution/importflow.ql b/python/ql/test/experimental/import-resolution/importflow.ql index e6e51afa963..94f5e4b0ec8 100644 --- a/python/ql/test/experimental/import-resolution/importflow.ql +++ b/python/ql/test/experimental/import-resolution/importflow.ql @@ -11,6 +11,9 @@ private class SourceString extends DataFlow::Node { SourceString() { this.asExpr().(StrConst).getText() = contents and this.asExpr().getParent() instanceof Assign + or + this.asExpr().(ClassExpr).getInnerScope().getName() = "SOURCE" and + contents = "SOURCE" } string getContents() { result = contents } diff --git a/python/ql/test/experimental/import-resolution/main.py b/python/ql/test/experimental/import-resolution/main.py index 840da95a03c..6ff5506cab4 100644 --- a/python/ql/test/experimental/import-resolution/main.py +++ b/python/ql/test/experimental/import-resolution/main.py @@ -93,6 +93,10 @@ check("subpackage2_attr", subpackage2_attr, "subpackage2_attr", globals()) #$ pr from if_then_else import if_then_else_defined check("if_then_else_defined", if_then_else_defined, "if_defined", globals()) #$ prints=if_defined prints=else_defined_1 prints=else_defined_2 +# check that refined definitions are handled correctly +import refined # $ imports=refined as=refined +check("refined.SOURCE", refined.SOURCE, refined.SOURCE, globals()) #$ MISSING: prints=SOURCE + exit(__file__) print() diff --git a/python/ql/test/experimental/import-resolution/refined.py b/python/ql/test/experimental/import-resolution/refined.py new file mode 100644 index 00000000000..a687ce15655 --- /dev/null +++ b/python/ql/test/experimental/import-resolution/refined.py @@ -0,0 +1,12 @@ +from trace import * +enter(__file__) + +class SOURCE(object): pass + +check("SOURCE", SOURCE, SOURCE, globals()) #$ prints=SOURCE + +SOURCE.foo = 42 + +check("SOURCE", SOURCE, SOURCE, globals()) #$ prints=SOURCE + +exit(__file__) From fb425b73fcac5d88c97a35b0a87479f1613308ff Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Tue, 21 Feb 2023 15:47:36 +0100 Subject: [PATCH 002/143] Python: Add import test of `py/insecure-protocol` --- .../InsecureProtocol.expected | 5 ++++ .../import_all_one_file.py | 30 +++++++++++++++++++ .../CWE-327-InsecureProtocol/import_def.py | 11 +++++++ .../CWE-327-InsecureProtocol/import_use.py | 18 +++++++++++ 4 files changed, 64 insertions(+) create mode 100644 python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_all_one_file.py create mode 100644 python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_def.py create mode 100644 python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_use.py diff --git a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected index c08e19e5f1c..f097438b213 100644 --- a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected +++ b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected @@ -10,6 +10,11 @@ | InsecureProtocol.py:19:1:19:19 | ControlFlowNode for Attribute() | Insecure SSL/TLS protocol version SSLv2 specified by $@. | InsecureProtocol.py:19:1:19:19 | ControlFlowNode for Attribute() | call to SSL.Context | | InsecureProtocol.py:23:1:23:43 | ControlFlowNode for Attribute() | Insecure SSL/TLS protocol version SSLv2 specified by $@. | InsecureProtocol.py:23:1:23:43 | ControlFlowNode for Attribute() | call to ssl.wrap_socket | | InsecureProtocol.py:24:1:24:35 | ControlFlowNode for SSLContext() | Insecure SSL/TLS protocol version SSLv2 specified by $@. | InsecureProtocol.py:24:1:24:35 | ControlFlowNode for SSLContext() | call to SSLContext | +| import_all_one_file.py:25:14:25:45 | ControlFlowNode for copy_completely_insecure_context | Insecure SSL/TLS protocol version TLSv1 allowed by $@. | import_all_one_file.py:9:36:9:67 | ControlFlowNode for Attribute() | call to ssl.SSLContext | +| import_all_one_file.py:25:14:25:45 | ControlFlowNode for copy_completely_insecure_context | Insecure SSL/TLS protocol version TLSv1_1 allowed by $@. | import_all_one_file.py:9:36:9:67 | ControlFlowNode for Attribute() | call to ssl.SSLContext | +| import_all_one_file.py:29:14:29:39 | ControlFlowNode for copy_also_insecure_context | Insecure SSL/TLS protocol version TLSv1_1 allowed by $@. | import_all_one_file.py:12:30:12:61 | ControlFlowNode for Attribute() | call to ssl.SSLContext | +| import_use.py:13:14:13:40 | ControlFlowNode for completely_insecure_context | Insecure SSL/TLS protocol version TLSv1 allowed by $@. | import_def.py:7:31:7:62 | ControlFlowNode for Attribute() | call to ssl.SSLContext | +| import_use.py:13:14:13:40 | ControlFlowNode for completely_insecure_context | Insecure SSL/TLS protocol version TLSv1_1 allowed by $@. | import_def.py:7:31:7:62 | ControlFlowNode for Attribute() | call to ssl.SSLContext | | pyOpenSSL_fluent.py:8:27:8:33 | ControlFlowNode for context | Insecure SSL/TLS protocol version SSLv2 allowed by $@. | pyOpenSSL_fluent.py:6:15:6:44 | ControlFlowNode for Attribute() | call to SSL.Context | | pyOpenSSL_fluent.py:8:27:8:33 | ControlFlowNode for context | Insecure SSL/TLS protocol version SSLv3 allowed by $@. | pyOpenSSL_fluent.py:6:15:6:44 | ControlFlowNode for Attribute() | call to SSL.Context | | pyOpenSSL_fluent.py:8:27:8:33 | ControlFlowNode for context | Insecure SSL/TLS protocol version TLSv1 allowed by $@. | pyOpenSSL_fluent.py:6:15:6:44 | ControlFlowNode for Attribute() | call to SSL.Context | diff --git a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_all_one_file.py b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_all_one_file.py new file mode 100644 index 00000000000..aab459ceeea --- /dev/null +++ b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_all_one_file.py @@ -0,0 +1,30 @@ +# use to compare alerts without import + +import ssl + +copy_secure_context = ssl.SSLContext(ssl.PROTOCOL_TLS) +copy_secure_context.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 + +# this is just to allow us to see how un-altered exports work +copy_completely_insecure_context = ssl.SSLContext(ssl.PROTOCOL_TLS) + +# and an insecure export that is refined +copy_also_insecure_context = ssl.SSLContext(ssl.PROTOCOL_TLS) +copy_also_insecure_context.options |= ssl.OP_NO_TLSv1 + + + +import socket +hostname = 'www.python.org' + +with socket.create_connection((hostname, 443)) as sock: + with copy_secure_context.wrap_socket(sock, server_hostname=hostname) as ssock: + print(ssock.version()) + +with socket.create_connection((hostname, 443)) as sock: + with copy_completely_insecure_context.wrap_socket(sock, server_hostname=hostname) as ssock: + print(ssock.version()) + +with socket.create_connection((hostname, 443)) as sock: + with copy_also_insecure_context.wrap_socket(sock, server_hostname=hostname) as ssock: + print(ssock.version()) diff --git a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_def.py b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_def.py new file mode 100644 index 00000000000..d8e37542b94 --- /dev/null +++ b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_def.py @@ -0,0 +1,11 @@ +import ssl + +secure_context = ssl.SSLContext(ssl.PROTOCOL_TLS) +secure_context.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 + +# this is just to allow us to see how un-altered exports work +completely_insecure_context = ssl.SSLContext(ssl.PROTOCOL_TLS) + +# and an insecure export that is refined +also_insecure_context = ssl.SSLContext(ssl.PROTOCOL_TLS) +also_insecure_context.options |= ssl.OP_NO_TLSv1 diff --git a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_use.py b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_use.py new file mode 100644 index 00000000000..3c12fd81355 --- /dev/null +++ b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/import_use.py @@ -0,0 +1,18 @@ +# check that query works properly with imports + +import socket +from import_def import secure_context, completely_insecure_context, also_insecure_context + +hostname = 'www.python.org' + +with socket.create_connection((hostname, 443)) as sock: + with secure_context.wrap_socket(sock, server_hostname=hostname) as ssock: + print(ssock.version()) + +with socket.create_connection((hostname, 443)) as sock: + with completely_insecure_context.wrap_socket(sock, server_hostname=hostname) as ssock: + print(ssock.version()) + +with socket.create_connection((hostname, 443)) as sock: + with also_insecure_context.wrap_socket(sock, server_hostname=hostname) as ssock: + print(ssock.version()) From 00eec6986cacd1ae6e4789278c41f35fe5ed4f06 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Fri, 17 Feb 2023 15:52:53 +0100 Subject: [PATCH 003/143] Python: Allow import of refined variable However, as illustrated by the `CWE-327-InsecureProtocol` test, this fix is NOT good enough, since now even the `secure_context` is considered to be insecure (for both versions). Ouch. Will fix this in a later commit, since it was only discoverd late on. --- .../ql/lib/change-notes/2023-02-17-import-refined-variable.md | 4 ++++ .../semmle/python/dataflow/new/internal/ImportResolution.qll | 3 +++ python/ql/test/experimental/import-resolution/main.py | 2 +- .../CWE-327-InsecureProtocol/InsecureProtocol.expected | 4 ++++ 4 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 python/ql/lib/change-notes/2023-02-17-import-refined-variable.md diff --git a/python/ql/lib/change-notes/2023-02-17-import-refined-variable.md b/python/ql/lib/change-notes/2023-02-17-import-refined-variable.md new file mode 100644 index 00000000000..e2dfcd8fd1a --- /dev/null +++ b/python/ql/lib/change-notes/2023-02-17-import-refined-variable.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Fixed module resolution so we allow imports of definitions that have had an attribute assigned to it, such as `class Foo; Foo.bar = 42`. diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll index 7af9ca524aa..4895feff946 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll @@ -79,6 +79,9 @@ module ImportResolution { or // to handle definitions guarded by if-then-else essaDef = v.getDefinition().(PhiFunction).getAnInput() + or + // refined variable + essaDef = v.getDefinition().(EssaNodeRefinement).getInput().getDefinition() ) | defn.getNode() = essaDef.(AssignmentDefinition).getValue() diff --git a/python/ql/test/experimental/import-resolution/main.py b/python/ql/test/experimental/import-resolution/main.py index 6ff5506cab4..2a94f180388 100644 --- a/python/ql/test/experimental/import-resolution/main.py +++ b/python/ql/test/experimental/import-resolution/main.py @@ -95,7 +95,7 @@ check("if_then_else_defined", if_then_else_defined, "if_defined", globals()) #$ # check that refined definitions are handled correctly import refined # $ imports=refined as=refined -check("refined.SOURCE", refined.SOURCE, refined.SOURCE, globals()) #$ MISSING: prints=SOURCE +check("refined.SOURCE", refined.SOURCE, refined.SOURCE, globals()) #$ prints=SOURCE exit(__file__) diff --git a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected index f097438b213..cc0d620aa1c 100644 --- a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected +++ b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected @@ -13,8 +13,12 @@ | import_all_one_file.py:25:14:25:45 | ControlFlowNode for copy_completely_insecure_context | Insecure SSL/TLS protocol version TLSv1 allowed by $@. | import_all_one_file.py:9:36:9:67 | ControlFlowNode for Attribute() | call to ssl.SSLContext | | import_all_one_file.py:25:14:25:45 | ControlFlowNode for copy_completely_insecure_context | Insecure SSL/TLS protocol version TLSv1_1 allowed by $@. | import_all_one_file.py:9:36:9:67 | ControlFlowNode for Attribute() | call to ssl.SSLContext | | import_all_one_file.py:29:14:29:39 | ControlFlowNode for copy_also_insecure_context | Insecure SSL/TLS protocol version TLSv1_1 allowed by $@. | import_all_one_file.py:12:30:12:61 | ControlFlowNode for Attribute() | call to ssl.SSLContext | +| import_use.py:9:14:9:27 | ControlFlowNode for secure_context | Insecure SSL/TLS protocol version TLSv1 allowed by $@. | import_def.py:3:18:3:49 | ControlFlowNode for Attribute() | call to ssl.SSLContext | +| import_use.py:9:14:9:27 | ControlFlowNode for secure_context | Insecure SSL/TLS protocol version TLSv1_1 allowed by $@. | import_def.py:3:18:3:49 | ControlFlowNode for Attribute() | call to ssl.SSLContext | | import_use.py:13:14:13:40 | ControlFlowNode for completely_insecure_context | Insecure SSL/TLS protocol version TLSv1 allowed by $@. | import_def.py:7:31:7:62 | ControlFlowNode for Attribute() | call to ssl.SSLContext | | import_use.py:13:14:13:40 | ControlFlowNode for completely_insecure_context | Insecure SSL/TLS protocol version TLSv1_1 allowed by $@. | import_def.py:7:31:7:62 | ControlFlowNode for Attribute() | call to ssl.SSLContext | +| import_use.py:17:14:17:34 | ControlFlowNode for also_insecure_context | Insecure SSL/TLS protocol version TLSv1 allowed by $@. | import_def.py:10:25:10:56 | ControlFlowNode for Attribute() | call to ssl.SSLContext | +| import_use.py:17:14:17:34 | ControlFlowNode for also_insecure_context | Insecure SSL/TLS protocol version TLSv1_1 allowed by $@. | import_def.py:10:25:10:56 | ControlFlowNode for Attribute() | call to ssl.SSLContext | | pyOpenSSL_fluent.py:8:27:8:33 | ControlFlowNode for context | Insecure SSL/TLS protocol version SSLv2 allowed by $@. | pyOpenSSL_fluent.py:6:15:6:44 | ControlFlowNode for Attribute() | call to SSL.Context | | pyOpenSSL_fluent.py:8:27:8:33 | ControlFlowNode for context | Insecure SSL/TLS protocol version SSLv3 allowed by $@. | pyOpenSSL_fluent.py:6:15:6:44 | ControlFlowNode for Attribute() | call to SSL.Context | | pyOpenSSL_fluent.py:8:27:8:33 | ControlFlowNode for context | Insecure SSL/TLS protocol version TLSv1 allowed by $@. | pyOpenSSL_fluent.py:6:15:6:44 | ControlFlowNode for Attribute() | call to SSL.Context | From e522009666776c507583feb75899bb4714a4209c Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Fri, 17 Feb 2023 15:56:16 +0100 Subject: [PATCH 004/143] Python: More complex import examples We need some recursive unwinding to get all of these right --- .../import-resolution/if_then_else_refined.py | 19 +++++++++++++++++++ .../experimental/import-resolution/main.py | 5 ++++- .../experimental/import-resolution/refined.py | 2 ++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 python/ql/test/experimental/import-resolution/if_then_else_refined.py diff --git a/python/ql/test/experimental/import-resolution/if_then_else_refined.py b/python/ql/test/experimental/import-resolution/if_then_else_refined.py new file mode 100644 index 00000000000..670c7f178e9 --- /dev/null +++ b/python/ql/test/experimental/import-resolution/if_then_else_refined.py @@ -0,0 +1,19 @@ +# combination of refined and if_then_else + +from trace import * +enter(__file__) + +class SOURCE(): pass + +# definition based on "random" choice in this case it will always go the the if-branch, +# but our analysis is not able to figure this out +if eval("True"): + src = SOURCE +else: + src = SOURCE + +src.foo = 42 + +check("src", src, src, globals()) #$ prints=SOURCE + +exit(__file__) diff --git a/python/ql/test/experimental/import-resolution/main.py b/python/ql/test/experimental/import-resolution/main.py index 2a94f180388..9b0b71f9b59 100644 --- a/python/ql/test/experimental/import-resolution/main.py +++ b/python/ql/test/experimental/import-resolution/main.py @@ -95,7 +95,10 @@ check("if_then_else_defined", if_then_else_defined, "if_defined", globals()) #$ # check that refined definitions are handled correctly import refined # $ imports=refined as=refined -check("refined.SOURCE", refined.SOURCE, refined.SOURCE, globals()) #$ prints=SOURCE +check("refined.SOURCE", refined.SOURCE, refined.SOURCE, globals()) #$ MISSING: prints=SOURCE + +import if_then_else_refined # $ imports=if_then_else_refined as=if_then_else_refined +check("if_then_else_refined.src", if_then_else_refined.src, if_then_else_refined.src, globals()) #$ MISSING: prints=SOURCE exit(__file__) diff --git a/python/ql/test/experimental/import-resolution/refined.py b/python/ql/test/experimental/import-resolution/refined.py index a687ce15655..3694168c5df 100644 --- a/python/ql/test/experimental/import-resolution/refined.py +++ b/python/ql/test/experimental/import-resolution/refined.py @@ -6,6 +6,8 @@ class SOURCE(object): pass check("SOURCE", SOURCE, SOURCE, globals()) #$ prints=SOURCE SOURCE.foo = 42 +SOURCE.bar = 43 +SOURCE.baz = 44 check("SOURCE", SOURCE, SOURCE, globals()) #$ prints=SOURCE From 4a66e48dc52fc438c406cbdd565ca4f187b7bcca Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Fri, 17 Feb 2023 16:09:50 +0100 Subject: [PATCH 005/143] Python: Allow import resolution with recursive phi/refine steps --- .../new/internal/ImportResolution.qll | 23 +++++++++++-------- .../experimental/import-resolution/main.py | 4 ++-- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll index 4895feff946..c440ace2922 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll @@ -64,6 +64,19 @@ private import semmle.python.dataflow.new.internal.DataFlowPrivate * `bar` subpackage. */ module ImportResolution { + /** + * Holds if there is an ESSA step from `defFrom` to `defTo`, which should be allowed + * for import resolution. + */ + private predicate allowedEssaImportStep(EssaDefinition defFrom, EssaDefinition defTo) { + // to handle definitions guarded by if-then-else + defFrom = defTo.(PhiFunction).getAnInput() + or + // refined variable + // example: https://github.com/nvbn/thefuck/blob/ceeaeab94b5df5a4fe9d94d61e4f6b0bbea96378/thefuck/utils.py#L25-L45 + defFrom = defTo.(EssaNodeRefinement).getInput().getDefinition() + } + /** * Holds if the module `m` defines a name `name` by assigning `defn` to it. This is an * overapproximation, as `name` may not in fact be exported (e.g. by defining an `__all__` that does @@ -74,15 +87,7 @@ module ImportResolution { exists(EssaVariable v, EssaDefinition essaDef | v.getName() = name and v.getAUse() = ImportStar::getStarImported*(m).getANormalExit() and - ( - essaDef = v.getDefinition() - or - // to handle definitions guarded by if-then-else - essaDef = v.getDefinition().(PhiFunction).getAnInput() - or - // refined variable - essaDef = v.getDefinition().(EssaNodeRefinement).getInput().getDefinition() - ) + allowedEssaImportStep*(essaDef, v.getDefinition()) | defn.getNode() = essaDef.(AssignmentDefinition).getValue() or diff --git a/python/ql/test/experimental/import-resolution/main.py b/python/ql/test/experimental/import-resolution/main.py index 9b0b71f9b59..f7cba832232 100644 --- a/python/ql/test/experimental/import-resolution/main.py +++ b/python/ql/test/experimental/import-resolution/main.py @@ -95,10 +95,10 @@ check("if_then_else_defined", if_then_else_defined, "if_defined", globals()) #$ # check that refined definitions are handled correctly import refined # $ imports=refined as=refined -check("refined.SOURCE", refined.SOURCE, refined.SOURCE, globals()) #$ MISSING: prints=SOURCE +check("refined.SOURCE", refined.SOURCE, refined.SOURCE, globals()) #$ prints=SOURCE import if_then_else_refined # $ imports=if_then_else_refined as=if_then_else_refined -check("if_then_else_refined.src", if_then_else_refined.src, if_then_else_refined.src, globals()) #$ MISSING: prints=SOURCE +check("if_then_else_refined.src", if_then_else_refined.src, if_then_else_refined.src, globals()) #$ prints=SOURCE exit(__file__) From 6a5eebe89162cce170b4656b66c3fbe8d019f178 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 22 Feb 2023 12:26:01 +0100 Subject: [PATCH 006/143] Python: Add test of `module_export` --- .../import-resolution/ModuleExport.expected | 232 ++++++++++++++++++ .../import-resolution/ModuleExport.ql | 9 + 2 files changed, 241 insertions(+) create mode 100644 python/ql/test/experimental/import-resolution/ModuleExport.expected create mode 100644 python/ql/test/experimental/import-resolution/ModuleExport.ql diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.expected b/python/ql/test/experimental/import-resolution/ModuleExport.expected new file mode 100644 index 00000000000..6733a9e378a --- /dev/null +++ b/python/ql/test/experimental/import-resolution/ModuleExport.expected @@ -0,0 +1,232 @@ +| attr_clash.__init__ | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| attr_clash.__init__ | __file__ | attr_clash/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | +| attr_clash.__init__ | __file__ | attr_clash/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | +| attr_clash.__init__ | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| attr_clash.__init__ | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| attr_clash.__init__ | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| attr_clash.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| attr_clash.__init__ | clashing_attr | attr_clash/__init__.py:4:17:4:31 | ControlFlowNode for Str | +| attr_clash.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| attr_clash.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| attr_clash.__init__ | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| attr_clash.__init__ | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| attr_clash.__init__ | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| attr_clash.clashing_attr | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| attr_clash.clashing_attr | __file__ | attr_clash/clashing_attr.py:2:7:2:14 | ControlFlowNode for __file__ | +| attr_clash.clashing_attr | __file__ | attr_clash/clashing_attr.py:4:6:4:13 | ControlFlowNode for __file__ | +| attr_clash.clashing_attr | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| attr_clash.clashing_attr | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| attr_clash.clashing_attr | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| attr_clash.clashing_attr | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| attr_clash.clashing_attr | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| attr_clash.clashing_attr | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| attr_clash.clashing_attr | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| attr_clash.clashing_attr | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| attr_clash.clashing_attr | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| attr_clash.non_clashing_submodule | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| attr_clash.non_clashing_submodule | __file__ | attr_clash/non_clashing_submodule.py:2:7:2:14 | ControlFlowNode for __file__ | +| attr_clash.non_clashing_submodule | __file__ | attr_clash/non_clashing_submodule.py:4:6:4:13 | ControlFlowNode for __file__ | +| attr_clash.non_clashing_submodule | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| attr_clash.non_clashing_submodule | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| attr_clash.non_clashing_submodule | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| attr_clash.non_clashing_submodule | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| attr_clash.non_clashing_submodule | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| attr_clash.non_clashing_submodule | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| attr_clash.non_clashing_submodule | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| attr_clash.non_clashing_submodule | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| attr_clash.non_clashing_submodule | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| bar | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| bar | __file__ | bar.py:2:7:2:14 | ControlFlowNode for __file__ | +| bar | __file__ | bar.py:6:6:6:13 | ControlFlowNode for __file__ | +| bar | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| bar | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| bar | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| bar | bar_attr | bar.py:4:12:4:21 | ControlFlowNode for Str | +| bar | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| bar | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| bar | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| bar | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| bar | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| bar | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| foo | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| foo | __file__ | foo.py:2:7:2:14 | ControlFlowNode for __file__ | +| foo | __file__ | foo.py:14:6:14:13 | ControlFlowNode for __file__ | +| foo | __private_foo_attr | foo.py:8:22:8:41 | ControlFlowNode for Str | +| foo | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| foo | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| foo | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| foo | bar_reexported | foo.py:11:8:11:10 | ControlFlowNode for ImportExpr | +| foo | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| foo | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| foo | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| foo | foo_attr | foo.py:5:12:5:21 | ControlFlowNode for Str | +| foo | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| foo | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| foo | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| if_then_else | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| if_then_else | __file__ | if_then_else.py:2:7:2:14 | ControlFlowNode for __file__ | +| if_then_else | __file__ | if_then_else.py:16:6:16:13 | ControlFlowNode for __file__ | +| if_then_else | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| if_then_else | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| if_then_else | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| if_then_else | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| if_then_else | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| if_then_else | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| if_then_else | if_then_else_defined | if_then_else.py:7:28:7:39 | ControlFlowNode for Str | +| if_then_else | if_then_else_defined | if_then_else.py:12:32:12:47 | ControlFlowNode for Str | +| if_then_else | if_then_else_defined | if_then_else.py:14:32:14:47 | ControlFlowNode for Str | +| if_then_else | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| if_then_else | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| if_then_else | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| if_then_else_refined | SOURCE | if_then_else_refined.py:6:1:6:15 | ControlFlowNode for ClassExpr | +| if_then_else_refined | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| if_then_else_refined | __file__ | if_then_else_refined.py:4:7:4:14 | ControlFlowNode for __file__ | +| if_then_else_refined | __file__ | if_then_else_refined.py:19:6:19:13 | ControlFlowNode for __file__ | +| if_then_else_refined | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| if_then_else_refined | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| if_then_else_refined | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| if_then_else_refined | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| if_then_else_refined | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| if_then_else_refined | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| if_then_else_refined | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| if_then_else_refined | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| if_then_else_refined | src | if_then_else_refined.py:11:11:11:16 | ControlFlowNode for SOURCE | +| if_then_else_refined | src | if_then_else_refined.py:13:11:13:16 | ControlFlowNode for SOURCE | +| if_then_else_refined | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| main | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| main | __file__ | main.py:24:7:24:14 | ControlFlowNode for __file__ | +| main | __file__ | main.py:103:6:103:13 | ControlFlowNode for __file__ | +| main | __file__ | package/subpackage2/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | +| main | __file__ | package/subpackage2/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | +| main | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| main | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| main | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| main | aliased_subpackage | main.py:54:6:54:12 | ControlFlowNode for ImportExpr | +| main | aliased_subpackage | main.py:54:21:54:52 | ControlFlowNode for ImportMember | +| main | aliased_subpackage | main.py:65:8:65:25 | ControlFlowNode for ImportExpr | +| main | bar_attr | main.py:42:6:42:8 | ControlFlowNode for ImportExpr | +| main | bar_attr | main.py:42:17:42:24 | ControlFlowNode for ImportMember | +| main | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| main | clashing_attr | main.py:83:6:83:15 | ControlFlowNode for ImportExpr | +| main | clashing_attr | main.py:83:24:83:36 | ControlFlowNode for ImportMember | +| main | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| main | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| main | foo | main.py:27:8:27:10 | ControlFlowNode for ImportExpr | +| main | foo_alias | main.py:34:8:34:10 | ControlFlowNode for ImportExpr | +| main | if_then_else_defined | main.py:93:6:93:17 | ControlFlowNode for ImportExpr | +| main | if_then_else_defined | main.py:93:26:93:45 | ControlFlowNode for ImportMember | +| main | if_then_else_refined | main.py:100:8:100:27 | ControlFlowNode for ImportExpr | +| main | local_import | main.py:57:1:57:19 | ControlFlowNode for FunctionExpr | +| main | namespace_module_attr | main.py:79:10:79:43 | ControlFlowNode for ImportExpr | +| main | namespace_module_attr | main.py:79:52:79:72 | ControlFlowNode for ImportMember | +| main | non_clashing_submodule | main.py:83:6:83:15 | ControlFlowNode for ImportExpr | +| main | non_clashing_submodule | main.py:83:39:83:60 | ControlFlowNode for ImportMember | +| main | package | main.py:69:8:69:25 | ControlFlowNode for ImportExpr | +| main | package | main.py:73:8:73:35 | ControlFlowNode for ImportExpr | +| main | package_attr_alias | main.py:50:6:50:12 | ControlFlowNode for ImportExpr | +| main | package_attr_alias | main.py:50:21:50:54 | ControlFlowNode for ImportMember | +| main | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| main | print_function | main.py:21:6:21:15 | ControlFlowNode for ImportExpr | +| main | print_function | main.py:21:24:21:37 | ControlFlowNode for ImportMember | +| main | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| main | refined | main.py:97:8:97:14 | ControlFlowNode for ImportExpr | +| main | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| main | subpackage2_attr | package/subpackage2/__init__.py:4:20:4:37 | ControlFlowNode for Str | +| main | subpackage_attr | main.py:46:6:46:23 | ControlFlowNode for ImportExpr | +| main | subpackage_attr | main.py:46:32:46:46 | ControlFlowNode for ImportMember | +| main | sys | main.py:22:8:22:10 | ControlFlowNode for ImportExpr | +| namespace_package.namespace_module | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| namespace_package.namespace_module | __file__ | namespace_package/namespace_module.py:2:7:2:14 | ControlFlowNode for __file__ | +| namespace_package.namespace_module | __file__ | namespace_package/namespace_module.py:6:6:6:13 | ControlFlowNode for __file__ | +| namespace_package.namespace_module | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| namespace_package.namespace_module | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| namespace_package.namespace_module | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| namespace_package.namespace_module | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| namespace_package.namespace_module | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| namespace_package.namespace_module | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| namespace_package.namespace_module | namespace_module_attr | namespace_package/namespace_module.py:4:25:4:47 | ControlFlowNode for Str | +| namespace_package.namespace_module | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| namespace_package.namespace_module | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| namespace_package.namespace_module | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| package.__init__ | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| package.__init__ | __file__ | package/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | +| package.__init__ | __file__ | package/__init__.py:7:6:7:13 | ControlFlowNode for __file__ | +| package.__init__ | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| package.__init__ | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| package.__init__ | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| package.__init__ | attr_used_in_subpackage | package/__init__.py:4:27:4:51 | ControlFlowNode for Str | +| package.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| package.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| package.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| package.__init__ | package_attr | package/__init__.py:5:16:5:29 | ControlFlowNode for Str | +| package.__init__ | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| package.__init__ | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| package.__init__ | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| package.subpackage2.__init__ | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| package.subpackage2.__init__ | __file__ | package/subpackage2/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | +| package.subpackage2.__init__ | __file__ | package/subpackage2/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | +| package.subpackage2.__init__ | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| package.subpackage2.__init__ | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| package.subpackage2.__init__ | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| package.subpackage2.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| package.subpackage2.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| package.subpackage2.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| package.subpackage2.__init__ | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| package.subpackage2.__init__ | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| package.subpackage2.__init__ | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| package.subpackage2.__init__ | subpackage2_attr | package/subpackage2/__init__.py:4:20:4:37 | ControlFlowNode for Str | +| package.subpackage.__init__ | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| package.subpackage.__init__ | __file__ | package/subpackage/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | +| package.subpackage.__init__ | __file__ | package/subpackage/__init__.py:14:6:14:13 | ControlFlowNode for __file__ | +| package.subpackage.__init__ | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| package.subpackage.__init__ | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| package.subpackage.__init__ | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| package.subpackage.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| package.subpackage.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| package.subpackage.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| package.subpackage.__init__ | imported_attr | package/subpackage/__init__.py:7:6:7:7 | ControlFlowNode for ImportExpr | +| package.subpackage.__init__ | imported_attr | package/subpackage/__init__.py:7:16:7:55 | ControlFlowNode for ImportMember | +| package.subpackage.__init__ | irrelevant_attr | package/subpackage/__init__.py:11:6:11:15 | ControlFlowNode for ImportExpr | +| package.subpackage.__init__ | irrelevant_attr | package/subpackage/__init__.py:11:24:11:38 | ControlFlowNode for ImportMember | +| package.subpackage.__init__ | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| package.subpackage.__init__ | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| package.subpackage.__init__ | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| package.subpackage.__init__ | subpackage_attr | package/subpackage/__init__.py:4:19:4:35 | ControlFlowNode for Str | +| package.subpackage.submodule | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| package.subpackage.submodule | __file__ | package/subpackage/submodule.py:2:7:2:14 | ControlFlowNode for __file__ | +| package.subpackage.submodule | __file__ | package/subpackage/submodule.py:7:6:7:13 | ControlFlowNode for __file__ | +| package.subpackage.submodule | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| package.subpackage.submodule | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| package.subpackage.submodule | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| package.subpackage.submodule | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| package.subpackage.submodule | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| package.subpackage.submodule | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| package.subpackage.submodule | irrelevant_attr | package/subpackage/submodule.py:5:19:5:35 | ControlFlowNode for Str | +| package.subpackage.submodule | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| package.subpackage.submodule | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| package.subpackage.submodule | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| package.subpackage.submodule | submodule_attr | package/subpackage/submodule.py:4:18:4:33 | ControlFlowNode for Str | +| refined | SOURCE | refined.py:4:1:4:21 | ControlFlowNode for ClassExpr | +| refined | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| refined | __file__ | refined.py:2:7:2:14 | ControlFlowNode for __file__ | +| refined | __file__ | refined.py:14:6:14:13 | ControlFlowNode for __file__ | +| refined | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| refined | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| refined | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| refined | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| refined | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| refined | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| refined | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| refined | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| refined | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| trace | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| trace | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| trace | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| trace | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| trace | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| trace | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| trace | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| trace | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| trace | print_function | trace.py:1:6:1:15 | ControlFlowNode for ImportExpr | +| trace | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| trace | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.ql b/python/ql/test/experimental/import-resolution/ModuleExport.ql new file mode 100644 index 00000000000..9d45b0ec8d0 --- /dev/null +++ b/python/ql/test/experimental/import-resolution/ModuleExport.ql @@ -0,0 +1,9 @@ +import python +import semmle.python.dataflow.new.DataFlow +import semmle.python.dataflow.new.internal.ImportResolution + +from Module m, string name, DataFlow::Node defn +where + ImportResolution::module_export(m, name, defn) and + exists(m.getLocation().getFile().getRelativePath()) +select m.getName(), name, defn From 6ba39d5fb348900a09e197e8bb9c951d78e7797b Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 22 Feb 2023 14:50:42 +0100 Subject: [PATCH 007/143] Python: Add import regression for re-exported things --- .../import-resolution/ModuleExport.expected | 35 ++++++++++++++++++- .../experimental/import-resolution/baz.py | 6 ++++ .../experimental/import-resolution/main.py | 4 +++ .../import-resolution/simplistic_reexport.py | 19 ++++++++++ 4 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 python/ql/test/experimental/import-resolution/baz.py create mode 100644 python/ql/test/experimental/import-resolution/simplistic_reexport.py diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.expected b/python/ql/test/experimental/import-resolution/ModuleExport.expected index 6733a9e378a..dc633f7e707 100644 --- a/python/ql/test/experimental/import-resolution/ModuleExport.expected +++ b/python/ql/test/experimental/import-resolution/ModuleExport.expected @@ -48,6 +48,19 @@ | bar | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | | bar | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | bar | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| baz | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| baz | __file__ | baz.py:2:7:2:14 | ControlFlowNode for __file__ | +| baz | __file__ | baz.py:6:6:6:13 | ControlFlowNode for __file__ | +| baz | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| baz | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| baz | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| baz | baz_attr | baz.py:4:12:4:21 | ControlFlowNode for Str | +| baz | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| baz | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| baz | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| baz | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| baz | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| baz | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | foo | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | foo | __file__ | foo.py:2:7:2:14 | ControlFlowNode for __file__ | | foo | __file__ | foo.py:14:6:14:13 | ControlFlowNode for __file__ | @@ -95,7 +108,7 @@ | if_then_else_refined | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | main | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | main | __file__ | main.py:24:7:24:14 | ControlFlowNode for __file__ | -| main | __file__ | main.py:103:6:103:13 | ControlFlowNode for __file__ | +| main | __file__ | main.py:107:6:107:13 | ControlFlowNode for __file__ | | main | __file__ | package/subpackage2/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | | main | __file__ | package/subpackage2/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | | main | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | @@ -130,6 +143,7 @@ | main | print_function | main.py:21:24:21:37 | ControlFlowNode for ImportMember | | main | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | main | refined | main.py:97:8:97:14 | ControlFlowNode for ImportExpr | +| main | simplistic_reexport | main.py:103:8:103:26 | ControlFlowNode for ImportExpr | | main | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | main | subpackage2_attr | package/subpackage2/__init__.py:4:20:4:37 | ControlFlowNode for Str | | main | subpackage_attr | main.py:46:6:46:23 | ControlFlowNode for ImportExpr | @@ -219,6 +233,25 @@ | refined | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | | refined | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | refined | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| simplistic_reexport | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| simplistic_reexport | __file__ | baz.py:2:7:2:14 | ControlFlowNode for __file__ | +| simplistic_reexport | __file__ | baz.py:6:6:6:13 | ControlFlowNode for __file__ | +| simplistic_reexport | __file__ | simplistic_reexport.py:4:7:4:14 | ControlFlowNode for __file__ | +| simplistic_reexport | __file__ | simplistic_reexport.py:19:6:19:13 | ControlFlowNode for __file__ | +| simplistic_reexport | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| simplistic_reexport | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| simplistic_reexport | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| simplistic_reexport | bar_attr | simplistic_reexport.py:6:6:6:8 | ControlFlowNode for ImportExpr | +| simplistic_reexport | bar_attr | simplistic_reexport.py:6:17:6:24 | ControlFlowNode for ImportMember | +| simplistic_reexport | bar_attr | simplistic_reexport.py:9:12:9:24 | ControlFlowNode for Str | +| simplistic_reexport | baz_attr | baz.py:4:12:4:21 | ControlFlowNode for Str | +| simplistic_reexport | baz_attr | simplistic_reexport.py:16:12:16:24 | ControlFlowNode for Str | +| simplistic_reexport | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| simplistic_reexport | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| simplistic_reexport | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| simplistic_reexport | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| simplistic_reexport | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| simplistic_reexport | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | trace | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | trace | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | | trace | _print | trace.py:5:10:5:14 | ControlFlowNode for print | diff --git a/python/ql/test/experimental/import-resolution/baz.py b/python/ql/test/experimental/import-resolution/baz.py new file mode 100644 index 00000000000..66838a315be --- /dev/null +++ b/python/ql/test/experimental/import-resolution/baz.py @@ -0,0 +1,6 @@ +from trace import * +enter(__file__) + +baz_attr = "baz_attr" + +exit(__file__) diff --git a/python/ql/test/experimental/import-resolution/main.py b/python/ql/test/experimental/import-resolution/main.py index f7cba832232..ee777707b92 100644 --- a/python/ql/test/experimental/import-resolution/main.py +++ b/python/ql/test/experimental/import-resolution/main.py @@ -100,6 +100,10 @@ check("refined.SOURCE", refined.SOURCE, refined.SOURCE, globals()) #$ prints=SOU import if_then_else_refined # $ imports=if_then_else_refined as=if_then_else_refined check("if_then_else_refined.src", if_then_else_refined.src, if_then_else_refined.src, globals()) #$ prints=SOURCE +import simplistic_reexport # $ imports=simplistic_reexport as=simplistic_reexport +check("simplistic_reexport.bar_attr", simplistic_reexport.bar_attr, "overwritten", globals()) #$ prints=overwritten SPURIOUS: prints="" prints=bar_attr +check("simplistic_reexport.baz_attr", simplistic_reexport.baz_attr, "overwritten", globals()) #$ prints=overwritten SPURIOUS: prints=baz_attr + exit(__file__) print() diff --git a/python/ql/test/experimental/import-resolution/simplistic_reexport.py b/python/ql/test/experimental/import-resolution/simplistic_reexport.py new file mode 100644 index 00000000000..2847a8a66e0 --- /dev/null +++ b/python/ql/test/experimental/import-resolution/simplistic_reexport.py @@ -0,0 +1,19 @@ +# we might consider anything imported to also be exported, but this is not the case + +from trace import * +enter(__file__) + +from bar import bar_attr +check("bar_attr", bar_attr, "bar_attr", globals()) #$ prints=bar_attr + +bar_attr = "overwritten" +check("bar_attr", bar_attr, "overwritten", globals()) #$ prints=overwritten + + +from baz import * +check("baz_attr", baz_attr, "baz_attr", globals()) #$ MISSING: prints=baz_attr + +baz_attr = "overwritten" +check("baz_attr", baz_attr, "overwritten", globals()) #$ prints=overwritten + +exit(__file__) From 4df7dfbff65e24d20286bf1fff4a343cfde354ef Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 22 Feb 2023 14:52:35 +0100 Subject: [PATCH 008/143] Python: Don't import module as module_attr For `from import ` we would use to treat the `` (ImportExpr) as a definition of the name ``. Since this removes bad import-flow, and nothing broke, I'm guessing this was never intentional. --- .../dataflow/new/internal/ImportResolution.qll | 2 +- .../import-resolution/ModuleExport.expected | 13 ------------- .../ql/test/experimental/import-resolution/main.py | 2 +- 3 files changed, 2 insertions(+), 15 deletions(-) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll index c440ace2922..a123f05dbc4 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll @@ -95,7 +95,7 @@ module ImportResolution { ) or exists(Alias a | - defn.asExpr() = [a.getValue(), a.getValue().(ImportMember).getModule()] and + defn.asExpr() = a.getValue() and a.getAsname().(Name).getId() = name and defn.getScope() = m ) diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.expected b/python/ql/test/experimental/import-resolution/ModuleExport.expected index dc633f7e707..11cf82374d6 100644 --- a/python/ql/test/experimental/import-resolution/ModuleExport.expected +++ b/python/ql/test/experimental/import-resolution/ModuleExport.expected @@ -114,39 +114,30 @@ | main | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | | main | _print | trace.py:5:10:5:14 | ControlFlowNode for print | | main | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | -| main | aliased_subpackage | main.py:54:6:54:12 | ControlFlowNode for ImportExpr | | main | aliased_subpackage | main.py:54:21:54:52 | ControlFlowNode for ImportMember | | main | aliased_subpackage | main.py:65:8:65:25 | ControlFlowNode for ImportExpr | -| main | bar_attr | main.py:42:6:42:8 | ControlFlowNode for ImportExpr | | main | bar_attr | main.py:42:17:42:24 | ControlFlowNode for ImportMember | | main | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| main | clashing_attr | main.py:83:6:83:15 | ControlFlowNode for ImportExpr | | main | clashing_attr | main.py:83:24:83:36 | ControlFlowNode for ImportMember | | main | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | main | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | | main | foo | main.py:27:8:27:10 | ControlFlowNode for ImportExpr | | main | foo_alias | main.py:34:8:34:10 | ControlFlowNode for ImportExpr | -| main | if_then_else_defined | main.py:93:6:93:17 | ControlFlowNode for ImportExpr | | main | if_then_else_defined | main.py:93:26:93:45 | ControlFlowNode for ImportMember | | main | if_then_else_refined | main.py:100:8:100:27 | ControlFlowNode for ImportExpr | | main | local_import | main.py:57:1:57:19 | ControlFlowNode for FunctionExpr | -| main | namespace_module_attr | main.py:79:10:79:43 | ControlFlowNode for ImportExpr | | main | namespace_module_attr | main.py:79:52:79:72 | ControlFlowNode for ImportMember | -| main | non_clashing_submodule | main.py:83:6:83:15 | ControlFlowNode for ImportExpr | | main | non_clashing_submodule | main.py:83:39:83:60 | ControlFlowNode for ImportMember | | main | package | main.py:69:8:69:25 | ControlFlowNode for ImportExpr | | main | package | main.py:73:8:73:35 | ControlFlowNode for ImportExpr | -| main | package_attr_alias | main.py:50:6:50:12 | ControlFlowNode for ImportExpr | | main | package_attr_alias | main.py:50:21:50:54 | ControlFlowNode for ImportMember | | main | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| main | print_function | main.py:21:6:21:15 | ControlFlowNode for ImportExpr | | main | print_function | main.py:21:24:21:37 | ControlFlowNode for ImportMember | | main | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | main | refined | main.py:97:8:97:14 | ControlFlowNode for ImportExpr | | main | simplistic_reexport | main.py:103:8:103:26 | ControlFlowNode for ImportExpr | | main | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | main | subpackage2_attr | package/subpackage2/__init__.py:4:20:4:37 | ControlFlowNode for Str | -| main | subpackage_attr | main.py:46:6:46:23 | ControlFlowNode for ImportExpr | | main | subpackage_attr | main.py:46:32:46:46 | ControlFlowNode for ImportMember | | main | sys | main.py:22:8:22:10 | ControlFlowNode for ImportExpr | | namespace_package.namespace_module | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | @@ -198,9 +189,7 @@ | package.subpackage.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | package.subpackage.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | package.subpackage.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| package.subpackage.__init__ | imported_attr | package/subpackage/__init__.py:7:6:7:7 | ControlFlowNode for ImportExpr | | package.subpackage.__init__ | imported_attr | package/subpackage/__init__.py:7:16:7:55 | ControlFlowNode for ImportMember | -| package.subpackage.__init__ | irrelevant_attr | package/subpackage/__init__.py:11:6:11:15 | ControlFlowNode for ImportExpr | | package.subpackage.__init__ | irrelevant_attr | package/subpackage/__init__.py:11:24:11:38 | ControlFlowNode for ImportMember | | package.subpackage.__init__ | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | | package.subpackage.__init__ | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | @@ -241,7 +230,6 @@ | simplistic_reexport | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | | simplistic_reexport | _print | trace.py:5:10:5:14 | ControlFlowNode for print | | simplistic_reexport | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | -| simplistic_reexport | bar_attr | simplistic_reexport.py:6:6:6:8 | ControlFlowNode for ImportExpr | | simplistic_reexport | bar_attr | simplistic_reexport.py:6:17:6:24 | ControlFlowNode for ImportMember | | simplistic_reexport | bar_attr | simplistic_reexport.py:9:12:9:24 | ControlFlowNode for Str | | simplistic_reexport | baz_attr | baz.py:4:12:4:21 | ControlFlowNode for Str | @@ -260,6 +248,5 @@ | trace | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | trace | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | | trace | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| trace | print_function | trace.py:1:6:1:15 | ControlFlowNode for ImportExpr | | trace | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | trace | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | diff --git a/python/ql/test/experimental/import-resolution/main.py b/python/ql/test/experimental/import-resolution/main.py index ee777707b92..4e09ad6173c 100644 --- a/python/ql/test/experimental/import-resolution/main.py +++ b/python/ql/test/experimental/import-resolution/main.py @@ -101,7 +101,7 @@ import if_then_else_refined # $ imports=if_then_else_refined as=if_then_else_ref check("if_then_else_refined.src", if_then_else_refined.src, if_then_else_refined.src, globals()) #$ prints=SOURCE import simplistic_reexport # $ imports=simplistic_reexport as=simplistic_reexport -check("simplistic_reexport.bar_attr", simplistic_reexport.bar_attr, "overwritten", globals()) #$ prints=overwritten SPURIOUS: prints="" prints=bar_attr +check("simplistic_reexport.bar_attr", simplistic_reexport.bar_attr, "overwritten", globals()) #$ prints=overwritten SPURIOUS: prints=bar_attr check("simplistic_reexport.baz_attr", simplistic_reexport.baz_attr, "overwritten", globals()) #$ prints=overwritten SPURIOUS: prints=baz_attr exit(__file__) From d77ce4f3d7217e7e9c7f3469a3477fface9bbeed Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 22 Feb 2023 15:00:55 +0100 Subject: [PATCH 009/143] Python: minor rewrite of `from import *` handling --- .../python/dataflow/new/internal/ImportResolution.qll | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll index a123f05dbc4..76542363a0c 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll @@ -86,7 +86,7 @@ module ImportResolution { predicate module_export(Module m, string name, DataFlow::CfgNode defn) { exists(EssaVariable v, EssaDefinition essaDef | v.getName() = name and - v.getAUse() = ImportStar::getStarImported*(m).getANormalExit() and + v.getAUse() = m.getANormalExit() and allowedEssaImportStep*(essaDef, v.getDefinition()) | defn.getNode() = essaDef.(AssignmentDefinition).getValue() @@ -94,6 +94,10 @@ module ImportResolution { defn.getNode() = essaDef.(ArgumentRefinement).getArgument() ) or + // `from import *` + module_export(ImportStar::getStarImported+(m), name, defn) + or + // `import ` or `from import ` exists(Alias a | defn.asExpr() = a.getValue() and a.getAsname().(Name).getId() = name and From be5812cf910a568037eeebd08592b572c0c09e5b Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 22 Feb 2023 15:08:47 +0100 Subject: [PATCH 010/143] Python: `from import *` ignores `__all__` regression Notice that `has_defined_all_indirection` all have both `all_defined_bar_copy` and `all_defined_foo_copy` marked as exported, even though only `all_defined_foo_copy` is available. --- .../import-resolution/ModuleExport.expected | 71 +++++++++++++++++-- .../import-resolution/has_defined_all.py | 9 +++ .../import-resolution/has_defined_all_copy.py | 11 +++ .../has_defined_all_indirection.py | 6 ++ .../experimental/import-resolution/main.py | 42 +++++++++++ 5 files changed, 134 insertions(+), 5 deletions(-) create mode 100644 python/ql/test/experimental/import-resolution/has_defined_all.py create mode 100644 python/ql/test/experimental/import-resolution/has_defined_all_copy.py create mode 100644 python/ql/test/experimental/import-resolution/has_defined_all_indirection.py diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.expected b/python/ql/test/experimental/import-resolution/ModuleExport.expected index 11cf82374d6..e73deb80468 100644 --- a/python/ql/test/experimental/import-resolution/ModuleExport.expected +++ b/python/ql/test/experimental/import-resolution/ModuleExport.expected @@ -76,6 +76,53 @@ | foo | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | | foo | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | foo | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| has_defined_all | __all__ | has_defined_all.py:7:11:7:29 | ControlFlowNode for List | +| has_defined_all | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| has_defined_all | __file__ | has_defined_all.py:2:7:2:14 | ControlFlowNode for __file__ | +| has_defined_all | __file__ | has_defined_all.py:9:6:9:13 | ControlFlowNode for __file__ | +| has_defined_all | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| has_defined_all | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| has_defined_all | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| has_defined_all | all_defined_bar | has_defined_all.py:5:19:5:35 | ControlFlowNode for Str | +| has_defined_all | all_defined_foo | has_defined_all.py:4:19:4:35 | ControlFlowNode for Str | +| has_defined_all | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| has_defined_all | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| has_defined_all | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| has_defined_all | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| has_defined_all | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| has_defined_all | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| has_defined_all_copy | __all__ | has_defined_all_copy.py:9:11:9:34 | ControlFlowNode for List | +| has_defined_all_copy | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| has_defined_all_copy | __file__ | has_defined_all_copy.py:4:7:4:14 | ControlFlowNode for __file__ | +| has_defined_all_copy | __file__ | has_defined_all_copy.py:11:6:11:13 | ControlFlowNode for __file__ | +| has_defined_all_copy | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| has_defined_all_copy | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| has_defined_all_copy | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| has_defined_all_copy | all_defined_bar_copy | has_defined_all_copy.py:7:24:7:45 | ControlFlowNode for Str | +| has_defined_all_copy | all_defined_foo_copy | has_defined_all_copy.py:6:24:6:45 | ControlFlowNode for Str | +| has_defined_all_copy | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| has_defined_all_copy | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| has_defined_all_copy | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| has_defined_all_copy | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| has_defined_all_copy | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| has_defined_all_copy | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| has_defined_all_indirection | __all__ | has_defined_all_copy.py:9:11:9:34 | ControlFlowNode for List | +| has_defined_all_indirection | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| has_defined_all_indirection | __file__ | has_defined_all_copy.py:4:7:4:14 | ControlFlowNode for __file__ | +| has_defined_all_indirection | __file__ | has_defined_all_copy.py:11:6:11:13 | ControlFlowNode for __file__ | +| has_defined_all_indirection | __file__ | has_defined_all_indirection.py:2:7:2:14 | ControlFlowNode for __file__ | +| has_defined_all_indirection | __file__ | has_defined_all_indirection.py:6:6:6:13 | ControlFlowNode for __file__ | +| has_defined_all_indirection | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | +| has_defined_all_indirection | _print | trace.py:5:10:5:14 | ControlFlowNode for print | +| has_defined_all_indirection | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | +| has_defined_all_indirection | all_defined_bar_copy | has_defined_all_copy.py:7:24:7:45 | ControlFlowNode for Str | +| has_defined_all_indirection | all_defined_foo_copy | has_defined_all_copy.py:6:24:6:45 | ControlFlowNode for Str | +| has_defined_all_indirection | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | +| has_defined_all_indirection | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | +| has_defined_all_indirection | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | +| has_defined_all_indirection | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | +| has_defined_all_indirection | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | +| has_defined_all_indirection | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | if_then_else | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | if_then_else | __file__ | if_then_else.py:2:7:2:14 | ControlFlowNode for __file__ | | if_then_else | __file__ | if_then_else.py:16:6:16:13 | ControlFlowNode for __file__ | @@ -106,9 +153,17 @@ | if_then_else_refined | src | if_then_else_refined.py:11:11:11:16 | ControlFlowNode for SOURCE | | if_then_else_refined | src | if_then_else_refined.py:13:11:13:16 | ControlFlowNode for SOURCE | | if_then_else_refined | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | +| main | __all__ | has_defined_all.py:7:11:7:29 | ControlFlowNode for List | +| main | __all__ | has_defined_all_copy.py:9:11:9:34 | ControlFlowNode for List | | main | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | +| main | __file__ | has_defined_all.py:2:7:2:14 | ControlFlowNode for __file__ | +| main | __file__ | has_defined_all.py:9:6:9:13 | ControlFlowNode for __file__ | +| main | __file__ | has_defined_all_copy.py:4:7:4:14 | ControlFlowNode for __file__ | +| main | __file__ | has_defined_all_copy.py:11:6:11:13 | ControlFlowNode for __file__ | +| main | __file__ | has_defined_all_indirection.py:2:7:2:14 | ControlFlowNode for __file__ | +| main | __file__ | has_defined_all_indirection.py:6:6:6:13 | ControlFlowNode for __file__ | | main | __file__ | main.py:24:7:24:14 | ControlFlowNode for __file__ | -| main | __file__ | main.py:107:6:107:13 | ControlFlowNode for __file__ | +| main | __file__ | main.py:149:6:149:13 | ControlFlowNode for __file__ | | main | __file__ | package/subpackage2/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | | main | __file__ | package/subpackage2/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | | main | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | @@ -116,6 +171,10 @@ | main | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | main | aliased_subpackage | main.py:54:21:54:52 | ControlFlowNode for ImportMember | | main | aliased_subpackage | main.py:65:8:65:25 | ControlFlowNode for ImportExpr | +| main | all_defined_bar | has_defined_all.py:5:19:5:35 | ControlFlowNode for Str | +| main | all_defined_bar_copy | has_defined_all_copy.py:7:24:7:45 | ControlFlowNode for Str | +| main | all_defined_foo | has_defined_all.py:4:19:4:35 | ControlFlowNode for Str | +| main | all_defined_foo_copy | has_defined_all_copy.py:6:24:6:45 | ControlFlowNode for Str | | main | bar_attr | main.py:42:17:42:24 | ControlFlowNode for ImportMember | | main | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | main | clashing_attr | main.py:83:24:83:36 | ControlFlowNode for ImportMember | @@ -123,8 +182,10 @@ | main | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | | main | foo | main.py:27:8:27:10 | ControlFlowNode for ImportExpr | | main | foo_alias | main.py:34:8:34:10 | ControlFlowNode for ImportExpr | -| main | if_then_else_defined | main.py:93:26:93:45 | ControlFlowNode for ImportMember | -| main | if_then_else_refined | main.py:100:8:100:27 | ControlFlowNode for ImportExpr | +| main | has_defined_all | main.py:100:8:100:22 | ControlFlowNode for ImportExpr | +| main | has_defined_all_indirection | main.py:118:8:118:34 | ControlFlowNode for ImportExpr | +| main | if_then_else_defined | main.py:135:26:135:45 | ControlFlowNode for ImportMember | +| main | if_then_else_refined | main.py:142:8:142:27 | ControlFlowNode for ImportExpr | | main | local_import | main.py:57:1:57:19 | ControlFlowNode for FunctionExpr | | main | namespace_module_attr | main.py:79:52:79:72 | ControlFlowNode for ImportMember | | main | non_clashing_submodule | main.py:83:39:83:60 | ControlFlowNode for ImportMember | @@ -134,8 +195,8 @@ | main | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | | main | print_function | main.py:21:24:21:37 | ControlFlowNode for ImportMember | | main | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | -| main | refined | main.py:97:8:97:14 | ControlFlowNode for ImportExpr | -| main | simplistic_reexport | main.py:103:8:103:26 | ControlFlowNode for ImportExpr | +| main | refined | main.py:139:8:139:14 | ControlFlowNode for ImportExpr | +| main | simplistic_reexport | main.py:145:8:145:26 | ControlFlowNode for ImportExpr | | main | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | main | subpackage2_attr | package/subpackage2/__init__.py:4:20:4:37 | ControlFlowNode for Str | | main | subpackage_attr | main.py:46:32:46:46 | ControlFlowNode for ImportMember | diff --git a/python/ql/test/experimental/import-resolution/has_defined_all.py b/python/ql/test/experimental/import-resolution/has_defined_all.py new file mode 100644 index 00000000000..9716a9a2ee1 --- /dev/null +++ b/python/ql/test/experimental/import-resolution/has_defined_all.py @@ -0,0 +1,9 @@ +from trace import * +enter(__file__) + +all_defined_foo = "all_defined_foo" +all_defined_bar = "all_defined_bar" + +__all__ = ["all_defined_foo"] + +exit(__file__) diff --git a/python/ql/test/experimental/import-resolution/has_defined_all_copy.py b/python/ql/test/experimental/import-resolution/has_defined_all_copy.py new file mode 100644 index 00000000000..bfcb1eb5054 --- /dev/null +++ b/python/ql/test/experimental/import-resolution/has_defined_all_copy.py @@ -0,0 +1,11 @@ +# a copy of `has_defined_all.py` that is imported by `has_defined_all_indirection.py` +# with its' own names such that we can check both `import *` without any cross-talk +from trace import * +enter(__file__) + +all_defined_foo_copy = "all_defined_foo_copy" +all_defined_bar_copy = "all_defined_bar_copy" + +__all__ = ["all_defined_foo_copy"] + +exit(__file__) diff --git a/python/ql/test/experimental/import-resolution/has_defined_all_indirection.py b/python/ql/test/experimental/import-resolution/has_defined_all_indirection.py new file mode 100644 index 00000000000..c928205fdcb --- /dev/null +++ b/python/ql/test/experimental/import-resolution/has_defined_all_indirection.py @@ -0,0 +1,6 @@ +from trace import * +enter(__file__) + +from has_defined_all_copy import * + +exit(__file__) diff --git a/python/ql/test/experimental/import-resolution/main.py b/python/ql/test/experimental/import-resolution/main.py index 4e09ad6173c..fab3a447d64 100644 --- a/python/ql/test/experimental/import-resolution/main.py +++ b/python/ql/test/experimental/import-resolution/main.py @@ -84,6 +84,48 @@ from attr_clash import clashing_attr, non_clashing_submodule #$ imports=attr_cla check("clashing_attr", clashing_attr, "clashing_attr", globals()) #$ prints=clashing_attr SPURIOUS: prints="" check("non_clashing_submodule", non_clashing_submodule, "", globals()) #$ prints="" +# check that import * only imports the __all__ attributes +from has_defined_all import * +check("all_defined_foo", all_defined_foo, "all_defined_foo", globals()) #$ prints=all_defined_foo + +try: + check("all_defined_bar", all_defined_bar, "all_defined_bar", globals()) #$ SPURIOUS: prints=all_defined_bar + raise Exception("Did not get expected NameError") +except NameError as e: + if "all_defined_bar" in str(e): + print("Got expected NameError:", e) + else: + raise + +import has_defined_all # $ imports=has_defined_all as=has_defined_all +check("has_defined_all.all_defined_foo", has_defined_all.all_defined_foo, "all_defined_foo", globals()) #$ prints=all_defined_foo +check("has_defined_all.all_defined_bar", has_defined_all.all_defined_bar, "all_defined_bar", globals()) #$ prints=all_defined_bar + +# same check as above, but going through one level of indirection (which can make a difference) +from has_defined_all_indirection import * +check("all_defined_foo_copy", all_defined_foo_copy, "all_defined_foo_copy", globals()) #$ prints=all_defined_foo_copy + +try: + check("all_defined_bar_copy", all_defined_bar_copy, "all_defined_bar_copy", globals()) #$ SPURIOUS: prints=all_defined_bar_copy + raise Exception("Did not get expected NameError") +except NameError as e: + if "all_defined_bar_copy" in str(e): + print("Got expected NameError:", e) + else: + raise + +# same check as above, but going through one level of indirection (which can make a difference) +import has_defined_all_indirection # $ imports=has_defined_all_indirection as=has_defined_all_indirection +check("has_defined_all_indirection.all_defined_foo_copy", has_defined_all_indirection.all_defined_foo_copy, "all_defined_foo_copy", globals()) #$ prints=all_defined_foo_copy + +try: + check("has_defined_all_indirection.all_defined_bar_copy", has_defined_all_indirection.all_defined_bar_copy, "all_defined_bar_copy", globals()) #$ SPURIOUS: prints=all_defined_bar_copy + raise Exception("Did not get expected AttributeError") +except AttributeError as e: + if "all_defined_bar_copy" in str(e): + print("Got expected AttributeError:", e) + else: + raise # check that import * from an __init__ file works from package.subpackage2 import * From c8a76246d8992dade7496409fc07da6e31423e42 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 22 Feb 2023 15:33:02 +0100 Subject: [PATCH 011/143] Python: Take `__all__` into consideration for re-export of `from import *` However, we can see that `from import *` and `import pkg` are handled differently. Would have liked `has_defined_all_indirection` to behave in the same way no matter how the import was made. --- .../new/internal/ImportResolution.qll | 6 +- .../import-resolution/ModuleExport.expected | 133 ------------------ .../experimental/import-resolution/main.py | 2 +- 3 files changed, 6 insertions(+), 135 deletions(-) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll index 76542363a0c..5e0192b1553 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll @@ -95,7 +95,11 @@ module ImportResolution { ) or // `from import *` - module_export(ImportStar::getStarImported+(m), name, defn) + exists(Module importedFrom | + importedFrom = ImportStar::getStarImported(m) and + module_export(importedFrom, name, defn) and + potential_module_export(importedFrom, name) + ) or // `import ` or `from import ` exists(Alias a | diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.expected b/python/ql/test/experimental/import-resolution/ModuleExport.expected index e73deb80468..341a58e4d34 100644 --- a/python/ql/test/experimental/import-resolution/ModuleExport.expected +++ b/python/ql/test/experimental/import-resolution/ModuleExport.expected @@ -1,180 +1,93 @@ -| attr_clash.__init__ | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | attr_clash.__init__ | __file__ | attr_clash/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | | attr_clash.__init__ | __file__ | attr_clash/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | -| attr_clash.__init__ | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| attr_clash.__init__ | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| attr_clash.__init__ | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | attr_clash.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | attr_clash.__init__ | clashing_attr | attr_clash/__init__.py:4:17:4:31 | ControlFlowNode for Str | | attr_clash.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | attr_clash.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| attr_clash.__init__ | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| attr_clash.__init__ | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | attr_clash.__init__ | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | -| attr_clash.clashing_attr | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | attr_clash.clashing_attr | __file__ | attr_clash/clashing_attr.py:2:7:2:14 | ControlFlowNode for __file__ | | attr_clash.clashing_attr | __file__ | attr_clash/clashing_attr.py:4:6:4:13 | ControlFlowNode for __file__ | -| attr_clash.clashing_attr | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| attr_clash.clashing_attr | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| attr_clash.clashing_attr | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | attr_clash.clashing_attr | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | attr_clash.clashing_attr | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | attr_clash.clashing_attr | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| attr_clash.clashing_attr | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| attr_clash.clashing_attr | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | attr_clash.clashing_attr | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | -| attr_clash.non_clashing_submodule | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | attr_clash.non_clashing_submodule | __file__ | attr_clash/non_clashing_submodule.py:2:7:2:14 | ControlFlowNode for __file__ | | attr_clash.non_clashing_submodule | __file__ | attr_clash/non_clashing_submodule.py:4:6:4:13 | ControlFlowNode for __file__ | -| attr_clash.non_clashing_submodule | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| attr_clash.non_clashing_submodule | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| attr_clash.non_clashing_submodule | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | attr_clash.non_clashing_submodule | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | attr_clash.non_clashing_submodule | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | attr_clash.non_clashing_submodule | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| attr_clash.non_clashing_submodule | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| attr_clash.non_clashing_submodule | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | attr_clash.non_clashing_submodule | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | -| bar | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | bar | __file__ | bar.py:2:7:2:14 | ControlFlowNode for __file__ | | bar | __file__ | bar.py:6:6:6:13 | ControlFlowNode for __file__ | -| bar | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| bar | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| bar | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | bar | bar_attr | bar.py:4:12:4:21 | ControlFlowNode for Str | | bar | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | bar | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | bar | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| bar | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| bar | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | bar | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | -| baz | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | baz | __file__ | baz.py:2:7:2:14 | ControlFlowNode for __file__ | | baz | __file__ | baz.py:6:6:6:13 | ControlFlowNode for __file__ | -| baz | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| baz | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| baz | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | baz | baz_attr | baz.py:4:12:4:21 | ControlFlowNode for Str | | baz | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | baz | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | baz | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| baz | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| baz | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | baz | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | -| foo | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | foo | __file__ | foo.py:2:7:2:14 | ControlFlowNode for __file__ | | foo | __file__ | foo.py:14:6:14:13 | ControlFlowNode for __file__ | | foo | __private_foo_attr | foo.py:8:22:8:41 | ControlFlowNode for Str | -| foo | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| foo | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| foo | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | foo | bar_reexported | foo.py:11:8:11:10 | ControlFlowNode for ImportExpr | | foo | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | foo | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | foo | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | | foo | foo_attr | foo.py:5:12:5:21 | ControlFlowNode for Str | -| foo | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| foo | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | foo | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | has_defined_all | __all__ | has_defined_all.py:7:11:7:29 | ControlFlowNode for List | -| has_defined_all | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | has_defined_all | __file__ | has_defined_all.py:2:7:2:14 | ControlFlowNode for __file__ | | has_defined_all | __file__ | has_defined_all.py:9:6:9:13 | ControlFlowNode for __file__ | -| has_defined_all | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| has_defined_all | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| has_defined_all | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | has_defined_all | all_defined_bar | has_defined_all.py:5:19:5:35 | ControlFlowNode for Str | | has_defined_all | all_defined_foo | has_defined_all.py:4:19:4:35 | ControlFlowNode for Str | | has_defined_all | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | has_defined_all | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | has_defined_all | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| has_defined_all | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| has_defined_all | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | has_defined_all | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | has_defined_all_copy | __all__ | has_defined_all_copy.py:9:11:9:34 | ControlFlowNode for List | -| has_defined_all_copy | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | has_defined_all_copy | __file__ | has_defined_all_copy.py:4:7:4:14 | ControlFlowNode for __file__ | | has_defined_all_copy | __file__ | has_defined_all_copy.py:11:6:11:13 | ControlFlowNode for __file__ | -| has_defined_all_copy | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| has_defined_all_copy | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| has_defined_all_copy | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | has_defined_all_copy | all_defined_bar_copy | has_defined_all_copy.py:7:24:7:45 | ControlFlowNode for Str | | has_defined_all_copy | all_defined_foo_copy | has_defined_all_copy.py:6:24:6:45 | ControlFlowNode for Str | | has_defined_all_copy | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | has_defined_all_copy | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | has_defined_all_copy | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| has_defined_all_copy | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| has_defined_all_copy | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | has_defined_all_copy | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | -| has_defined_all_indirection | __all__ | has_defined_all_copy.py:9:11:9:34 | ControlFlowNode for List | -| has_defined_all_indirection | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | -| has_defined_all_indirection | __file__ | has_defined_all_copy.py:4:7:4:14 | ControlFlowNode for __file__ | -| has_defined_all_indirection | __file__ | has_defined_all_copy.py:11:6:11:13 | ControlFlowNode for __file__ | | has_defined_all_indirection | __file__ | has_defined_all_indirection.py:2:7:2:14 | ControlFlowNode for __file__ | | has_defined_all_indirection | __file__ | has_defined_all_indirection.py:6:6:6:13 | ControlFlowNode for __file__ | -| has_defined_all_indirection | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| has_defined_all_indirection | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| has_defined_all_indirection | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | -| has_defined_all_indirection | all_defined_bar_copy | has_defined_all_copy.py:7:24:7:45 | ControlFlowNode for Str | | has_defined_all_indirection | all_defined_foo_copy | has_defined_all_copy.py:6:24:6:45 | ControlFlowNode for Str | | has_defined_all_indirection | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | has_defined_all_indirection | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | has_defined_all_indirection | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| has_defined_all_indirection | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| has_defined_all_indirection | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | has_defined_all_indirection | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | -| if_then_else | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | if_then_else | __file__ | if_then_else.py:2:7:2:14 | ControlFlowNode for __file__ | | if_then_else | __file__ | if_then_else.py:16:6:16:13 | ControlFlowNode for __file__ | -| if_then_else | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| if_then_else | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| if_then_else | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | if_then_else | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | if_then_else | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | if_then_else | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | | if_then_else | if_then_else_defined | if_then_else.py:7:28:7:39 | ControlFlowNode for Str | | if_then_else | if_then_else_defined | if_then_else.py:12:32:12:47 | ControlFlowNode for Str | | if_then_else | if_then_else_defined | if_then_else.py:14:32:14:47 | ControlFlowNode for Str | -| if_then_else | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| if_then_else | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | if_then_else | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | if_then_else_refined | SOURCE | if_then_else_refined.py:6:1:6:15 | ControlFlowNode for ClassExpr | -| if_then_else_refined | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | if_then_else_refined | __file__ | if_then_else_refined.py:4:7:4:14 | ControlFlowNode for __file__ | | if_then_else_refined | __file__ | if_then_else_refined.py:19:6:19:13 | ControlFlowNode for __file__ | -| if_then_else_refined | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| if_then_else_refined | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| if_then_else_refined | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | if_then_else_refined | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | if_then_else_refined | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | if_then_else_refined | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| if_then_else_refined | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| if_then_else_refined | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | if_then_else_refined | src | if_then_else_refined.py:11:11:11:16 | ControlFlowNode for SOURCE | | if_then_else_refined | src | if_then_else_refined.py:13:11:13:16 | ControlFlowNode for SOURCE | | if_then_else_refined | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | -| main | __all__ | has_defined_all.py:7:11:7:29 | ControlFlowNode for List | -| main | __all__ | has_defined_all_copy.py:9:11:9:34 | ControlFlowNode for List | -| main | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | -| main | __file__ | has_defined_all.py:2:7:2:14 | ControlFlowNode for __file__ | -| main | __file__ | has_defined_all.py:9:6:9:13 | ControlFlowNode for __file__ | -| main | __file__ | has_defined_all_copy.py:4:7:4:14 | ControlFlowNode for __file__ | -| main | __file__ | has_defined_all_copy.py:11:6:11:13 | ControlFlowNode for __file__ | -| main | __file__ | has_defined_all_indirection.py:2:7:2:14 | ControlFlowNode for __file__ | -| main | __file__ | has_defined_all_indirection.py:6:6:6:13 | ControlFlowNode for __file__ | | main | __file__ | main.py:24:7:24:14 | ControlFlowNode for __file__ | | main | __file__ | main.py:149:6:149:13 | ControlFlowNode for __file__ | -| main | __file__ | package/subpackage2/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | -| main | __file__ | package/subpackage2/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | -| main | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| main | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| main | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | main | aliased_subpackage | main.py:54:21:54:52 | ControlFlowNode for ImportMember | | main | aliased_subpackage | main.py:65:8:65:25 | ControlFlowNode for ImportExpr | -| main | all_defined_bar | has_defined_all.py:5:19:5:35 | ControlFlowNode for Str | -| main | all_defined_bar_copy | has_defined_all_copy.py:7:24:7:45 | ControlFlowNode for Str | | main | all_defined_foo | has_defined_all.py:4:19:4:35 | ControlFlowNode for Str | -| main | all_defined_foo_copy | has_defined_all_copy.py:6:24:6:45 | ControlFlowNode for Str | | main | bar_attr | main.py:42:17:42:24 | ControlFlowNode for ImportMember | | main | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | main | clashing_attr | main.py:83:24:83:36 | ControlFlowNode for ImportMember | @@ -192,105 +105,61 @@ | main | package | main.py:69:8:69:25 | ControlFlowNode for ImportExpr | | main | package | main.py:73:8:73:35 | ControlFlowNode for ImportExpr | | main | package_attr_alias | main.py:50:21:50:54 | ControlFlowNode for ImportMember | -| main | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | | main | print_function | main.py:21:24:21:37 | ControlFlowNode for ImportMember | -| main | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | main | refined | main.py:139:8:139:14 | ControlFlowNode for ImportExpr | | main | simplistic_reexport | main.py:145:8:145:26 | ControlFlowNode for ImportExpr | | main | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | main | subpackage2_attr | package/subpackage2/__init__.py:4:20:4:37 | ControlFlowNode for Str | | main | subpackage_attr | main.py:46:32:46:46 | ControlFlowNode for ImportMember | | main | sys | main.py:22:8:22:10 | ControlFlowNode for ImportExpr | -| namespace_package.namespace_module | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | namespace_package.namespace_module | __file__ | namespace_package/namespace_module.py:2:7:2:14 | ControlFlowNode for __file__ | | namespace_package.namespace_module | __file__ | namespace_package/namespace_module.py:6:6:6:13 | ControlFlowNode for __file__ | -| namespace_package.namespace_module | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| namespace_package.namespace_module | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| namespace_package.namespace_module | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | namespace_package.namespace_module | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | namespace_package.namespace_module | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | namespace_package.namespace_module | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | | namespace_package.namespace_module | namespace_module_attr | namespace_package/namespace_module.py:4:25:4:47 | ControlFlowNode for Str | -| namespace_package.namespace_module | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| namespace_package.namespace_module | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | namespace_package.namespace_module | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | -| package.__init__ | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | package.__init__ | __file__ | package/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | | package.__init__ | __file__ | package/__init__.py:7:6:7:13 | ControlFlowNode for __file__ | -| package.__init__ | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| package.__init__ | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| package.__init__ | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | package.__init__ | attr_used_in_subpackage | package/__init__.py:4:27:4:51 | ControlFlowNode for Str | | package.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | package.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | package.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | | package.__init__ | package_attr | package/__init__.py:5:16:5:29 | ControlFlowNode for Str | -| package.__init__ | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| package.__init__ | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | package.__init__ | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | -| package.subpackage2.__init__ | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | package.subpackage2.__init__ | __file__ | package/subpackage2/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | | package.subpackage2.__init__ | __file__ | package/subpackage2/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | -| package.subpackage2.__init__ | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| package.subpackage2.__init__ | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| package.subpackage2.__init__ | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | package.subpackage2.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | package.subpackage2.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | package.subpackage2.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| package.subpackage2.__init__ | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| package.subpackage2.__init__ | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | package.subpackage2.__init__ | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | package.subpackage2.__init__ | subpackage2_attr | package/subpackage2/__init__.py:4:20:4:37 | ControlFlowNode for Str | -| package.subpackage.__init__ | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | package.subpackage.__init__ | __file__ | package/subpackage/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | | package.subpackage.__init__ | __file__ | package/subpackage/__init__.py:14:6:14:13 | ControlFlowNode for __file__ | -| package.subpackage.__init__ | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| package.subpackage.__init__ | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| package.subpackage.__init__ | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | package.subpackage.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | package.subpackage.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | package.subpackage.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | | package.subpackage.__init__ | imported_attr | package/subpackage/__init__.py:7:16:7:55 | ControlFlowNode for ImportMember | | package.subpackage.__init__ | irrelevant_attr | package/subpackage/__init__.py:11:24:11:38 | ControlFlowNode for ImportMember | -| package.subpackage.__init__ | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| package.subpackage.__init__ | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | package.subpackage.__init__ | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | package.subpackage.__init__ | subpackage_attr | package/subpackage/__init__.py:4:19:4:35 | ControlFlowNode for Str | -| package.subpackage.submodule | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | package.subpackage.submodule | __file__ | package/subpackage/submodule.py:2:7:2:14 | ControlFlowNode for __file__ | | package.subpackage.submodule | __file__ | package/subpackage/submodule.py:7:6:7:13 | ControlFlowNode for __file__ | -| package.subpackage.submodule | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| package.subpackage.submodule | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| package.subpackage.submodule | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | package.subpackage.submodule | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | package.subpackage.submodule | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | package.subpackage.submodule | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | | package.subpackage.submodule | irrelevant_attr | package/subpackage/submodule.py:5:19:5:35 | ControlFlowNode for Str | -| package.subpackage.submodule | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| package.subpackage.submodule | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | package.subpackage.submodule | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | package.subpackage.submodule | submodule_attr | package/subpackage/submodule.py:4:18:4:33 | ControlFlowNode for Str | | refined | SOURCE | refined.py:4:1:4:21 | ControlFlowNode for ClassExpr | -| refined | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | refined | __file__ | refined.py:2:7:2:14 | ControlFlowNode for __file__ | | refined | __file__ | refined.py:14:6:14:13 | ControlFlowNode for __file__ | -| refined | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| refined | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| refined | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | refined | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | refined | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | refined | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| refined | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| refined | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | refined | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | -| simplistic_reexport | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | -| simplistic_reexport | __file__ | baz.py:2:7:2:14 | ControlFlowNode for __file__ | -| simplistic_reexport | __file__ | baz.py:6:6:6:13 | ControlFlowNode for __file__ | | simplistic_reexport | __file__ | simplistic_reexport.py:4:7:4:14 | ControlFlowNode for __file__ | | simplistic_reexport | __file__ | simplistic_reexport.py:19:6:19:13 | ControlFlowNode for __file__ | -| simplistic_reexport | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| simplistic_reexport | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| simplistic_reexport | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | | simplistic_reexport | bar_attr | simplistic_reexport.py:6:17:6:24 | ControlFlowNode for ImportMember | | simplistic_reexport | bar_attr | simplistic_reexport.py:9:12:9:24 | ControlFlowNode for Str | | simplistic_reexport | baz_attr | baz.py:4:12:4:21 | ControlFlowNode for Str | @@ -298,8 +167,6 @@ | simplistic_reexport | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | simplistic_reexport | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | | simplistic_reexport | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| simplistic_reexport | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| simplistic_reexport | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | | simplistic_reexport | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | trace | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | | trace | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | diff --git a/python/ql/test/experimental/import-resolution/main.py b/python/ql/test/experimental/import-resolution/main.py index fab3a447d64..98b97fafb0e 100644 --- a/python/ql/test/experimental/import-resolution/main.py +++ b/python/ql/test/experimental/import-resolution/main.py @@ -119,7 +119,7 @@ import has_defined_all_indirection # $ imports=has_defined_all_indirection as=ha check("has_defined_all_indirection.all_defined_foo_copy", has_defined_all_indirection.all_defined_foo_copy, "all_defined_foo_copy", globals()) #$ prints=all_defined_foo_copy try: - check("has_defined_all_indirection.all_defined_bar_copy", has_defined_all_indirection.all_defined_bar_copy, "all_defined_bar_copy", globals()) #$ SPURIOUS: prints=all_defined_bar_copy + check("has_defined_all_indirection.all_defined_bar_copy", has_defined_all_indirection.all_defined_bar_copy, "all_defined_bar_copy", globals()) raise Exception("Did not get expected AttributeError") except AttributeError as e: if "all_defined_bar_copy" in str(e): From 8eaaf8e3e5aa7e24bacae7ad9df3d7727d37564e Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 22 Feb 2023 15:42:28 +0100 Subject: [PATCH 012/143] Python: Ignore `trace.py` in `ModuleExport.ql` test I guess we could have done this at the very start of introducing this test in this PR, but I think the last commit was mostly inspired from looking at all the things that evidently was re-exported from the trace import, even when I knew they were not available because of the `__all__` definition. --- .../import-resolution/ModuleExport.expected | 86 ------------------- .../import-resolution/ModuleExport.ql | 3 +- 2 files changed, 2 insertions(+), 87 deletions(-) diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.expected b/python/ql/test/experimental/import-resolution/ModuleExport.expected index 341a58e4d34..ebe5e897444 100644 --- a/python/ql/test/experimental/import-resolution/ModuleExport.expected +++ b/python/ql/test/experimental/import-resolution/ModuleExport.expected @@ -1,98 +1,51 @@ | attr_clash.__init__ | __file__ | attr_clash/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | | attr_clash.__init__ | __file__ | attr_clash/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | -| attr_clash.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | attr_clash.__init__ | clashing_attr | attr_clash/__init__.py:4:17:4:31 | ControlFlowNode for Str | -| attr_clash.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| attr_clash.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| attr_clash.__init__ | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | attr_clash.clashing_attr | __file__ | attr_clash/clashing_attr.py:2:7:2:14 | ControlFlowNode for __file__ | | attr_clash.clashing_attr | __file__ | attr_clash/clashing_attr.py:4:6:4:13 | ControlFlowNode for __file__ | -| attr_clash.clashing_attr | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| attr_clash.clashing_attr | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| attr_clash.clashing_attr | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| attr_clash.clashing_attr | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | attr_clash.non_clashing_submodule | __file__ | attr_clash/non_clashing_submodule.py:2:7:2:14 | ControlFlowNode for __file__ | | attr_clash.non_clashing_submodule | __file__ | attr_clash/non_clashing_submodule.py:4:6:4:13 | ControlFlowNode for __file__ | -| attr_clash.non_clashing_submodule | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| attr_clash.non_clashing_submodule | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| attr_clash.non_clashing_submodule | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| attr_clash.non_clashing_submodule | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | bar | __file__ | bar.py:2:7:2:14 | ControlFlowNode for __file__ | | bar | __file__ | bar.py:6:6:6:13 | ControlFlowNode for __file__ | | bar | bar_attr | bar.py:4:12:4:21 | ControlFlowNode for Str | -| bar | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| bar | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| bar | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| bar | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | baz | __file__ | baz.py:2:7:2:14 | ControlFlowNode for __file__ | | baz | __file__ | baz.py:6:6:6:13 | ControlFlowNode for __file__ | | baz | baz_attr | baz.py:4:12:4:21 | ControlFlowNode for Str | -| baz | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| baz | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| baz | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| baz | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | foo | __file__ | foo.py:2:7:2:14 | ControlFlowNode for __file__ | | foo | __file__ | foo.py:14:6:14:13 | ControlFlowNode for __file__ | | foo | __private_foo_attr | foo.py:8:22:8:41 | ControlFlowNode for Str | | foo | bar_reexported | foo.py:11:8:11:10 | ControlFlowNode for ImportExpr | -| foo | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| foo | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| foo | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | | foo | foo_attr | foo.py:5:12:5:21 | ControlFlowNode for Str | -| foo | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | has_defined_all | __all__ | has_defined_all.py:7:11:7:29 | ControlFlowNode for List | | has_defined_all | __file__ | has_defined_all.py:2:7:2:14 | ControlFlowNode for __file__ | | has_defined_all | __file__ | has_defined_all.py:9:6:9:13 | ControlFlowNode for __file__ | | has_defined_all | all_defined_bar | has_defined_all.py:5:19:5:35 | ControlFlowNode for Str | | has_defined_all | all_defined_foo | has_defined_all.py:4:19:4:35 | ControlFlowNode for Str | -| has_defined_all | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| has_defined_all | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| has_defined_all | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| has_defined_all | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | has_defined_all_copy | __all__ | has_defined_all_copy.py:9:11:9:34 | ControlFlowNode for List | | has_defined_all_copy | __file__ | has_defined_all_copy.py:4:7:4:14 | ControlFlowNode for __file__ | | has_defined_all_copy | __file__ | has_defined_all_copy.py:11:6:11:13 | ControlFlowNode for __file__ | | has_defined_all_copy | all_defined_bar_copy | has_defined_all_copy.py:7:24:7:45 | ControlFlowNode for Str | | has_defined_all_copy | all_defined_foo_copy | has_defined_all_copy.py:6:24:6:45 | ControlFlowNode for Str | -| has_defined_all_copy | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| has_defined_all_copy | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| has_defined_all_copy | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| has_defined_all_copy | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | has_defined_all_indirection | __file__ | has_defined_all_indirection.py:2:7:2:14 | ControlFlowNode for __file__ | | has_defined_all_indirection | __file__ | has_defined_all_indirection.py:6:6:6:13 | ControlFlowNode for __file__ | | has_defined_all_indirection | all_defined_foo_copy | has_defined_all_copy.py:6:24:6:45 | ControlFlowNode for Str | -| has_defined_all_indirection | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| has_defined_all_indirection | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| has_defined_all_indirection | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| has_defined_all_indirection | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | if_then_else | __file__ | if_then_else.py:2:7:2:14 | ControlFlowNode for __file__ | | if_then_else | __file__ | if_then_else.py:16:6:16:13 | ControlFlowNode for __file__ | -| if_then_else | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| if_then_else | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| if_then_else | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | | if_then_else | if_then_else_defined | if_then_else.py:7:28:7:39 | ControlFlowNode for Str | | if_then_else | if_then_else_defined | if_then_else.py:12:32:12:47 | ControlFlowNode for Str | | if_then_else | if_then_else_defined | if_then_else.py:14:32:14:47 | ControlFlowNode for Str | -| if_then_else | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | if_then_else_refined | SOURCE | if_then_else_refined.py:6:1:6:15 | ControlFlowNode for ClassExpr | | if_then_else_refined | __file__ | if_then_else_refined.py:4:7:4:14 | ControlFlowNode for __file__ | | if_then_else_refined | __file__ | if_then_else_refined.py:19:6:19:13 | ControlFlowNode for __file__ | -| if_then_else_refined | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| if_then_else_refined | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| if_then_else_refined | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | | if_then_else_refined | src | if_then_else_refined.py:11:11:11:16 | ControlFlowNode for SOURCE | | if_then_else_refined | src | if_then_else_refined.py:13:11:13:16 | ControlFlowNode for SOURCE | -| if_then_else_refined | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | main | __file__ | main.py:24:7:24:14 | ControlFlowNode for __file__ | | main | __file__ | main.py:149:6:149:13 | ControlFlowNode for __file__ | | main | aliased_subpackage | main.py:54:21:54:52 | ControlFlowNode for ImportMember | | main | aliased_subpackage | main.py:65:8:65:25 | ControlFlowNode for ImportExpr | | main | all_defined_foo | has_defined_all.py:4:19:4:35 | ControlFlowNode for Str | | main | bar_attr | main.py:42:17:42:24 | ControlFlowNode for ImportMember | -| main | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | | main | clashing_attr | main.py:83:24:83:36 | ControlFlowNode for ImportMember | -| main | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| main | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | | main | foo | main.py:27:8:27:10 | ControlFlowNode for ImportExpr | | main | foo_alias | main.py:34:8:34:10 | ControlFlowNode for ImportExpr | | main | has_defined_all | main.py:100:8:100:22 | ControlFlowNode for ImportExpr | @@ -108,73 +61,34 @@ | main | print_function | main.py:21:24:21:37 | ControlFlowNode for ImportMember | | main | refined | main.py:139:8:139:14 | ControlFlowNode for ImportExpr | | main | simplistic_reexport | main.py:145:8:145:26 | ControlFlowNode for ImportExpr | -| main | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | main | subpackage2_attr | package/subpackage2/__init__.py:4:20:4:37 | ControlFlowNode for Str | | main | subpackage_attr | main.py:46:32:46:46 | ControlFlowNode for ImportMember | | main | sys | main.py:22:8:22:10 | ControlFlowNode for ImportExpr | | namespace_package.namespace_module | __file__ | namespace_package/namespace_module.py:2:7:2:14 | ControlFlowNode for __file__ | | namespace_package.namespace_module | __file__ | namespace_package/namespace_module.py:6:6:6:13 | ControlFlowNode for __file__ | -| namespace_package.namespace_module | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| namespace_package.namespace_module | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| namespace_package.namespace_module | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | | namespace_package.namespace_module | namespace_module_attr | namespace_package/namespace_module.py:4:25:4:47 | ControlFlowNode for Str | -| namespace_package.namespace_module | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | package.__init__ | __file__ | package/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | | package.__init__ | __file__ | package/__init__.py:7:6:7:13 | ControlFlowNode for __file__ | | package.__init__ | attr_used_in_subpackage | package/__init__.py:4:27:4:51 | ControlFlowNode for Str | -| package.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| package.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| package.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | | package.__init__ | package_attr | package/__init__.py:5:16:5:29 | ControlFlowNode for Str | -| package.__init__ | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | package.subpackage2.__init__ | __file__ | package/subpackage2/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | | package.subpackage2.__init__ | __file__ | package/subpackage2/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | -| package.subpackage2.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| package.subpackage2.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| package.subpackage2.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| package.subpackage2.__init__ | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | package.subpackage2.__init__ | subpackage2_attr | package/subpackage2/__init__.py:4:20:4:37 | ControlFlowNode for Str | | package.subpackage.__init__ | __file__ | package/subpackage/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | | package.subpackage.__init__ | __file__ | package/subpackage/__init__.py:14:6:14:13 | ControlFlowNode for __file__ | -| package.subpackage.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| package.subpackage.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| package.subpackage.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | | package.subpackage.__init__ | imported_attr | package/subpackage/__init__.py:7:16:7:55 | ControlFlowNode for ImportMember | | package.subpackage.__init__ | irrelevant_attr | package/subpackage/__init__.py:11:24:11:38 | ControlFlowNode for ImportMember | -| package.subpackage.__init__ | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | package.subpackage.__init__ | subpackage_attr | package/subpackage/__init__.py:4:19:4:35 | ControlFlowNode for Str | | package.subpackage.submodule | __file__ | package/subpackage/submodule.py:2:7:2:14 | ControlFlowNode for __file__ | | package.subpackage.submodule | __file__ | package/subpackage/submodule.py:7:6:7:13 | ControlFlowNode for __file__ | -| package.subpackage.submodule | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| package.subpackage.submodule | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| package.subpackage.submodule | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | | package.subpackage.submodule | irrelevant_attr | package/subpackage/submodule.py:5:19:5:35 | ControlFlowNode for Str | -| package.subpackage.submodule | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | package.subpackage.submodule | submodule_attr | package/subpackage/submodule.py:4:18:4:33 | ControlFlowNode for Str | | refined | SOURCE | refined.py:4:1:4:21 | ControlFlowNode for ClassExpr | | refined | __file__ | refined.py:2:7:2:14 | ControlFlowNode for __file__ | | refined | __file__ | refined.py:14:6:14:13 | ControlFlowNode for __file__ | -| refined | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| refined | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| refined | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| refined | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | | simplistic_reexport | __file__ | simplistic_reexport.py:4:7:4:14 | ControlFlowNode for __file__ | | simplistic_reexport | __file__ | simplistic_reexport.py:19:6:19:13 | ControlFlowNode for __file__ | | simplistic_reexport | bar_attr | simplistic_reexport.py:6:17:6:24 | ControlFlowNode for ImportMember | | simplistic_reexport | bar_attr | simplistic_reexport.py:9:12:9:24 | ControlFlowNode for Str | | simplistic_reexport | baz_attr | baz.py:4:12:4:21 | ControlFlowNode for Str | | simplistic_reexport | baz_attr | simplistic_reexport.py:16:12:16:24 | ControlFlowNode for Str | -| simplistic_reexport | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| simplistic_reexport | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| simplistic_reexport | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| simplistic_reexport | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | -| trace | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List | -| trace | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral | -| trace | _print | trace.py:5:10:5:14 | ControlFlowNode for print | -| trace | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral | -| trace | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr | -| trace | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr | -| trace | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr | -| trace | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr | -| trace | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember | -| trace | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr | diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.ql b/python/ql/test/experimental/import-resolution/ModuleExport.ql index 9d45b0ec8d0..c4f0f7af7d8 100644 --- a/python/ql/test/experimental/import-resolution/ModuleExport.ql +++ b/python/ql/test/experimental/import-resolution/ModuleExport.ql @@ -5,5 +5,6 @@ import semmle.python.dataflow.new.internal.ImportResolution from Module m, string name, DataFlow::Node defn where ImportResolution::module_export(m, name, defn) and - exists(m.getLocation().getFile().getRelativePath()) + exists(m.getLocation().getFile().getRelativePath()) and + not defn.getScope() = any(Module trace | trace.getName() = "trace") select m.getName(), name, defn From 321a4b4ef20111f6962f231ee66b8a8c4e52a08e Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 22 Feb 2023 16:32:53 +0100 Subject: [PATCH 013/143] Python: `ModuleExport.ql` test: ignore `main.py` It's not very useful to look at, and it's a mess when you change any tests to see all the changes lines in the expected output that you really do not care about! --- .../import-resolution/ModuleExport.expected | 25 ------------------- .../import-resolution/ModuleExport.ql | 3 ++- 2 files changed, 2 insertions(+), 26 deletions(-) diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.expected b/python/ql/test/experimental/import-resolution/ModuleExport.expected index ebe5e897444..c1a1a6d2c35 100644 --- a/python/ql/test/experimental/import-resolution/ModuleExport.expected +++ b/python/ql/test/experimental/import-resolution/ModuleExport.expected @@ -39,31 +39,6 @@ | if_then_else_refined | __file__ | if_then_else_refined.py:19:6:19:13 | ControlFlowNode for __file__ | | if_then_else_refined | src | if_then_else_refined.py:11:11:11:16 | ControlFlowNode for SOURCE | | if_then_else_refined | src | if_then_else_refined.py:13:11:13:16 | ControlFlowNode for SOURCE | -| main | __file__ | main.py:24:7:24:14 | ControlFlowNode for __file__ | -| main | __file__ | main.py:149:6:149:13 | ControlFlowNode for __file__ | -| main | aliased_subpackage | main.py:54:21:54:52 | ControlFlowNode for ImportMember | -| main | aliased_subpackage | main.py:65:8:65:25 | ControlFlowNode for ImportExpr | -| main | all_defined_foo | has_defined_all.py:4:19:4:35 | ControlFlowNode for Str | -| main | bar_attr | main.py:42:17:42:24 | ControlFlowNode for ImportMember | -| main | clashing_attr | main.py:83:24:83:36 | ControlFlowNode for ImportMember | -| main | foo | main.py:27:8:27:10 | ControlFlowNode for ImportExpr | -| main | foo_alias | main.py:34:8:34:10 | ControlFlowNode for ImportExpr | -| main | has_defined_all | main.py:100:8:100:22 | ControlFlowNode for ImportExpr | -| main | has_defined_all_indirection | main.py:118:8:118:34 | ControlFlowNode for ImportExpr | -| main | if_then_else_defined | main.py:135:26:135:45 | ControlFlowNode for ImportMember | -| main | if_then_else_refined | main.py:142:8:142:27 | ControlFlowNode for ImportExpr | -| main | local_import | main.py:57:1:57:19 | ControlFlowNode for FunctionExpr | -| main | namespace_module_attr | main.py:79:52:79:72 | ControlFlowNode for ImportMember | -| main | non_clashing_submodule | main.py:83:39:83:60 | ControlFlowNode for ImportMember | -| main | package | main.py:69:8:69:25 | ControlFlowNode for ImportExpr | -| main | package | main.py:73:8:73:35 | ControlFlowNode for ImportExpr | -| main | package_attr_alias | main.py:50:21:50:54 | ControlFlowNode for ImportMember | -| main | print_function | main.py:21:24:21:37 | ControlFlowNode for ImportMember | -| main | refined | main.py:139:8:139:14 | ControlFlowNode for ImportExpr | -| main | simplistic_reexport | main.py:145:8:145:26 | ControlFlowNode for ImportExpr | -| main | subpackage2_attr | package/subpackage2/__init__.py:4:20:4:37 | ControlFlowNode for Str | -| main | subpackage_attr | main.py:46:32:46:46 | ControlFlowNode for ImportMember | -| main | sys | main.py:22:8:22:10 | ControlFlowNode for ImportExpr | | namespace_package.namespace_module | __file__ | namespace_package/namespace_module.py:2:7:2:14 | ControlFlowNode for __file__ | | namespace_package.namespace_module | __file__ | namespace_package/namespace_module.py:6:6:6:13 | ControlFlowNode for __file__ | | namespace_package.namespace_module | namespace_module_attr | namespace_package/namespace_module.py:4:25:4:47 | ControlFlowNode for Str | diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.ql b/python/ql/test/experimental/import-resolution/ModuleExport.ql index c4f0f7af7d8..4b84527573e 100644 --- a/python/ql/test/experimental/import-resolution/ModuleExport.ql +++ b/python/ql/test/experimental/import-resolution/ModuleExport.ql @@ -6,5 +6,6 @@ from Module m, string name, DataFlow::Node defn where ImportResolution::module_export(m, name, defn) and exists(m.getLocation().getFile().getRelativePath()) and - not defn.getScope() = any(Module trace | trace.getName() = "trace") + not defn.getScope() = any(Module trace | trace.getName() = "trace") and + not m.getName() = "main" select m.getName(), name, defn From bea0acb497f4ac9426c17508380f1b7bfea393ef Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Thu, 23 Feb 2023 00:22:01 +0100 Subject: [PATCH 014/143] Python: Add barrier test to import resolution Just like the one added for `py/insecure-protocol` in fb425b7, but instead added in the import-resolution tests, such that we don't have to remember it's in a completely different directory. --- .../import-resolution/ModuleExport.expected | 3 +++ .../import-resolution/block_flow_check.py | 14 ++++++++++++++ .../experimental/import-resolution/importflow.ql | 4 ++++ .../ql/test/experimental/import-resolution/main.py | 4 ++++ 4 files changed, 25 insertions(+) create mode 100644 python/ql/test/experimental/import-resolution/block_flow_check.py diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.expected b/python/ql/test/experimental/import-resolution/ModuleExport.expected index c1a1a6d2c35..abfa29d0f58 100644 --- a/python/ql/test/experimental/import-resolution/ModuleExport.expected +++ b/python/ql/test/experimental/import-resolution/ModuleExport.expected @@ -11,6 +11,9 @@ | baz | __file__ | baz.py:2:7:2:14 | ControlFlowNode for __file__ | | baz | __file__ | baz.py:6:6:6:13 | ControlFlowNode for __file__ | | baz | baz_attr | baz.py:4:12:4:21 | ControlFlowNode for Str | +| block_flow_check | SOURCE | block_flow_check.py:4:1:4:21 | ControlFlowNode for ClassExpr | +| block_flow_check | __file__ | block_flow_check.py:2:7:2:14 | ControlFlowNode for __file__ | +| block_flow_check | __file__ | block_flow_check.py:14:6:14:13 | ControlFlowNode for __file__ | | foo | __file__ | foo.py:2:7:2:14 | ControlFlowNode for __file__ | | foo | __file__ | foo.py:14:6:14:13 | ControlFlowNode for __file__ | | foo | __private_foo_attr | foo.py:8:22:8:41 | ControlFlowNode for Str | diff --git a/python/ql/test/experimental/import-resolution/block_flow_check.py b/python/ql/test/experimental/import-resolution/block_flow_check.py new file mode 100644 index 00000000000..cd939b037e6 --- /dev/null +++ b/python/ql/test/experimental/import-resolution/block_flow_check.py @@ -0,0 +1,14 @@ +from trace import * +enter(__file__) + +class SOURCE(object): + @staticmethod + def block_flow(): pass + +check("SOURCE", SOURCE, SOURCE, globals()) #$ prints=SOURCE + +SOURCE.block_flow() + +check("SOURCE", SOURCE, SOURCE, globals()) + +exit(__file__) diff --git a/python/ql/test/experimental/import-resolution/importflow.ql b/python/ql/test/experimental/import-resolution/importflow.ql index 94f5e4b0ec8..afb2278d1c5 100644 --- a/python/ql/test/experimental/import-resolution/importflow.ql +++ b/python/ql/test/experimental/import-resolution/importflow.ql @@ -66,6 +66,10 @@ private class ImportConfiguration extends DataFlow::Configuration { override predicate isSink(DataFlow::Node sink) { sink = API::moduleImport("trace").getMember("check").getACall().getArg(1) } + + override predicate isBarrier(DataFlow::Node node) { + exists(DataFlow::MethodCallNode call | call.calls(node, "block_flow")) + } } class ResolutionTest extends InlineExpectationsTest { diff --git a/python/ql/test/experimental/import-resolution/main.py b/python/ql/test/experimental/import-resolution/main.py index 98b97fafb0e..31a4f60d56d 100644 --- a/python/ql/test/experimental/import-resolution/main.py +++ b/python/ql/test/experimental/import-resolution/main.py @@ -146,6 +146,10 @@ import simplistic_reexport # $ imports=simplistic_reexport as=simplistic_reexpor check("simplistic_reexport.bar_attr", simplistic_reexport.bar_attr, "overwritten", globals()) #$ prints=overwritten SPURIOUS: prints=bar_attr check("simplistic_reexport.baz_attr", simplistic_reexport.baz_attr, "overwritten", globals()) #$ prints=overwritten SPURIOUS: prints=baz_attr +# check that we don't treat all assignments as being exports +import block_flow_check #$ imports=block_flow_check as=block_flow_check +check("block_flow_check.SOURCE", block_flow_check.SOURCE, block_flow_check.SOURCE, globals()) #$ SPURIOUS: prints=SOURCE + exit(__file__) print() From 97fefd2545d64dc07eeda5081804999c8cff0af9 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 22 Feb 2023 16:04:03 +0100 Subject: [PATCH 015/143] Python: Attempt to fix import flow It's nice that it fixes the `InsecureProtocol` test-case (which maybe should have been a test-case for the import resolution library in the first place?) But it's not quite right: 1. it adds spurious flow for `clashing_attr` 2. it runs into huge problems for typetracking_imports/tracked.expected 3. it runs into the problem for https://github.com/github/codeql/pull/10176 with an `from import *` blocking flow from previously defined variable, that is NOT overridden. (simplistic_reexport.bar_attr) --- .../new/internal/ImportResolution.qll | 59 ++++-- .../typetracking_imports/tracked.expected | 19 ++ .../import-resolution/ModuleExport.expected | 194 ++++++++++++------ .../experimental/import-resolution/main.py | 6 +- .../InsecureProtocol.expected | 3 - 5 files changed, 192 insertions(+), 89 deletions(-) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll index 5e0192b1553..5090ba8fcd3 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll @@ -78,34 +78,63 @@ module ImportResolution { } /** - * Holds if the module `m` defines a name `name` by assigning `defn` to it. This is an - * overapproximation, as `name` may not in fact be exported (e.g. by defining an `__all__` that does - * not include `name`). + * Holds if the module `m` defines a name `name` with the value `val`. The value + * represents the value `name` will have at the end of the module (the last place we + * have def-use flow to). + * + * Note: The handling of re-exporting imports is a bit simplistic. We assume that if + * an import is made, it will be re-exported (which will not be the case if a new + * value is assigned to the name, or it is deleted). */ pragma[nomagic] - predicate module_export(Module m, string name, DataFlow::CfgNode defn) { - exists(EssaVariable v, EssaDefinition essaDef | - v.getName() = name and - v.getAUse() = m.getANormalExit() and - allowedEssaImportStep*(essaDef, v.getDefinition()) + predicate module_export(Module m, string name, DataFlow::Node val) { + // Definitions made inside `m` itself + // + // for code such as `foo = ...; foo.bar = ...` there will be TWO + // EssaDefinition/EssaVariable. One for `foo = ...` (AssignmentDefinition) and one + // for `foo.bar = ...`. The one for `foo.bar = ...` (EssaNodeRefinement). The + // EssaNodeRefinement is the one that will reach the end of the module (normal + // exit). + // + // However, we cannot just use the EssaNodeRefinement as the `val`, because the + // normal data-flow depends on use-use flow, and use-use flow targets CFG nodes not + // EssaNodes. So we need to go back from the EssaDefinition/EssaVariable that + // reaches the end of the module, to the first definition of the variable, and then + // track forwards using use-use flow to find a suitable CFG node that has flow into + // it from use-use flow. + exists(EssaVariable lastUseVar, EssaVariable firstDef | + lastUseVar.getName() = name and + // we ignore special variable $ introduced by our analysis (not used for anything) + // we ignore special variable * introduced by `from import *` -- TODO: understand why we even have this? + not name in ["$", "*"] and + lastUseVar.getAUse() = m.getANormalExit() and + allowedEssaImportStep*(firstDef, lastUseVar) and + not allowedEssaImportStep(_, firstDef) | - defn.getNode() = essaDef.(AssignmentDefinition).getValue() + not EssaFlow::defToFirstUse(firstDef, _) and + val.asVar() = firstDef or - defn.getNode() = essaDef.(ArgumentRefinement).getArgument() + exists(ControlFlowNode mid, ControlFlowNode end | + EssaFlow::defToFirstUse(firstDef, mid) and + EssaFlow::useToNextUse*(mid, end) and + not EssaFlow::useToNextUse(end, _) and + lastUseVar.getAUse() = end and + val.asCfgNode() = end + ) ) or - // `from import *` + // re-exports from `from import *` exists(Module importedFrom | importedFrom = ImportStar::getStarImported(m) and - module_export(importedFrom, name, defn) and + module_export(importedFrom, name, val) and potential_module_export(importedFrom, name) ) or - // `import ` or `from import ` + // re-exports from `import ` or `from import ` exists(Alias a | - defn.asExpr() = a.getValue() and + val.asExpr() = a.getValue() and a.getAsname().(Name).getId() = name and - defn.getScope() = m + val.getScope() = m ) } diff --git a/python/ql/test/experimental/dataflow/typetracking_imports/tracked.expected b/python/ql/test/experimental/dataflow/typetracking_imports/tracked.expected index e69de29bb2d..546325a8645 100644 --- a/python/ql/test/experimental/dataflow/typetracking_imports/tracked.expected +++ b/python/ql/test/experimental/dataflow/typetracking_imports/tracked.expected @@ -0,0 +1,19 @@ +| pkg/alias_only_direct.py:1:26:1:36 | Comment # $ tracked | Missing result:tracked= | +| pkg/alias_problem.py:1:26:1:36 | Comment # $ tracked | Missing result:tracked= | +| pkg/alias_problem_fixed.py:3:26:3:36 | Comment # $ tracked | Missing result:tracked= | +| pkg/problem_absolute_import.py:1:29:1:39 | Comment # $ tracked | Missing result:tracked= | +| pkg/use.py:2:30:2:40 | Comment # $ tracked | Missing result:tracked= | +| pkg/use.py:3:16:3:26 | Comment # $ tracked | Missing result:tracked= | +| pkg/use.py:9:36:9:46 | Comment # $ tracked | Missing result:tracked= | +| pkg/use.py:10:16:10:26 | Comment # $ tracked | Missing result:tracked= | +| pkg/use.py:16:42:16:52 | Comment # $ tracked | Missing result:tracked= | +| pkg/use.py:17:16:17:26 | Comment # $ tracked | Missing result:tracked= | +| pkg/use.py:23:33:23:43 | Comment # $ tracked | Missing result:tracked= | +| pkg/use.py:24:16:24:26 | Comment # $ tracked | Missing result:tracked= | +| pkg/use.py:30:40:30:50 | Comment # $ tracked | Missing result:tracked= | +| pkg/use.py:31:16:31:26 | Comment # $ tracked | Missing result:tracked= | +| pkg/use.py:37:49:37:59 | Comment # $ tracked | Missing result:tracked= | +| pkg/use.py:38:16:38:26 | Comment # $ tracked | Missing result:tracked= | +| pkg/use.py:43:47:43:57 | Comment # $ tracked | Missing result:tracked= | +| pkg/use.py:44:16:44:26 | Comment # $ tracked | Missing result:tracked= | +| pkg/works_absolute_import.py:2:29:2:39 | Comment # $ tracked | Missing result:tracked= | diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.expected b/python/ql/test/experimental/import-resolution/ModuleExport.expected index abfa29d0f58..ad2dffde65b 100644 --- a/python/ql/test/experimental/import-resolution/ModuleExport.expected +++ b/python/ql/test/experimental/import-resolution/ModuleExport.expected @@ -1,72 +1,130 @@ -| attr_clash.__init__ | __file__ | attr_clash/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | -| attr_clash.__init__ | __file__ | attr_clash/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | -| attr_clash.__init__ | clashing_attr | attr_clash/__init__.py:4:17:4:31 | ControlFlowNode for Str | -| attr_clash.clashing_attr | __file__ | attr_clash/clashing_attr.py:2:7:2:14 | ControlFlowNode for __file__ | -| attr_clash.clashing_attr | __file__ | attr_clash/clashing_attr.py:4:6:4:13 | ControlFlowNode for __file__ | -| attr_clash.non_clashing_submodule | __file__ | attr_clash/non_clashing_submodule.py:2:7:2:14 | ControlFlowNode for __file__ | -| attr_clash.non_clashing_submodule | __file__ | attr_clash/non_clashing_submodule.py:4:6:4:13 | ControlFlowNode for __file__ | -| bar | __file__ | bar.py:2:7:2:14 | ControlFlowNode for __file__ | -| bar | __file__ | bar.py:6:6:6:13 | ControlFlowNode for __file__ | -| bar | bar_attr | bar.py:4:12:4:21 | ControlFlowNode for Str | -| baz | __file__ | baz.py:2:7:2:14 | ControlFlowNode for __file__ | -| baz | __file__ | baz.py:6:6:6:13 | ControlFlowNode for __file__ | -| baz | baz_attr | baz.py:4:12:4:21 | ControlFlowNode for Str | -| block_flow_check | SOURCE | block_flow_check.py:4:1:4:21 | ControlFlowNode for ClassExpr | -| block_flow_check | __file__ | block_flow_check.py:2:7:2:14 | ControlFlowNode for __file__ | -| block_flow_check | __file__ | block_flow_check.py:14:6:14:13 | ControlFlowNode for __file__ | -| foo | __file__ | foo.py:2:7:2:14 | ControlFlowNode for __file__ | -| foo | __file__ | foo.py:14:6:14:13 | ControlFlowNode for __file__ | -| foo | __private_foo_attr | foo.py:8:22:8:41 | ControlFlowNode for Str | +| attr_clash.__init__ | __name__ | attr_clash/__init__.py:0:0:0:0 | GSSA Variable __name__ | +| attr_clash.__init__ | __package__ | attr_clash/__init__.py:0:0:0:0 | GSSA Variable __package__ | +| attr_clash.__init__ | clashing_attr | attr_clash/__init__.py:4:1:4:13 | GSSA Variable clashing_attr | +| attr_clash.__init__ | enter | attr_clash/__init__.py:2:1:2:5 | ControlFlowNode for enter | +| attr_clash.__init__ | exit | attr_clash/__init__.py:6:1:6:4 | ControlFlowNode for exit | +| attr_clash.clashing_attr | __name__ | attr_clash/clashing_attr.py:0:0:0:0 | GSSA Variable __name__ | +| attr_clash.clashing_attr | __package__ | attr_clash/clashing_attr.py:0:0:0:0 | GSSA Variable __package__ | +| attr_clash.clashing_attr | enter | attr_clash/clashing_attr.py:2:1:2:5 | ControlFlowNode for enter | +| attr_clash.clashing_attr | exit | attr_clash/clashing_attr.py:4:1:4:4 | ControlFlowNode for exit | +| attr_clash.non_clashing_submodule | __name__ | attr_clash/non_clashing_submodule.py:0:0:0:0 | GSSA Variable __name__ | +| attr_clash.non_clashing_submodule | __package__ | attr_clash/non_clashing_submodule.py:0:0:0:0 | GSSA Variable __package__ | +| attr_clash.non_clashing_submodule | enter | attr_clash/non_clashing_submodule.py:2:1:2:5 | ControlFlowNode for enter | +| attr_clash.non_clashing_submodule | exit | attr_clash/non_clashing_submodule.py:4:1:4:4 | ControlFlowNode for exit | +| bar | __name__ | bar.py:0:0:0:0 | GSSA Variable __name__ | +| bar | __package__ | bar.py:0:0:0:0 | GSSA Variable __package__ | +| bar | bar_attr | bar.py:4:1:4:8 | GSSA Variable bar_attr | +| bar | enter | bar.py:2:1:2:5 | ControlFlowNode for enter | +| bar | exit | bar.py:6:1:6:4 | ControlFlowNode for exit | +| baz | __name__ | baz.py:0:0:0:0 | GSSA Variable __name__ | +| baz | __package__ | baz.py:0:0:0:0 | GSSA Variable __package__ | +| baz | baz_attr | baz.py:4:1:4:8 | GSSA Variable baz_attr | +| baz | enter | baz.py:2:1:2:5 | ControlFlowNode for enter | +| baz | exit | baz.py:6:1:6:4 | ControlFlowNode for exit | +| block_flow_check | SOURCE | block_flow_check.py:12:25:12:30 | ControlFlowNode for SOURCE | +| block_flow_check | __name__ | block_flow_check.py:0:0:0:0 | GSSA Variable __name__ | +| block_flow_check | __package__ | block_flow_check.py:0:0:0:0 | GSSA Variable __package__ | +| block_flow_check | check | block_flow_check.py:12:1:12:5 | ControlFlowNode for check | +| block_flow_check | enter | block_flow_check.py:2:1:2:5 | ControlFlowNode for enter | +| block_flow_check | exit | block_flow_check.py:14:1:14:4 | ControlFlowNode for exit | +| block_flow_check | globals | block_flow_check.py:12:33:12:39 | ControlFlowNode for globals | +| block_flow_check | object | block_flow_check.py:4:14:4:19 | ControlFlowNode for object | +| block_flow_check | staticmethod | block_flow_check.py:0:0:0:0 | GSSA Variable staticmethod | +| foo | __name__ | foo.py:0:0:0:0 | GSSA Variable __name__ | +| foo | __package__ | foo.py:0:0:0:0 | GSSA Variable __package__ | +| foo | __private_foo_attr | foo.py:8:1:8:18 | GSSA Variable __private_foo_attr | | foo | bar_reexported | foo.py:11:8:11:10 | ControlFlowNode for ImportExpr | -| foo | foo_attr | foo.py:5:12:5:21 | ControlFlowNode for Str | -| has_defined_all | __all__ | has_defined_all.py:7:11:7:29 | ControlFlowNode for List | -| has_defined_all | __file__ | has_defined_all.py:2:7:2:14 | ControlFlowNode for __file__ | -| has_defined_all | __file__ | has_defined_all.py:9:6:9:13 | ControlFlowNode for __file__ | -| has_defined_all | all_defined_bar | has_defined_all.py:5:19:5:35 | ControlFlowNode for Str | -| has_defined_all | all_defined_foo | has_defined_all.py:4:19:4:35 | ControlFlowNode for Str | -| has_defined_all_copy | __all__ | has_defined_all_copy.py:9:11:9:34 | ControlFlowNode for List | -| has_defined_all_copy | __file__ | has_defined_all_copy.py:4:7:4:14 | ControlFlowNode for __file__ | -| has_defined_all_copy | __file__ | has_defined_all_copy.py:11:6:11:13 | ControlFlowNode for __file__ | -| has_defined_all_copy | all_defined_bar_copy | has_defined_all_copy.py:7:24:7:45 | ControlFlowNode for Str | -| has_defined_all_copy | all_defined_foo_copy | has_defined_all_copy.py:6:24:6:45 | ControlFlowNode for Str | -| has_defined_all_indirection | __file__ | has_defined_all_indirection.py:2:7:2:14 | ControlFlowNode for __file__ | -| has_defined_all_indirection | __file__ | has_defined_all_indirection.py:6:6:6:13 | ControlFlowNode for __file__ | -| has_defined_all_indirection | all_defined_foo_copy | has_defined_all_copy.py:6:24:6:45 | ControlFlowNode for Str | -| if_then_else | __file__ | if_then_else.py:2:7:2:14 | ControlFlowNode for __file__ | -| if_then_else | __file__ | if_then_else.py:16:6:16:13 | ControlFlowNode for __file__ | -| if_then_else | if_then_else_defined | if_then_else.py:7:28:7:39 | ControlFlowNode for Str | -| if_then_else | if_then_else_defined | if_then_else.py:12:32:12:47 | ControlFlowNode for Str | -| if_then_else | if_then_else_defined | if_then_else.py:14:32:14:47 | ControlFlowNode for Str | -| if_then_else_refined | SOURCE | if_then_else_refined.py:6:1:6:15 | ControlFlowNode for ClassExpr | -| if_then_else_refined | __file__ | if_then_else_refined.py:4:7:4:14 | ControlFlowNode for __file__ | -| if_then_else_refined | __file__ | if_then_else_refined.py:19:6:19:13 | ControlFlowNode for __file__ | -| if_then_else_refined | src | if_then_else_refined.py:11:11:11:16 | ControlFlowNode for SOURCE | -| if_then_else_refined | src | if_then_else_refined.py:13:11:13:16 | ControlFlowNode for SOURCE | -| namespace_package.namespace_module | __file__ | namespace_package/namespace_module.py:2:7:2:14 | ControlFlowNode for __file__ | -| namespace_package.namespace_module | __file__ | namespace_package/namespace_module.py:6:6:6:13 | ControlFlowNode for __file__ | -| namespace_package.namespace_module | namespace_module_attr | namespace_package/namespace_module.py:4:25:4:47 | ControlFlowNode for Str | -| package.__init__ | __file__ | package/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | -| package.__init__ | __file__ | package/__init__.py:7:6:7:13 | ControlFlowNode for __file__ | -| package.__init__ | attr_used_in_subpackage | package/__init__.py:4:27:4:51 | ControlFlowNode for Str | -| package.__init__ | package_attr | package/__init__.py:5:16:5:29 | ControlFlowNode for Str | -| package.subpackage2.__init__ | __file__ | package/subpackage2/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | -| package.subpackage2.__init__ | __file__ | package/subpackage2/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | -| package.subpackage2.__init__ | subpackage2_attr | package/subpackage2/__init__.py:4:20:4:37 | ControlFlowNode for Str | -| package.subpackage.__init__ | __file__ | package/subpackage/__init__.py:2:7:2:14 | ControlFlowNode for __file__ | -| package.subpackage.__init__ | __file__ | package/subpackage/__init__.py:14:6:14:13 | ControlFlowNode for __file__ | +| foo | bar_reexported | foo.py:12:34:12:47 | ControlFlowNode for bar_reexported | +| foo | check | foo.py:12:1:12:5 | ControlFlowNode for check | +| foo | enter | foo.py:2:1:2:5 | ControlFlowNode for enter | +| foo | exit | foo.py:14:1:14:4 | ControlFlowNode for exit | +| foo | foo_attr | foo.py:5:1:5:8 | GSSA Variable foo_attr | +| foo | globals | foo.py:12:71:12:77 | ControlFlowNode for globals | +| has_defined_all | __all__ | has_defined_all.py:7:1:7:7 | GSSA Variable __all__ | +| has_defined_all | __name__ | has_defined_all.py:0:0:0:0 | GSSA Variable __name__ | +| has_defined_all | __package__ | has_defined_all.py:0:0:0:0 | GSSA Variable __package__ | +| has_defined_all | all_defined_bar | has_defined_all.py:5:1:5:15 | GSSA Variable all_defined_bar | +| has_defined_all | all_defined_foo | has_defined_all.py:4:1:4:15 | GSSA Variable all_defined_foo | +| has_defined_all | enter | has_defined_all.py:2:1:2:5 | ControlFlowNode for enter | +| has_defined_all | exit | has_defined_all.py:9:1:9:4 | ControlFlowNode for exit | +| has_defined_all_copy | __all__ | has_defined_all_copy.py:9:1:9:7 | GSSA Variable __all__ | +| has_defined_all_copy | __name__ | has_defined_all_copy.py:0:0:0:0 | GSSA Variable __name__ | +| has_defined_all_copy | __package__ | has_defined_all_copy.py:0:0:0:0 | GSSA Variable __package__ | +| has_defined_all_copy | all_defined_bar_copy | has_defined_all_copy.py:7:1:7:20 | GSSA Variable all_defined_bar_copy | +| has_defined_all_copy | all_defined_foo_copy | has_defined_all_copy.py:6:1:6:20 | GSSA Variable all_defined_foo_copy | +| has_defined_all_copy | enter | has_defined_all_copy.py:4:1:4:5 | ControlFlowNode for enter | +| has_defined_all_copy | exit | has_defined_all_copy.py:11:1:11:4 | ControlFlowNode for exit | +| has_defined_all_indirection | __name__ | has_defined_all_indirection.py:0:0:0:0 | GSSA Variable __name__ | +| has_defined_all_indirection | __package__ | has_defined_all_indirection.py:0:0:0:0 | GSSA Variable __package__ | +| has_defined_all_indirection | all_defined_foo_copy | has_defined_all_copy.py:6:1:6:20 | GSSA Variable all_defined_foo_copy | +| has_defined_all_indirection | exit | has_defined_all_indirection.py:6:1:6:4 | ControlFlowNode for exit | +| if_then_else | __name__ | if_then_else.py:0:0:0:0 | GSSA Variable __name__ | +| if_then_else | __package__ | if_then_else.py:0:0:0:0 | GSSA Variable __package__ | +| if_then_else | enter | if_then_else.py:2:1:2:5 | ControlFlowNode for enter | +| if_then_else | eval | if_then_else.py:11:8:11:11 | ControlFlowNode for eval | +| if_then_else | exit | if_then_else.py:16:1:16:4 | ControlFlowNode for exit | +| if_then_else | if_then_else_defined | if_then_else.py:7:5:7:24 | GSSA Variable if_then_else_defined | +| if_then_else | if_then_else_defined | if_then_else.py:12:9:12:28 | GSSA Variable if_then_else_defined | +| if_then_else | if_then_else_defined | if_then_else.py:14:9:14:28 | GSSA Variable if_then_else_defined | +| if_then_else_refined | SOURCE | if_then_else_refined.py:11:11:11:16 | ControlFlowNode for SOURCE | +| if_then_else_refined | SOURCE | if_then_else_refined.py:13:11:13:16 | ControlFlowNode for SOURCE | +| if_then_else_refined | __name__ | if_then_else_refined.py:0:0:0:0 | GSSA Variable __name__ | +| if_then_else_refined | __package__ | if_then_else_refined.py:0:0:0:0 | GSSA Variable __package__ | +| if_then_else_refined | check | if_then_else_refined.py:17:1:17:5 | ControlFlowNode for check | +| if_then_else_refined | enter | if_then_else_refined.py:4:1:4:5 | ControlFlowNode for enter | +| if_then_else_refined | eval | if_then_else_refined.py:10:4:10:7 | ControlFlowNode for eval | +| if_then_else_refined | exit | if_then_else_refined.py:19:1:19:4 | ControlFlowNode for exit | +| if_then_else_refined | globals | if_then_else_refined.py:17:24:17:30 | ControlFlowNode for globals | +| if_then_else_refined | src | if_then_else_refined.py:17:19:17:21 | ControlFlowNode for src | +| namespace_package.namespace_module | __name__ | namespace_package/namespace_module.py:0:0:0:0 | GSSA Variable __name__ | +| namespace_package.namespace_module | __package__ | namespace_package/namespace_module.py:0:0:0:0 | GSSA Variable __package__ | +| namespace_package.namespace_module | enter | namespace_package/namespace_module.py:2:1:2:5 | ControlFlowNode for enter | +| namespace_package.namespace_module | exit | namespace_package/namespace_module.py:6:1:6:4 | ControlFlowNode for exit | +| namespace_package.namespace_module | namespace_module_attr | namespace_package/namespace_module.py:4:1:4:21 | GSSA Variable namespace_module_attr | +| package.__init__ | __name__ | package/__init__.py:0:0:0:0 | GSSA Variable __name__ | +| package.__init__ | __package__ | package/__init__.py:0:0:0:0 | GSSA Variable __package__ | +| package.__init__ | attr_used_in_subpackage | package/__init__.py:4:1:4:23 | GSSA Variable attr_used_in_subpackage | +| package.__init__ | enter | package/__init__.py:2:1:2:5 | ControlFlowNode for enter | +| package.__init__ | exit | package/__init__.py:7:1:7:4 | ControlFlowNode for exit | +| package.__init__ | package_attr | package/__init__.py:5:1:5:12 | GSSA Variable package_attr | +| package.subpackage2.__init__ | __name__ | package/subpackage2/__init__.py:0:0:0:0 | GSSA Variable __name__ | +| package.subpackage2.__init__ | __package__ | package/subpackage2/__init__.py:0:0:0:0 | GSSA Variable __package__ | +| package.subpackage2.__init__ | enter | package/subpackage2/__init__.py:2:1:2:5 | ControlFlowNode for enter | +| package.subpackage2.__init__ | exit | package/subpackage2/__init__.py:6:1:6:4 | ControlFlowNode for exit | +| package.subpackage2.__init__ | subpackage2_attr | package/subpackage2/__init__.py:4:1:4:16 | GSSA Variable subpackage2_attr | +| package.subpackage.__init__ | __name__ | package/subpackage/__init__.py:0:0:0:0 | GSSA Variable __name__ | +| package.subpackage.__init__ | __package__ | package/subpackage/__init__.py:0:0:0:0 | GSSA Variable __package__ | +| package.subpackage.__init__ | check | package/subpackage/__init__.py:12:1:12:5 | ControlFlowNode for check | +| package.subpackage.__init__ | enter | package/subpackage/__init__.py:2:1:2:5 | ControlFlowNode for enter | +| package.subpackage.__init__ | exit | package/subpackage/__init__.py:14:1:14:4 | ControlFlowNode for exit | +| package.subpackage.__init__ | globals | package/subpackage/__init__.py:12:79:12:85 | ControlFlowNode for globals | | package.subpackage.__init__ | imported_attr | package/subpackage/__init__.py:7:16:7:55 | ControlFlowNode for ImportMember | +| package.subpackage.__init__ | imported_attr | package/subpackage/__init__.py:8:24:8:36 | ControlFlowNode for imported_attr | | package.subpackage.__init__ | irrelevant_attr | package/subpackage/__init__.py:11:24:11:38 | ControlFlowNode for ImportMember | -| package.subpackage.__init__ | subpackage_attr | package/subpackage/__init__.py:4:19:4:35 | ControlFlowNode for Str | -| package.subpackage.submodule | __file__ | package/subpackage/submodule.py:2:7:2:14 | ControlFlowNode for __file__ | -| package.subpackage.submodule | __file__ | package/subpackage/submodule.py:7:6:7:13 | ControlFlowNode for __file__ | -| package.subpackage.submodule | irrelevant_attr | package/subpackage/submodule.py:5:19:5:35 | ControlFlowNode for Str | -| package.subpackage.submodule | submodule_attr | package/subpackage/submodule.py:4:18:4:33 | ControlFlowNode for Str | -| refined | SOURCE | refined.py:4:1:4:21 | ControlFlowNode for ClassExpr | -| refined | __file__ | refined.py:2:7:2:14 | ControlFlowNode for __file__ | -| refined | __file__ | refined.py:14:6:14:13 | ControlFlowNode for __file__ | -| simplistic_reexport | __file__ | simplistic_reexport.py:4:7:4:14 | ControlFlowNode for __file__ | -| simplistic_reexport | __file__ | simplistic_reexport.py:19:6:19:13 | ControlFlowNode for __file__ | +| package.subpackage.__init__ | irrelevant_attr | package/subpackage/__init__.py:11:24:11:38 | GSSA Variable irrelevant_attr | +| package.subpackage.__init__ | submodule | package/subpackage/__init__.py:12:35:12:43 | ControlFlowNode for submodule | +| package.subpackage.__init__ | subpackage_attr | package/subpackage/__init__.py:4:1:4:15 | GSSA Variable subpackage_attr | +| package.subpackage.submodule | __name__ | package/subpackage/submodule.py:0:0:0:0 | GSSA Variable __name__ | +| package.subpackage.submodule | __package__ | package/subpackage/submodule.py:0:0:0:0 | GSSA Variable __package__ | +| package.subpackage.submodule | enter | package/subpackage/submodule.py:2:1:2:5 | ControlFlowNode for enter | +| package.subpackage.submodule | exit | package/subpackage/submodule.py:7:1:7:4 | ControlFlowNode for exit | +| package.subpackage.submodule | irrelevant_attr | package/subpackage/submodule.py:5:1:5:15 | GSSA Variable irrelevant_attr | +| package.subpackage.submodule | submodule_attr | package/subpackage/submodule.py:4:1:4:14 | GSSA Variable submodule_attr | +| refined | SOURCE | refined.py:12:25:12:30 | ControlFlowNode for SOURCE | +| refined | __name__ | refined.py:0:0:0:0 | GSSA Variable __name__ | +| refined | __package__ | refined.py:0:0:0:0 | GSSA Variable __package__ | +| refined | check | refined.py:12:1:12:5 | ControlFlowNode for check | +| refined | enter | refined.py:2:1:2:5 | ControlFlowNode for enter | +| refined | exit | refined.py:14:1:14:4 | ControlFlowNode for exit | +| refined | globals | refined.py:12:33:12:39 | ControlFlowNode for globals | +| refined | object | refined.py:4:14:4:19 | ControlFlowNode for object | +| simplistic_reexport | __name__ | simplistic_reexport.py:0:0:0:0 | GSSA Variable __name__ | +| simplistic_reexport | __package__ | simplistic_reexport.py:0:0:0:0 | GSSA Variable __package__ | | simplistic_reexport | bar_attr | simplistic_reexport.py:6:17:6:24 | ControlFlowNode for ImportMember | -| simplistic_reexport | bar_attr | simplistic_reexport.py:9:12:9:24 | ControlFlowNode for Str | -| simplistic_reexport | baz_attr | baz.py:4:12:4:21 | ControlFlowNode for Str | -| simplistic_reexport | baz_attr | simplistic_reexport.py:16:12:16:24 | ControlFlowNode for Str | +| simplistic_reexport | baz_attr | baz.py:4:1:4:8 | GSSA Variable baz_attr | +| simplistic_reexport | baz_attr | simplistic_reexport.py:17:19:17:26 | ControlFlowNode for baz_attr | +| simplistic_reexport | check | simplistic_reexport.py:17:1:17:5 | ControlFlowNode for check | +| simplistic_reexport | enter | baz.py:2:1:2:5 | ControlFlowNode for enter | +| simplistic_reexport | exit | baz.py:6:1:6:4 | ControlFlowNode for exit | +| simplistic_reexport | exit | simplistic_reexport.py:19:1:19:4 | ControlFlowNode for exit | +| simplistic_reexport | globals | simplistic_reexport.py:17:44:17:50 | ControlFlowNode for globals | diff --git a/python/ql/test/experimental/import-resolution/main.py b/python/ql/test/experimental/import-resolution/main.py index 31a4f60d56d..4d868437964 100644 --- a/python/ql/test/experimental/import-resolution/main.py +++ b/python/ql/test/experimental/import-resolution/main.py @@ -81,7 +81,7 @@ if sys.version_info[0] == 3: from attr_clash import clashing_attr, non_clashing_submodule #$ imports=attr_clash.clashing_attr as=clashing_attr imports=attr_clash.non_clashing_submodule as=non_clashing_submodule -check("clashing_attr", clashing_attr, "clashing_attr", globals()) #$ prints=clashing_attr SPURIOUS: prints="" +check("clashing_attr", clashing_attr, "clashing_attr", globals()) #$ prints=clashing_attr SPURIOUS: prints="" SPURIOUS: prints="" SPURIOUS: prints="" check("non_clashing_submodule", non_clashing_submodule, "", globals()) #$ prints="" # check that import * only imports the __all__ attributes @@ -143,12 +143,12 @@ import if_then_else_refined # $ imports=if_then_else_refined as=if_then_else_ref check("if_then_else_refined.src", if_then_else_refined.src, if_then_else_refined.src, globals()) #$ prints=SOURCE import simplistic_reexport # $ imports=simplistic_reexport as=simplistic_reexport -check("simplistic_reexport.bar_attr", simplistic_reexport.bar_attr, "overwritten", globals()) #$ prints=overwritten SPURIOUS: prints=bar_attr +check("simplistic_reexport.bar_attr", simplistic_reexport.bar_attr, "overwritten", globals()) #$ MISSING: prints=overwritten SPURIOUS: prints=bar_attr check("simplistic_reexport.baz_attr", simplistic_reexport.baz_attr, "overwritten", globals()) #$ prints=overwritten SPURIOUS: prints=baz_attr # check that we don't treat all assignments as being exports import block_flow_check #$ imports=block_flow_check as=block_flow_check -check("block_flow_check.SOURCE", block_flow_check.SOURCE, block_flow_check.SOURCE, globals()) #$ SPURIOUS: prints=SOURCE +check("block_flow_check.SOURCE", block_flow_check.SOURCE, block_flow_check.SOURCE, globals()) exit(__file__) diff --git a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected index cc0d620aa1c..f85319fee6f 100644 --- a/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected +++ b/python/ql/test/query-tests/Security/CWE-327-InsecureProtocol/InsecureProtocol.expected @@ -13,11 +13,8 @@ | import_all_one_file.py:25:14:25:45 | ControlFlowNode for copy_completely_insecure_context | Insecure SSL/TLS protocol version TLSv1 allowed by $@. | import_all_one_file.py:9:36:9:67 | ControlFlowNode for Attribute() | call to ssl.SSLContext | | import_all_one_file.py:25:14:25:45 | ControlFlowNode for copy_completely_insecure_context | Insecure SSL/TLS protocol version TLSv1_1 allowed by $@. | import_all_one_file.py:9:36:9:67 | ControlFlowNode for Attribute() | call to ssl.SSLContext | | import_all_one_file.py:29:14:29:39 | ControlFlowNode for copy_also_insecure_context | Insecure SSL/TLS protocol version TLSv1_1 allowed by $@. | import_all_one_file.py:12:30:12:61 | ControlFlowNode for Attribute() | call to ssl.SSLContext | -| import_use.py:9:14:9:27 | ControlFlowNode for secure_context | Insecure SSL/TLS protocol version TLSv1 allowed by $@. | import_def.py:3:18:3:49 | ControlFlowNode for Attribute() | call to ssl.SSLContext | -| import_use.py:9:14:9:27 | ControlFlowNode for secure_context | Insecure SSL/TLS protocol version TLSv1_1 allowed by $@. | import_def.py:3:18:3:49 | ControlFlowNode for Attribute() | call to ssl.SSLContext | | import_use.py:13:14:13:40 | ControlFlowNode for completely_insecure_context | Insecure SSL/TLS protocol version TLSv1 allowed by $@. | import_def.py:7:31:7:62 | ControlFlowNode for Attribute() | call to ssl.SSLContext | | import_use.py:13:14:13:40 | ControlFlowNode for completely_insecure_context | Insecure SSL/TLS protocol version TLSv1_1 allowed by $@. | import_def.py:7:31:7:62 | ControlFlowNode for Attribute() | call to ssl.SSLContext | -| import_use.py:17:14:17:34 | ControlFlowNode for also_insecure_context | Insecure SSL/TLS protocol version TLSv1 allowed by $@. | import_def.py:10:25:10:56 | ControlFlowNode for Attribute() | call to ssl.SSLContext | | import_use.py:17:14:17:34 | ControlFlowNode for also_insecure_context | Insecure SSL/TLS protocol version TLSv1_1 allowed by $@. | import_def.py:10:25:10:56 | ControlFlowNode for Attribute() | call to ssl.SSLContext | | pyOpenSSL_fluent.py:8:27:8:33 | ControlFlowNode for context | Insecure SSL/TLS protocol version SSLv2 allowed by $@. | pyOpenSSL_fluent.py:6:15:6:44 | ControlFlowNode for Attribute() | call to SSL.Context | | pyOpenSSL_fluent.py:8:27:8:33 | ControlFlowNode for context | Insecure SSL/TLS protocol version SSLv3 allowed by $@. | pyOpenSSL_fluent.py:6:15:6:44 | ControlFlowNode for Attribute() | call to SSL.Context | From 373907265b9f7d5438445fd3caa3f81071338080 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 22 Feb 2023 16:12:19 +0100 Subject: [PATCH 016/143] Python: Fixed most problems from last commit That one line was an afterthought, and certainly did not work as intended. --- .../new/internal/ImportResolution.qll | 1 - .../typetracking_imports/tracked.expected | 19 ---------------- .../import-resolution/ModuleExport.expected | 22 +++++++++++++++++++ .../experimental/import-resolution/main.py | 2 +- 4 files changed, 23 insertions(+), 21 deletions(-) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll index 5090ba8fcd3..74ee1b83142 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll @@ -118,7 +118,6 @@ module ImportResolution { EssaFlow::defToFirstUse(firstDef, mid) and EssaFlow::useToNextUse*(mid, end) and not EssaFlow::useToNextUse(end, _) and - lastUseVar.getAUse() = end and val.asCfgNode() = end ) ) diff --git a/python/ql/test/experimental/dataflow/typetracking_imports/tracked.expected b/python/ql/test/experimental/dataflow/typetracking_imports/tracked.expected index 546325a8645..e69de29bb2d 100644 --- a/python/ql/test/experimental/dataflow/typetracking_imports/tracked.expected +++ b/python/ql/test/experimental/dataflow/typetracking_imports/tracked.expected @@ -1,19 +0,0 @@ -| pkg/alias_only_direct.py:1:26:1:36 | Comment # $ tracked | Missing result:tracked= | -| pkg/alias_problem.py:1:26:1:36 | Comment # $ tracked | Missing result:tracked= | -| pkg/alias_problem_fixed.py:3:26:3:36 | Comment # $ tracked | Missing result:tracked= | -| pkg/problem_absolute_import.py:1:29:1:39 | Comment # $ tracked | Missing result:tracked= | -| pkg/use.py:2:30:2:40 | Comment # $ tracked | Missing result:tracked= | -| pkg/use.py:3:16:3:26 | Comment # $ tracked | Missing result:tracked= | -| pkg/use.py:9:36:9:46 | Comment # $ tracked | Missing result:tracked= | -| pkg/use.py:10:16:10:26 | Comment # $ tracked | Missing result:tracked= | -| pkg/use.py:16:42:16:52 | Comment # $ tracked | Missing result:tracked= | -| pkg/use.py:17:16:17:26 | Comment # $ tracked | Missing result:tracked= | -| pkg/use.py:23:33:23:43 | Comment # $ tracked | Missing result:tracked= | -| pkg/use.py:24:16:24:26 | Comment # $ tracked | Missing result:tracked= | -| pkg/use.py:30:40:30:50 | Comment # $ tracked | Missing result:tracked= | -| pkg/use.py:31:16:31:26 | Comment # $ tracked | Missing result:tracked= | -| pkg/use.py:37:49:37:59 | Comment # $ tracked | Missing result:tracked= | -| pkg/use.py:38:16:38:26 | Comment # $ tracked | Missing result:tracked= | -| pkg/use.py:43:47:43:57 | Comment # $ tracked | Missing result:tracked= | -| pkg/use.py:44:16:44:26 | Comment # $ tracked | Missing result:tracked= | -| pkg/works_absolute_import.py:2:29:2:39 | Comment # $ tracked | Missing result:tracked= | diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.expected b/python/ql/test/experimental/import-resolution/ModuleExport.expected index ad2dffde65b..30d1fd5369d 100644 --- a/python/ql/test/experimental/import-resolution/ModuleExport.expected +++ b/python/ql/test/experimental/import-resolution/ModuleExport.expected @@ -1,27 +1,33 @@ +| attr_clash.__init__ | __file__ | attr_clash/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | | attr_clash.__init__ | __name__ | attr_clash/__init__.py:0:0:0:0 | GSSA Variable __name__ | | attr_clash.__init__ | __package__ | attr_clash/__init__.py:0:0:0:0 | GSSA Variable __package__ | | attr_clash.__init__ | clashing_attr | attr_clash/__init__.py:4:1:4:13 | GSSA Variable clashing_attr | | attr_clash.__init__ | enter | attr_clash/__init__.py:2:1:2:5 | ControlFlowNode for enter | | attr_clash.__init__ | exit | attr_clash/__init__.py:6:1:6:4 | ControlFlowNode for exit | +| attr_clash.clashing_attr | __file__ | attr_clash/clashing_attr.py:4:6:4:13 | ControlFlowNode for __file__ | | attr_clash.clashing_attr | __name__ | attr_clash/clashing_attr.py:0:0:0:0 | GSSA Variable __name__ | | attr_clash.clashing_attr | __package__ | attr_clash/clashing_attr.py:0:0:0:0 | GSSA Variable __package__ | | attr_clash.clashing_attr | enter | attr_clash/clashing_attr.py:2:1:2:5 | ControlFlowNode for enter | | attr_clash.clashing_attr | exit | attr_clash/clashing_attr.py:4:1:4:4 | ControlFlowNode for exit | +| attr_clash.non_clashing_submodule | __file__ | attr_clash/non_clashing_submodule.py:4:6:4:13 | ControlFlowNode for __file__ | | attr_clash.non_clashing_submodule | __name__ | attr_clash/non_clashing_submodule.py:0:0:0:0 | GSSA Variable __name__ | | attr_clash.non_clashing_submodule | __package__ | attr_clash/non_clashing_submodule.py:0:0:0:0 | GSSA Variable __package__ | | attr_clash.non_clashing_submodule | enter | attr_clash/non_clashing_submodule.py:2:1:2:5 | ControlFlowNode for enter | | attr_clash.non_clashing_submodule | exit | attr_clash/non_clashing_submodule.py:4:1:4:4 | ControlFlowNode for exit | +| bar | __file__ | bar.py:6:6:6:13 | ControlFlowNode for __file__ | | bar | __name__ | bar.py:0:0:0:0 | GSSA Variable __name__ | | bar | __package__ | bar.py:0:0:0:0 | GSSA Variable __package__ | | bar | bar_attr | bar.py:4:1:4:8 | GSSA Variable bar_attr | | bar | enter | bar.py:2:1:2:5 | ControlFlowNode for enter | | bar | exit | bar.py:6:1:6:4 | ControlFlowNode for exit | +| baz | __file__ | baz.py:6:6:6:13 | ControlFlowNode for __file__ | | baz | __name__ | baz.py:0:0:0:0 | GSSA Variable __name__ | | baz | __package__ | baz.py:0:0:0:0 | GSSA Variable __package__ | | baz | baz_attr | baz.py:4:1:4:8 | GSSA Variable baz_attr | | baz | enter | baz.py:2:1:2:5 | ControlFlowNode for enter | | baz | exit | baz.py:6:1:6:4 | ControlFlowNode for exit | | block_flow_check | SOURCE | block_flow_check.py:12:25:12:30 | ControlFlowNode for SOURCE | +| block_flow_check | __file__ | block_flow_check.py:14:6:14:13 | ControlFlowNode for __file__ | | block_flow_check | __name__ | block_flow_check.py:0:0:0:0 | GSSA Variable __name__ | | block_flow_check | __package__ | block_flow_check.py:0:0:0:0 | GSSA Variable __package__ | | block_flow_check | check | block_flow_check.py:12:1:12:5 | ControlFlowNode for check | @@ -30,6 +36,7 @@ | block_flow_check | globals | block_flow_check.py:12:33:12:39 | ControlFlowNode for globals | | block_flow_check | object | block_flow_check.py:4:14:4:19 | ControlFlowNode for object | | block_flow_check | staticmethod | block_flow_check.py:0:0:0:0 | GSSA Variable staticmethod | +| foo | __file__ | foo.py:14:6:14:13 | ControlFlowNode for __file__ | | foo | __name__ | foo.py:0:0:0:0 | GSSA Variable __name__ | | foo | __package__ | foo.py:0:0:0:0 | GSSA Variable __package__ | | foo | __private_foo_attr | foo.py:8:1:8:18 | GSSA Variable __private_foo_attr | @@ -41,6 +48,7 @@ | foo | foo_attr | foo.py:5:1:5:8 | GSSA Variable foo_attr | | foo | globals | foo.py:12:71:12:77 | ControlFlowNode for globals | | has_defined_all | __all__ | has_defined_all.py:7:1:7:7 | GSSA Variable __all__ | +| has_defined_all | __file__ | has_defined_all.py:9:6:9:13 | ControlFlowNode for __file__ | | has_defined_all | __name__ | has_defined_all.py:0:0:0:0 | GSSA Variable __name__ | | has_defined_all | __package__ | has_defined_all.py:0:0:0:0 | GSSA Variable __package__ | | has_defined_all | all_defined_bar | has_defined_all.py:5:1:5:15 | GSSA Variable all_defined_bar | @@ -48,16 +56,20 @@ | has_defined_all | enter | has_defined_all.py:2:1:2:5 | ControlFlowNode for enter | | has_defined_all | exit | has_defined_all.py:9:1:9:4 | ControlFlowNode for exit | | has_defined_all_copy | __all__ | has_defined_all_copy.py:9:1:9:7 | GSSA Variable __all__ | +| has_defined_all_copy | __file__ | has_defined_all_copy.py:11:6:11:13 | ControlFlowNode for __file__ | | has_defined_all_copy | __name__ | has_defined_all_copy.py:0:0:0:0 | GSSA Variable __name__ | | has_defined_all_copy | __package__ | has_defined_all_copy.py:0:0:0:0 | GSSA Variable __package__ | | has_defined_all_copy | all_defined_bar_copy | has_defined_all_copy.py:7:1:7:20 | GSSA Variable all_defined_bar_copy | | has_defined_all_copy | all_defined_foo_copy | has_defined_all_copy.py:6:1:6:20 | GSSA Variable all_defined_foo_copy | | has_defined_all_copy | enter | has_defined_all_copy.py:4:1:4:5 | ControlFlowNode for enter | | has_defined_all_copy | exit | has_defined_all_copy.py:11:1:11:4 | ControlFlowNode for exit | +| has_defined_all_indirection | __file__ | has_defined_all_indirection.py:6:6:6:13 | ControlFlowNode for __file__ | | has_defined_all_indirection | __name__ | has_defined_all_indirection.py:0:0:0:0 | GSSA Variable __name__ | | has_defined_all_indirection | __package__ | has_defined_all_indirection.py:0:0:0:0 | GSSA Variable __package__ | | has_defined_all_indirection | all_defined_foo_copy | has_defined_all_copy.py:6:1:6:20 | GSSA Variable all_defined_foo_copy | +| has_defined_all_indirection | enter | has_defined_all_indirection.py:2:1:2:5 | ControlFlowNode for enter | | has_defined_all_indirection | exit | has_defined_all_indirection.py:6:1:6:4 | ControlFlowNode for exit | +| if_then_else | __file__ | if_then_else.py:16:6:16:13 | ControlFlowNode for __file__ | | if_then_else | __name__ | if_then_else.py:0:0:0:0 | GSSA Variable __name__ | | if_then_else | __package__ | if_then_else.py:0:0:0:0 | GSSA Variable __package__ | | if_then_else | enter | if_then_else.py:2:1:2:5 | ControlFlowNode for enter | @@ -68,6 +80,7 @@ | if_then_else | if_then_else_defined | if_then_else.py:14:9:14:28 | GSSA Variable if_then_else_defined | | if_then_else_refined | SOURCE | if_then_else_refined.py:11:11:11:16 | ControlFlowNode for SOURCE | | if_then_else_refined | SOURCE | if_then_else_refined.py:13:11:13:16 | ControlFlowNode for SOURCE | +| if_then_else_refined | __file__ | if_then_else_refined.py:19:6:19:13 | ControlFlowNode for __file__ | | if_then_else_refined | __name__ | if_then_else_refined.py:0:0:0:0 | GSSA Variable __name__ | | if_then_else_refined | __package__ | if_then_else_refined.py:0:0:0:0 | GSSA Variable __package__ | | if_then_else_refined | check | if_then_else_refined.py:17:1:17:5 | ControlFlowNode for check | @@ -76,22 +89,26 @@ | if_then_else_refined | exit | if_then_else_refined.py:19:1:19:4 | ControlFlowNode for exit | | if_then_else_refined | globals | if_then_else_refined.py:17:24:17:30 | ControlFlowNode for globals | | if_then_else_refined | src | if_then_else_refined.py:17:19:17:21 | ControlFlowNode for src | +| namespace_package.namespace_module | __file__ | namespace_package/namespace_module.py:6:6:6:13 | ControlFlowNode for __file__ | | namespace_package.namespace_module | __name__ | namespace_package/namespace_module.py:0:0:0:0 | GSSA Variable __name__ | | namespace_package.namespace_module | __package__ | namespace_package/namespace_module.py:0:0:0:0 | GSSA Variable __package__ | | namespace_package.namespace_module | enter | namespace_package/namespace_module.py:2:1:2:5 | ControlFlowNode for enter | | namespace_package.namespace_module | exit | namespace_package/namespace_module.py:6:1:6:4 | ControlFlowNode for exit | | namespace_package.namespace_module | namespace_module_attr | namespace_package/namespace_module.py:4:1:4:21 | GSSA Variable namespace_module_attr | +| package.__init__ | __file__ | package/__init__.py:7:6:7:13 | ControlFlowNode for __file__ | | package.__init__ | __name__ | package/__init__.py:0:0:0:0 | GSSA Variable __name__ | | package.__init__ | __package__ | package/__init__.py:0:0:0:0 | GSSA Variable __package__ | | package.__init__ | attr_used_in_subpackage | package/__init__.py:4:1:4:23 | GSSA Variable attr_used_in_subpackage | | package.__init__ | enter | package/__init__.py:2:1:2:5 | ControlFlowNode for enter | | package.__init__ | exit | package/__init__.py:7:1:7:4 | ControlFlowNode for exit | | package.__init__ | package_attr | package/__init__.py:5:1:5:12 | GSSA Variable package_attr | +| package.subpackage2.__init__ | __file__ | package/subpackage2/__init__.py:6:6:6:13 | ControlFlowNode for __file__ | | package.subpackage2.__init__ | __name__ | package/subpackage2/__init__.py:0:0:0:0 | GSSA Variable __name__ | | package.subpackage2.__init__ | __package__ | package/subpackage2/__init__.py:0:0:0:0 | GSSA Variable __package__ | | package.subpackage2.__init__ | enter | package/subpackage2/__init__.py:2:1:2:5 | ControlFlowNode for enter | | package.subpackage2.__init__ | exit | package/subpackage2/__init__.py:6:1:6:4 | ControlFlowNode for exit | | package.subpackage2.__init__ | subpackage2_attr | package/subpackage2/__init__.py:4:1:4:16 | GSSA Variable subpackage2_attr | +| package.subpackage.__init__ | __file__ | package/subpackage/__init__.py:14:6:14:13 | ControlFlowNode for __file__ | | package.subpackage.__init__ | __name__ | package/subpackage/__init__.py:0:0:0:0 | GSSA Variable __name__ | | package.subpackage.__init__ | __package__ | package/subpackage/__init__.py:0:0:0:0 | GSSA Variable __package__ | | package.subpackage.__init__ | check | package/subpackage/__init__.py:12:1:12:5 | ControlFlowNode for check | @@ -104,6 +121,7 @@ | package.subpackage.__init__ | irrelevant_attr | package/subpackage/__init__.py:11:24:11:38 | GSSA Variable irrelevant_attr | | package.subpackage.__init__ | submodule | package/subpackage/__init__.py:12:35:12:43 | ControlFlowNode for submodule | | package.subpackage.__init__ | subpackage_attr | package/subpackage/__init__.py:4:1:4:15 | GSSA Variable subpackage_attr | +| package.subpackage.submodule | __file__ | package/subpackage/submodule.py:7:6:7:13 | ControlFlowNode for __file__ | | package.subpackage.submodule | __name__ | package/subpackage/submodule.py:0:0:0:0 | GSSA Variable __name__ | | package.subpackage.submodule | __package__ | package/subpackage/submodule.py:0:0:0:0 | GSSA Variable __package__ | | package.subpackage.submodule | enter | package/subpackage/submodule.py:2:1:2:5 | ControlFlowNode for enter | @@ -111,6 +129,7 @@ | package.subpackage.submodule | irrelevant_attr | package/subpackage/submodule.py:5:1:5:15 | GSSA Variable irrelevant_attr | | package.subpackage.submodule | submodule_attr | package/subpackage/submodule.py:4:1:4:14 | GSSA Variable submodule_attr | | refined | SOURCE | refined.py:12:25:12:30 | ControlFlowNode for SOURCE | +| refined | __file__ | refined.py:14:6:14:13 | ControlFlowNode for __file__ | | refined | __name__ | refined.py:0:0:0:0 | GSSA Variable __name__ | | refined | __package__ | refined.py:0:0:0:0 | GSSA Variable __package__ | | refined | check | refined.py:12:1:12:5 | ControlFlowNode for check | @@ -118,13 +137,16 @@ | refined | exit | refined.py:14:1:14:4 | ControlFlowNode for exit | | refined | globals | refined.py:12:33:12:39 | ControlFlowNode for globals | | refined | object | refined.py:4:14:4:19 | ControlFlowNode for object | +| simplistic_reexport | __file__ | simplistic_reexport.py:19:6:19:13 | ControlFlowNode for __file__ | | simplistic_reexport | __name__ | simplistic_reexport.py:0:0:0:0 | GSSA Variable __name__ | | simplistic_reexport | __package__ | simplistic_reexport.py:0:0:0:0 | GSSA Variable __package__ | | simplistic_reexport | bar_attr | simplistic_reexport.py:6:17:6:24 | ControlFlowNode for ImportMember | +| simplistic_reexport | bar_attr | simplistic_reexport.py:10:19:10:26 | ControlFlowNode for bar_attr | | simplistic_reexport | baz_attr | baz.py:4:1:4:8 | GSSA Variable baz_attr | | simplistic_reexport | baz_attr | simplistic_reexport.py:17:19:17:26 | ControlFlowNode for baz_attr | | simplistic_reexport | check | simplistic_reexport.py:17:1:17:5 | ControlFlowNode for check | | simplistic_reexport | enter | baz.py:2:1:2:5 | ControlFlowNode for enter | +| simplistic_reexport | enter | simplistic_reexport.py:4:1:4:5 | ControlFlowNode for enter | | simplistic_reexport | exit | baz.py:6:1:6:4 | ControlFlowNode for exit | | simplistic_reexport | exit | simplistic_reexport.py:19:1:19:4 | ControlFlowNode for exit | | simplistic_reexport | globals | simplistic_reexport.py:17:44:17:50 | ControlFlowNode for globals | diff --git a/python/ql/test/experimental/import-resolution/main.py b/python/ql/test/experimental/import-resolution/main.py index 4d868437964..1fe6a9c3c65 100644 --- a/python/ql/test/experimental/import-resolution/main.py +++ b/python/ql/test/experimental/import-resolution/main.py @@ -143,7 +143,7 @@ import if_then_else_refined # $ imports=if_then_else_refined as=if_then_else_ref check("if_then_else_refined.src", if_then_else_refined.src, if_then_else_refined.src, globals()) #$ prints=SOURCE import simplistic_reexport # $ imports=simplistic_reexport as=simplistic_reexport -check("simplistic_reexport.bar_attr", simplistic_reexport.bar_attr, "overwritten", globals()) #$ MISSING: prints=overwritten SPURIOUS: prints=bar_attr +check("simplistic_reexport.bar_attr", simplistic_reexport.bar_attr, "overwritten", globals()) #$ prints=overwritten SPURIOUS: prints=bar_attr check("simplistic_reexport.baz_attr", simplistic_reexport.baz_attr, "overwritten", globals()) #$ prints=overwritten SPURIOUS: prints=baz_attr # check that we don't treat all assignments as being exports From 13ae98ea76180f062423294634ddcb2d4470d6ff Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 22 Feb 2023 16:19:15 +0100 Subject: [PATCH 017/143] Python: Fix submodule exported under wrong name (when attribute clash) --- .../dataflow/new/internal/ImportResolution.qll | 16 ++++++++++++++-- .../test/experimental/import-resolution/main.py | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll index 74ee1b83142..64ae4e50430 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll @@ -307,9 +307,21 @@ module ImportResolution { module_reexport(reexporter, attr_name, m) ) or - // Submodules that are implicitly defined with relative imports of the form `from .foo import ...`. - // In practice, we create a definition for each module in a package, even if it is not imported. + // submodules of packages will be available as `.` after doing + // `import .` at least once in the program, or can be directly + // imported with `from import ` (even with an empty + // `.__init__` file). + // + // Until an import of `.` is executed, it is technically possible + // that `.` (or `from import `) can refer to an + // attribute set in `.__init__`. + // + // Therefore, if there is an attribute defined in `.__init__` with the same + // name as a submodule, we always consider that this attribute _could_ be a + // reference to the submodule, even if we don't know that the submodule has been + // imported yet. exists(string submodule, Module package | + submodule = result.asVar().getName() and SsaSource::init_module_submodule_defn(result.asVar().getSourceVariable(), package.getEntryNode()) and m = getModuleFromName(package.getPackageName() + "." + submodule) diff --git a/python/ql/test/experimental/import-resolution/main.py b/python/ql/test/experimental/import-resolution/main.py index 1fe6a9c3c65..12fe78fa695 100644 --- a/python/ql/test/experimental/import-resolution/main.py +++ b/python/ql/test/experimental/import-resolution/main.py @@ -81,7 +81,7 @@ if sys.version_info[0] == 3: from attr_clash import clashing_attr, non_clashing_submodule #$ imports=attr_clash.clashing_attr as=clashing_attr imports=attr_clash.non_clashing_submodule as=non_clashing_submodule -check("clashing_attr", clashing_attr, "clashing_attr", globals()) #$ prints=clashing_attr SPURIOUS: prints="" SPURIOUS: prints="" SPURIOUS: prints="" +check("clashing_attr", clashing_attr, "clashing_attr", globals()) #$ prints=clashing_attr SPURIOUS: prints="" check("non_clashing_submodule", non_clashing_submodule, "", globals()) #$ prints="" # check that import * only imports the __all__ attributes From 96c0d95b10e6c7face76c96cf81d7aa3836d7398 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Wed, 22 Feb 2023 16:34:02 +0100 Subject: [PATCH 018/143] Python: Illustrate that `clashing_attr` can be submodule --- python/ql/test/experimental/import-resolution/main.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/python/ql/test/experimental/import-resolution/main.py b/python/ql/test/experimental/import-resolution/main.py index 12fe78fa695..31308c5bdfa 100644 --- a/python/ql/test/experimental/import-resolution/main.py +++ b/python/ql/test/experimental/import-resolution/main.py @@ -84,6 +84,10 @@ from attr_clash import clashing_attr, non_clashing_submodule #$ imports=attr_cla check("clashing_attr", clashing_attr, "clashing_attr", globals()) #$ prints=clashing_attr SPURIOUS: prints="" check("non_clashing_submodule", non_clashing_submodule, "", globals()) #$ prints="" +import attr_clash.clashing_attr as _doesnt_matter #$ imports=attr_clash.clashing_attr as=_doesnt_matter +from attr_clash import clashing_attr, non_clashing_submodule #$ imports=attr_clash.clashing_attr as=clashing_attr imports=attr_clash.non_clashing_submodule as=non_clashing_submodule +check("clashing_attr", clashing_attr, "", globals()) #$ prints="" SPURIOUS: prints=clashing_attr + # check that import * only imports the __all__ attributes from has_defined_all import * check("all_defined_foo", all_defined_foo, "all_defined_foo", globals()) #$ prints=all_defined_foo From b7bdc551d54db603862e58e5357cc180da227650 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Thu, 23 Feb 2023 00:50:01 +0100 Subject: [PATCH 019/143] Python: Show import resolution is a bit generous with exported value --- .../import-resolution/ModuleExport.expected | 14 ++++++++++++ .../import-resolution/generous_export.py | 22 +++++++++++++++++++ .../experimental/import-resolution/main.py | 4 ++++ 3 files changed, 40 insertions(+) create mode 100644 python/ql/test/experimental/import-resolution/generous_export.py diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.expected b/python/ql/test/experimental/import-resolution/ModuleExport.expected index 30d1fd5369d..0e250ab4b79 100644 --- a/python/ql/test/experimental/import-resolution/ModuleExport.expected +++ b/python/ql/test/experimental/import-resolution/ModuleExport.expected @@ -47,6 +47,20 @@ | foo | exit | foo.py:14:1:14:4 | ControlFlowNode for exit | | foo | foo_attr | foo.py:5:1:5:8 | GSSA Variable foo_attr | | foo | globals | foo.py:12:71:12:77 | ControlFlowNode for globals | +| generous_export | Exception | generous_export.py:16:11:16:19 | ControlFlowNode for Exception | +| generous_export | SOURCE | generous_export.py:15:11:15:16 | ControlFlowNode for SOURCE | +| generous_export | SOURCE | generous_export.py:20:25:20:30 | ControlFlowNode for SOURCE | +| generous_export | __file__ | generous_export.py:22:6:22:13 | ControlFlowNode for __file__ | +| generous_export | __name__ | generous_export.py:0:0:0:0 | GSSA Variable __name__ | +| generous_export | __package__ | generous_export.py:0:0:0:0 | GSSA Variable __package__ | +| generous_export | check | generous_export.py:20:1:20:5 | ControlFlowNode for check | +| generous_export | enter | generous_export.py:2:1:2:5 | ControlFlowNode for enter | +| generous_export | eval | generous_export.py:10:4:10:7 | ControlFlowNode for eval | +| generous_export | exit | generous_export.py:22:1:22:4 | ControlFlowNode for exit | +| generous_export | globals | generous_export.py:20:33:20:39 | ControlFlowNode for globals | +| generous_export | object | generous_export.py:4:14:4:19 | ControlFlowNode for object | +| generous_export | print | generous_export.py:15:5:15:9 | ControlFlowNode for print | +| generous_export | staticmethod | generous_export.py:0:0:0:0 | GSSA Variable staticmethod | | has_defined_all | __all__ | has_defined_all.py:7:1:7:7 | GSSA Variable __all__ | | has_defined_all | __file__ | has_defined_all.py:9:6:9:13 | ControlFlowNode for __file__ | | has_defined_all | __name__ | has_defined_all.py:0:0:0:0 | GSSA Variable __name__ | diff --git a/python/ql/test/experimental/import-resolution/generous_export.py b/python/ql/test/experimental/import-resolution/generous_export.py new file mode 100644 index 00000000000..cbea96e19ce --- /dev/null +++ b/python/ql/test/experimental/import-resolution/generous_export.py @@ -0,0 +1,22 @@ +from trace import * +enter(__file__) + +class SOURCE(object): + @staticmethod + def block_flow(): pass + +check("SOURCE", SOURCE, SOURCE, globals()) #$ prints=SOURCE + +if eval("False"): + # With our current import resolution, this value for SOURCE will be considered to be + # a valid value at the end of this module, because it's the end of a use-use flow. + # This is clearly wrong, so our import resolution is a bit too generous on what is + # exported + print(SOURCE) + raise Exception() + +SOURCE.block_flow() + +check("SOURCE", SOURCE, SOURCE, globals()) + +exit(__file__) diff --git a/python/ql/test/experimental/import-resolution/main.py b/python/ql/test/experimental/import-resolution/main.py index 31308c5bdfa..ce1bee040f4 100644 --- a/python/ql/test/experimental/import-resolution/main.py +++ b/python/ql/test/experimental/import-resolution/main.py @@ -154,6 +154,10 @@ check("simplistic_reexport.baz_attr", simplistic_reexport.baz_attr, "overwritten import block_flow_check #$ imports=block_flow_check as=block_flow_check check("block_flow_check.SOURCE", block_flow_check.SOURCE, block_flow_check.SOURCE, globals()) +# show that import resolution is a bit too generous with definitions +import generous_export #$ imports=generous_export as=generous_export +check("generous_export.SOURCE", generous_export.SOURCE, generous_export.SOURCE, globals()) #$ SPURIOUS: prints=SOURCE + exit(__file__) print() From 11000fd12313bb8e513bd28216123c8145511bc3 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Mon, 27 Feb 2023 17:00:17 +0100 Subject: [PATCH 020/143] Python: Fix `ModuleExport.ql` test for Python 2 --- .../experimental/import-resolution/ModuleExport.expected | 6 ------ .../test/experimental/import-resolution/ModuleExport.ql | 8 +++++++- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.expected b/python/ql/test/experimental/import-resolution/ModuleExport.expected index 0e250ab4b79..b1f63a02a78 100644 --- a/python/ql/test/experimental/import-resolution/ModuleExport.expected +++ b/python/ql/test/experimental/import-resolution/ModuleExport.expected @@ -103,12 +103,6 @@ | if_then_else_refined | exit | if_then_else_refined.py:19:1:19:4 | ControlFlowNode for exit | | if_then_else_refined | globals | if_then_else_refined.py:17:24:17:30 | ControlFlowNode for globals | | if_then_else_refined | src | if_then_else_refined.py:17:19:17:21 | ControlFlowNode for src | -| namespace_package.namespace_module | __file__ | namespace_package/namespace_module.py:6:6:6:13 | ControlFlowNode for __file__ | -| namespace_package.namespace_module | __name__ | namespace_package/namespace_module.py:0:0:0:0 | GSSA Variable __name__ | -| namespace_package.namespace_module | __package__ | namespace_package/namespace_module.py:0:0:0:0 | GSSA Variable __package__ | -| namespace_package.namespace_module | enter | namespace_package/namespace_module.py:2:1:2:5 | ControlFlowNode for enter | -| namespace_package.namespace_module | exit | namespace_package/namespace_module.py:6:1:6:4 | ControlFlowNode for exit | -| namespace_package.namespace_module | namespace_module_attr | namespace_package/namespace_module.py:4:1:4:21 | GSSA Variable namespace_module_attr | | package.__init__ | __file__ | package/__init__.py:7:6:7:13 | ControlFlowNode for __file__ | | package.__init__ | __name__ | package/__init__.py:0:0:0:0 | GSSA Variable __name__ | | package.__init__ | __package__ | package/__init__.py:0:0:0:0 | GSSA Variable __package__ | diff --git a/python/ql/test/experimental/import-resolution/ModuleExport.ql b/python/ql/test/experimental/import-resolution/ModuleExport.ql index 4b84527573e..56db660b103 100644 --- a/python/ql/test/experimental/import-resolution/ModuleExport.ql +++ b/python/ql/test/experimental/import-resolution/ModuleExport.ql @@ -7,5 +7,11 @@ where ImportResolution::module_export(m, name, defn) and exists(m.getLocation().getFile().getRelativePath()) and not defn.getScope() = any(Module trace | trace.getName() = "trace") and - not m.getName() = "main" + not m.getName() = "main" and + // Since we test on both Python 2 and Python 3, but `namespace_package` is not allowed + // on Python 2 because of the missing `__init__.py` files, we remove those results + // from Python 3 tests as well. One alternative is to only run these tests under + // Python 3, but that does not seems like a good solution -- we could easily miss a + // Python 2 only regression then :O + not m.getName() = "namespace_package.namespace_module" select m.getName(), name, defn From 2cc8fbaa50b221010af7eab9747e081c33a72178 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Mon, 6 Mar 2023 14:48:48 +0100 Subject: [PATCH 021/143] Python: Accept changes due to better import resolution of `operator.py` --- python/ql/test/experimental/dataflow/coverage/classes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/ql/test/experimental/dataflow/coverage/classes.py b/python/ql/test/experimental/dataflow/coverage/classes.py index d74a632b7c3..664adedcc00 100644 --- a/python/ql/test/experimental/dataflow/coverage/classes.py +++ b/python/ql/test/experimental/dataflow/coverage/classes.py @@ -546,7 +546,7 @@ class With_length_hint: def test_length_hint(): import operator - with_length_hint = With_length_hint() #$ MISSING: arg1="SSA variable with_length_hint" func=With_length_hint.__length_hint__ + with_length_hint = With_length_hint() #$ arg1="SSA variable with_length_hint" func=With_length_hint.__length_hint__ operator.length_hint(with_length_hint) @@ -1381,7 +1381,7 @@ class With_index: def test_index(): import operator - with_index = With_index() #$ MISSING: arg1="SSA variable with_index" func=With_index.__index__ + with_index = With_index() #$ arg1="SSA variable with_index" func=With_index.__index__ operator.index(with_index) From 01a85164eef3953f1be4dbf1fa16e26daf6b1e0b Mon Sep 17 00:00:00 2001 From: Harry Maclean Date: Wed, 15 Mar 2023 18:08:23 +1300 Subject: [PATCH 022/143] Ruby: Bump rust toolchain to 1.68 --- ruby/extractor/rust-toolchain.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruby/extractor/rust-toolchain.toml b/ruby/extractor/rust-toolchain.toml index a4602066f4b..e56467f055c 100644 --- a/ruby/extractor/rust-toolchain.toml +++ b/ruby/extractor/rust-toolchain.toml @@ -2,6 +2,6 @@ # extractor. It is set to the lowest version of Rust we want to support. [toolchain] -channel = "1.54" +channel = "1.68" profile = "minimal" components = [ "rustfmt" ] From 907fbeaae83e55dbebacc22523b323d32e97e73f Mon Sep 17 00:00:00 2001 From: Harry Maclean Date: Wed, 15 Mar 2023 22:03:48 +1300 Subject: [PATCH 023/143] Ruby: Update build instructions for new extractor --- ruby/doc/HOWTO.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruby/doc/HOWTO.md b/ruby/doc/HOWTO.md index d2c4c316db5..ccfb8c9bc5e 100644 --- a/ruby/doc/HOWTO.md +++ b/ruby/doc/HOWTO.md @@ -7,7 +7,7 @@ This document contains information about common development tasks. [Install Rust](https://www.rust-lang.org/tools/install), then run: ```bash -cargo build --release +(cd extractor && cargo build --release) ``` ## Generating the database schema and QL library @@ -16,7 +16,7 @@ The generated `ql/lib/ruby.dbscheme` and `ql/lib/codeql/ruby/ast/internal/TreeSi ```bash # Run the generator -cargo run --release -p ruby-generator -- --dbscheme ql/lib/ruby.dbscheme --library ql/lib/codeql/ruby/ast/internal/TreeSitter.qll +(cd extractor && cargo run --release --bin generator -- --dbscheme ../ql/lib/ruby.dbscheme --library ../ql/lib/codeql/ruby/ast/internal/TreeSitter.qll) # Then auto-format the QL library codeql query format -i ql/lib/codeql/ruby/ast/internal/TreeSitter.qll ``` From e7ead76fe98a046ffc3de9c1cbf9d1002c99bce1 Mon Sep 17 00:00:00 2001 From: Harry Maclean Date: Thu, 16 Mar 2023 12:04:33 +1300 Subject: [PATCH 024/143] Ruby: Build extractor via cargo-cross on linux --- .github/workflows/ruby-build.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ruby-build.yml b/.github/workflows/ruby-build.yml index 6fdd497a802..c8c73d83024 100644 --- a/.github/workflows/ruby-build.yml +++ b/.github/workflows/ruby-build.yml @@ -48,6 +48,9 @@ jobs: run: | brew install gnu-tar echo "/usr/local/opt/gnu-tar/libexec/gnubin" >> $GITHUB_PATH + - name: Install cargo-cross + if: runner.os == 'Linux' + run: cargo install cross --version 0.2.1 - uses: ./.github/actions/os-version id: os_version - name: Cache entire extractor @@ -80,7 +83,15 @@ jobs: run: cd extractor && cargo test --verbose - name: Release build if: steps.cache-extractor.outputs.cache-hit != 'true' - run: cd extractor && cargo build --release + # On linux, build the extractor via cross in a centos7 container. + # This ensures we don't depend on glibc > 2.17. + run: | + if [[ "$RUNNER_OS" == "Linux" ]]; then + CARGO=cross + else + CARGO=cargo + fi + cd extractor && "$CARGO" build --release - name: Generate dbscheme if: ${{ matrix.os == 'ubuntu-latest' && steps.cache-extractor.outputs.cache-hit != 'true'}} run: extractor/target/release/generator --dbscheme ql/lib/ruby.dbscheme --library ql/lib/codeql/ruby/ast/internal/TreeSitter.qll From 7b81fe3109b26badd31c4afabd09a08779fb4222 Mon Sep 17 00:00:00 2001 From: Harry Maclean Date: Thu, 16 Mar 2023 12:11:12 +1300 Subject: [PATCH 025/143] Ruby: fix conditional use of cross in build --- .github/workflows/ruby-build.yml | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ruby-build.yml b/.github/workflows/ruby-build.yml index c8c73d83024..1e7746c8c40 100644 --- a/.github/workflows/ruby-build.yml +++ b/.github/workflows/ruby-build.yml @@ -81,17 +81,14 @@ jobs: - name: Run tests if: steps.cache-extractor.outputs.cache-hit != 'true' run: cd extractor && cargo test --verbose - - name: Release build - if: steps.cache-extractor.outputs.cache-hit != 'true' - # On linux, build the extractor via cross in a centos7 container. - # This ensures we don't depend on glibc > 2.17. - run: | - if [[ "$RUNNER_OS" == "Linux" ]]; then - CARGO=cross - else - CARGO=cargo - fi - cd extractor && "$CARGO" build --release + # On linux, build the extractor via cross in a centos7 container. + # This ensures we don't depend on glibc > 2.17. + - name: Release build (linux) + if: steps.cache-extractor.outputs.cache-hit != 'true' && runner.os == 'Linux' + run: cd extractor && cross build --release + - name: Release build (windows and macos) + if: steps.cache-extractor.outputs.cache-hit != 'true' && runner.os != 'Linux' + run: cd extractor && cargo build --release - name: Generate dbscheme if: ${{ matrix.os == 'ubuntu-latest' && steps.cache-extractor.outputs.cache-hit != 'true'}} run: extractor/target/release/generator --dbscheme ql/lib/ruby.dbscheme --library ql/lib/codeql/ruby/ast/internal/TreeSitter.qll From 0eb0c26b726cf2f9ead18e1c0ebd4c12ba59635b Mon Sep 17 00:00:00 2001 From: Harry Maclean Date: Thu, 16 Mar 2023 12:24:47 +1300 Subject: [PATCH 026/143] Ruby: Add some documentation This is primarily to bust the build cache. --- ruby/extractor/src/bin/extractor.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ruby/extractor/src/bin/extractor.rs b/ruby/extractor/src/bin/extractor.rs index 300a94444a6..c79e3e1b51c 100644 --- a/ruby/extractor/src/bin/extractor.rs +++ b/ruby/extractor/src/bin/extractor.rs @@ -320,6 +320,8 @@ fn scan_erb( (result, line_breaks) } +/// Advance `index` to the next non-whitespace character. +/// Newlines are **not** considered whitespace. fn skip_space(content: &[u8], index: usize) -> usize { let mut index = index; while index < content.len() { From fe4d27e8cc5d29443bc4e21054e4cad8d07d865d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 16 Mar 2023 12:58:50 +0000 Subject: [PATCH 027/143] Release preparation for version 2.12.5 --- cpp/ql/lib/CHANGELOG.md | 43 +++++++++++++++++++ ...10-buffer-and-nill-termination-dataflow.md | 4 -- .../2023-03-02-dataflow-conf-module.md | 9 ---- .../change-notes/2023-03-03-delete-deps.md | 12 ------ ...3-08-deprecated-dataflow-configurations.md | 4 -- .../change-notes/2023-03-13-mergepathgraph.md | 4 -- .../change-notes/2023-03-16-use-use-flow.md | 11 ----- cpp/ql/lib/change-notes/released/0.6.0.md | 42 ++++++++++++++++++ cpp/ql/lib/codeql-pack.release.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/CHANGELOG.md | 7 +++ ...3-08-deprecated-dataflow-configurations.md | 4 -- .../0.5.5.md} | 8 ++-- cpp/ql/src/codeql-pack.release.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/lib/CHANGELOG.md | 4 ++ .../lib/change-notes/released/1.4.5.md | 3 ++ .../Solorigate/lib/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- .../ql/campaigns/Solorigate/src/CHANGELOG.md | 4 ++ .../src/change-notes/released/1.4.5.md | 3 ++ .../Solorigate/src/codeql-pack.release.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/CHANGELOG.md | 22 ++++++++++ .../2023-03-02-dataflow-conf-module.md | 9 ---- .../change-notes/2023-03-02-unsafemembers.md | 4 -- .../change-notes/2023-03-03-delete-deps.md | 6 --- .../change-notes/2023-03-13-mergepathgraph.md | 4 -- csharp/ql/lib/change-notes/released/0.5.5.md | 21 +++++++++ csharp/ql/lib/codeql-pack.release.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/CHANGELOG.md | 4 ++ csharp/ql/src/change-notes/released/0.5.5.md | 3 ++ csharp/ql/src/codeql-pack.release.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/lib/CHANGELOG.md | 15 +++++++ .../change-notes/2023-03-13-mergepathgraph.md | 4 -- .../ql/lib/change-notes/released/0.4.5.md | 11 +++-- go/ql/lib/codeql-pack.release.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/CHANGELOG.md | 4 ++ go/ql/src/change-notes/released/0.4.5.md | 3 ++ go/ql/src/codeql-pack.release.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/CHANGELOG.md | 31 +++++++++++++ .../change-notes/2023-03-03-delete-deps.md | 7 --- .../change-notes/2023-03-09-more-models.md | 11 ----- .../change-notes/2023-03-13-mergepathgraph.md | 4 -- .../2023-03-14-neutral-dispatch.md | 4 -- java/ql/lib/change-notes/released/0.5.5.md | 30 +++++++++++++ java/ql/lib/codeql-pack.release.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/CHANGELOG.md | 6 +++ .../0.5.5.md} | 8 ++-- java/ql/src/codeql-pack.release.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/CHANGELOG.md | 12 ++++++ .../2023-03-03-import-assertion.md | 5 --- .../0.5.1.md} | 11 +++-- javascript/ql/lib/codeql-pack.release.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/CHANGELOG.md | 8 ++++ .../0.5.5.md} | 7 +-- javascript/ql/src/codeql-pack.release.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/CHANGELOG.md | 4 ++ .../change-notes/released/0.4.5.md | 3 ++ misc/suite-helpers/codeql-pack.release.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/CHANGELOG.md | 19 ++++++++ .../2023-03-02-dataflow-conf-module.md | 9 ---- .../change-notes/2023-03-03-delete-deps.md | 4 -- .../change-notes/2023-03-13-mergepathgraph.md | 4 -- .../ql/lib/change-notes/released/0.8.2.md | 15 +++++-- python/ql/lib/codeql-pack.release.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/CHANGELOG.md | 6 +++ .../0.6.5.md} | 7 +-- python/ql/src/codeql-pack.release.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/CHANGELOG.md | 26 +++++++++++ .../2023-03-02-dataflow-conf-module.md | 9 ---- .../change-notes/2023-03-03-delete-deps.md | 6 --- .../change-notes/2023-03-09-parse-error.md | 4 -- .../change-notes/2023-03-13-initalize-flow.md | 4 -- .../change-notes/2023-03-13-mergepathgraph.md | 4 -- .../change-notes/2023-03-13-rails-sinks.md | 6 --- ruby/ql/lib/change-notes/released/0.5.5.md | 25 +++++++++++ ruby/ql/lib/codeql-pack.release.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/CHANGELOG.md | 6 +++ .../change-notes/2023-02-17-zip-slip-query.md | 4 -- ruby/ql/src/change-notes/released/0.5.5.md | 5 +++ ruby/ql/src/codeql-pack.release.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- shared/regex/CHANGELOG.md | 4 ++ shared/regex/change-notes/released/0.0.9.md | 3 ++ shared/regex/codeql-pack.release.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/CHANGELOG.md | 4 ++ shared/ssa/change-notes/released/0.0.13.md | 3 ++ shared/ssa/codeql-pack.release.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/tutorial/CHANGELOG.md | 4 ++ .../tutorial/change-notes/released/0.0.6.md | 3 ++ shared/tutorial/codeql-pack.release.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typetracking/CHANGELOG.md | 4 ++ .../change-notes/released/0.0.6.md | 3 ++ shared/typetracking/codeql-pack.release.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/CHANGELOG.md | 4 ++ shared/typos/change-notes/released/0.0.13.md | 3 ++ shared/typos/codeql-pack.release.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/CHANGELOG.md | 4 ++ shared/util/change-notes/released/0.0.6.md | 3 ++ shared/util/codeql-pack.release.yml | 2 +- shared/util/qlpack.yml | 2 +- 119 files changed, 491 insertions(+), 229 deletions(-) delete mode 100644 cpp/ql/lib/change-notes/2023-02-10-buffer-and-nill-termination-dataflow.md delete mode 100644 cpp/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md delete mode 100644 cpp/ql/lib/change-notes/2023-03-03-delete-deps.md delete mode 100644 cpp/ql/lib/change-notes/2023-03-08-deprecated-dataflow-configurations.md delete mode 100644 cpp/ql/lib/change-notes/2023-03-13-mergepathgraph.md delete mode 100644 cpp/ql/lib/change-notes/2023-03-16-use-use-flow.md create mode 100644 cpp/ql/lib/change-notes/released/0.6.0.md delete mode 100644 cpp/ql/src/change-notes/2023-03-08-deprecated-dataflow-configurations.md rename cpp/ql/src/change-notes/{2023-03-08-deprecated-leap-year-dataflow-configurations.md => released/0.5.5.md} (57%) create mode 100644 csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.4.5.md create mode 100644 csharp/ql/campaigns/Solorigate/src/change-notes/released/1.4.5.md delete mode 100644 csharp/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md delete mode 100644 csharp/ql/lib/change-notes/2023-03-02-unsafemembers.md delete mode 100644 csharp/ql/lib/change-notes/2023-03-03-delete-deps.md delete mode 100644 csharp/ql/lib/change-notes/2023-03-13-mergepathgraph.md create mode 100644 csharp/ql/lib/change-notes/released/0.5.5.md create mode 100644 csharp/ql/src/change-notes/released/0.5.5.md delete mode 100644 go/ql/lib/change-notes/2023-03-13-mergepathgraph.md rename java/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md => go/ql/lib/change-notes/released/0.4.5.md (64%) create mode 100644 go/ql/src/change-notes/released/0.4.5.md delete mode 100644 java/ql/lib/change-notes/2023-03-03-delete-deps.md delete mode 100644 java/ql/lib/change-notes/2023-03-09-more-models.md delete mode 100644 java/ql/lib/change-notes/2023-03-13-mergepathgraph.md delete mode 100644 java/ql/lib/change-notes/2023-03-14-neutral-dispatch.md create mode 100644 java/ql/lib/change-notes/released/0.5.5.md rename java/ql/src/change-notes/{2023-01-19-arbitrary-apk-installation.md => released/0.5.5.md} (81%) delete mode 100644 javascript/ql/lib/change-notes/2023-03-03-import-assertion.md rename javascript/ql/lib/change-notes/{2023-03-03-delete-deps.md => released/0.5.1.md} (61%) rename javascript/ql/src/change-notes/{2023-03-07-html-sanitizer-for-sql.md => released/0.5.5.md} (84%) create mode 100644 misc/suite-helpers/change-notes/released/0.4.5.md delete mode 100644 python/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md delete mode 100644 python/ql/lib/change-notes/2023-03-03-delete-deps.md delete mode 100644 python/ql/lib/change-notes/2023-03-13-mergepathgraph.md rename go/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md => python/ql/lib/change-notes/released/0.8.2.md (53%) rename python/ql/src/change-notes/{2023-02-03-unsafe-shell-command-construction.md => released/0.6.5.md} (84%) delete mode 100644 ruby/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md delete mode 100644 ruby/ql/lib/change-notes/2023-03-03-delete-deps.md delete mode 100644 ruby/ql/lib/change-notes/2023-03-09-parse-error.md delete mode 100644 ruby/ql/lib/change-notes/2023-03-13-initalize-flow.md delete mode 100644 ruby/ql/lib/change-notes/2023-03-13-mergepathgraph.md delete mode 100644 ruby/ql/lib/change-notes/2023-03-13-rails-sinks.md create mode 100644 ruby/ql/lib/change-notes/released/0.5.5.md delete mode 100644 ruby/ql/src/change-notes/2023-02-17-zip-slip-query.md create mode 100644 ruby/ql/src/change-notes/released/0.5.5.md create mode 100644 shared/regex/change-notes/released/0.0.9.md create mode 100644 shared/ssa/change-notes/released/0.0.13.md create mode 100644 shared/tutorial/change-notes/released/0.0.6.md create mode 100644 shared/typetracking/change-notes/released/0.0.6.md create mode 100644 shared/typos/change-notes/released/0.0.13.md create mode 100644 shared/util/change-notes/released/0.0.6.md diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 42a379734a1..cc4e0d9c1e2 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,46 @@ +## 0.6.0 + +### Breaking Changes + +* The `semmle.code.cpp.commons.Buffer` and `semmle.code.cpp.commons.NullTermination` libraries no longer expose `semmle.code.cpp.dataflow.DataFlow`. Please import `semmle.code.cpp.dataflow.DataFlow` directly. + +### Deprecated APIs + +* The `WriteConfig` taint tracking configuration has been deprecated. Please use `WriteFlow`. + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* A new C/C++ dataflow library (`semmle.code.cpp.dataflow.new.DataFlow`) has been added. + The new library behaves much more like the dataflow library of other CodeQL supported + languages by following use-use dataflow paths instead of def-use dataflow paths. + The new library also better supports dataflow through indirections, and new predicates + such as `Node::asIndirectExpr` have been added to facilitate working with indirections. + + The `semmle.code.cpp.ir.dataflow.DataFlow` library is now identical to the new + `semmle.code.cpp.dataflow.new.DataFlow` library. +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Deleted the deprecated `hasGeneratedCopyConstructor` and `hasGeneratedCopyAssignmentOperator` predicates from the `Folder` class. +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. +* Deleted the deprecated `getMustlockFunction`, `getTrylockFunction`, `getLockFunction`, and `getUnlockFunction` predicates from the `MutexType` class. +* Deleted the deprecated `getPosInBasicBlock` predicate from the `SubBasicBlock` class. +* Deleted the deprecated `getExpr` predicate from the `PointerDereferenceExpr` class. +* Deleted the deprecated `getUseInstruction` and `getDefinitionInstruction` predicates from the `Operand` class. +* Deleted the deprecated `isInParameter`, `isInParameterPointer`, and `isInQualifier` predicates from the `FunctionInput` class. +* Deleted the deprecated `isOutParameterPointer`, `isOutQualifier`, `isOutReturnValue`, and `isOutReturnPointer` predicate from the `FunctionOutput` class. +* Deleted the deprecated 3-argument `isGuardPhi` predicate from the `RangeSsaDefinition` class. + ## 0.5.4 No user-facing changes. diff --git a/cpp/ql/lib/change-notes/2023-02-10-buffer-and-nill-termination-dataflow.md b/cpp/ql/lib/change-notes/2023-02-10-buffer-and-nill-termination-dataflow.md deleted file mode 100644 index adc00f952f9..00000000000 --- a/cpp/ql/lib/change-notes/2023-02-10-buffer-and-nill-termination-dataflow.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: breaking ---- -* The `semmle.code.cpp.commons.Buffer` and `semmle.code.cpp.commons.NullTermination` libraries no longer expose `semmle.code.cpp.dataflow.DataFlow`. Please import `semmle.code.cpp.dataflow.DataFlow` directly. diff --git a/cpp/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md b/cpp/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md deleted file mode 100644 index 89190af399f..00000000000 --- a/cpp/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -category: majorAnalysis ---- -* The main data flow and taint tracking APIs have been changed. The old APIs - remain in place for now and translate to the new through a - backwards-compatible wrapper. If multiple configurations are in scope - simultaneously, then this may affect results slightly. The new API is quite - similar to the old, but makes use of a configuration module instead of a - configuration class. diff --git a/cpp/ql/lib/change-notes/2023-03-03-delete-deps.md b/cpp/ql/lib/change-notes/2023-03-03-delete-deps.md deleted file mode 100644 index 03efda07926..00000000000 --- a/cpp/ql/lib/change-notes/2023-03-03-delete-deps.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -category: minorAnalysis ---- -* Deleted the deprecated `hasGeneratedCopyConstructor` and `hasGeneratedCopyAssignmentOperator` predicates from the `Folder` class. -* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. -* Deleted the deprecated `getMustlockFunction`, `getTrylockFunction`, `getLockFunction`, and `getUnlockFunction` predicates from the `MutexType` class. -* Deleted the deprecated `getPosInBasicBlock` predicate from the `SubBasicBlock` class. -* Deleted the deprecated `getExpr` predicate from the `PointerDereferenceExpr` class. -* Deleted the deprecated `getUseInstruction` and `getDefinitionInstruction` predicates from the `Operand` class. -* Deleted the deprecated `isInParameter`, `isInParameterPointer`, and `isInQualifier` predicates from the `FunctionInput` class. -* Deleted the deprecated `isOutParameterPointer`, `isOutQualifier`, `isOutReturnValue`, and `isOutReturnPointer` predicate from the `FunctionOutput` class. -* Deleted the deprecated 3-argument `isGuardPhi` predicate from the `RangeSsaDefinition` class. diff --git a/cpp/ql/lib/change-notes/2023-03-08-deprecated-dataflow-configurations.md b/cpp/ql/lib/change-notes/2023-03-08-deprecated-dataflow-configurations.md deleted file mode 100644 index 124dc73213a..00000000000 --- a/cpp/ql/lib/change-notes/2023-03-08-deprecated-dataflow-configurations.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: deprecated ---- -* The `WriteConfig` taint tracking configuration has been deprecated. Please use `WriteFlow`. diff --git a/cpp/ql/lib/change-notes/2023-03-13-mergepathgraph.md b/cpp/ql/lib/change-notes/2023-03-13-mergepathgraph.md deleted file mode 100644 index 63bfade2f10..00000000000 --- a/cpp/ql/lib/change-notes/2023-03-13-mergepathgraph.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. diff --git a/cpp/ql/lib/change-notes/2023-03-16-use-use-flow.md b/cpp/ql/lib/change-notes/2023-03-16-use-use-flow.md deleted file mode 100644 index a643fd50b7d..00000000000 --- a/cpp/ql/lib/change-notes/2023-03-16-use-use-flow.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -category: majorAnalysis ---- -* A new C/C++ dataflow library (`semmle.code.cpp.dataflow.new.DataFlow`) has been added. - The new library behaves much more like the dataflow library of other CodeQL supported - languages by following use-use dataflow paths instead of def-use dataflow paths. - The new library also better supports dataflow through indirections, and new predicates - such as `Node::asIndirectExpr` have been added to facilitate working with indirections. - - The `semmle.code.cpp.ir.dataflow.DataFlow` library is now identical to the new - `semmle.code.cpp.dataflow.new.DataFlow` library. diff --git a/cpp/ql/lib/change-notes/released/0.6.0.md b/cpp/ql/lib/change-notes/released/0.6.0.md new file mode 100644 index 00000000000..2ae831d8f9a --- /dev/null +++ b/cpp/ql/lib/change-notes/released/0.6.0.md @@ -0,0 +1,42 @@ +## 0.6.0 + +### Breaking Changes + +* The `semmle.code.cpp.commons.Buffer` and `semmle.code.cpp.commons.NullTermination` libraries no longer expose `semmle.code.cpp.dataflow.DataFlow`. Please import `semmle.code.cpp.dataflow.DataFlow` directly. + +### Deprecated APIs + +* The `WriteConfig` taint tracking configuration has been deprecated. Please use `WriteFlow`. + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* A new C/C++ dataflow library (`semmle.code.cpp.dataflow.new.DataFlow`) has been added. + The new library behaves much more like the dataflow library of other CodeQL supported + languages by following use-use dataflow paths instead of def-use dataflow paths. + The new library also better supports dataflow through indirections, and new predicates + such as `Node::asIndirectExpr` have been added to facilitate working with indirections. + + The `semmle.code.cpp.ir.dataflow.DataFlow` library is now identical to the new + `semmle.code.cpp.dataflow.new.DataFlow` library. +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Deleted the deprecated `hasGeneratedCopyConstructor` and `hasGeneratedCopyAssignmentOperator` predicates from the `Folder` class. +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. +* Deleted the deprecated `getMustlockFunction`, `getTrylockFunction`, `getLockFunction`, and `getUnlockFunction` predicates from the `MutexType` class. +* Deleted the deprecated `getPosInBasicBlock` predicate from the `SubBasicBlock` class. +* Deleted the deprecated `getExpr` predicate from the `PointerDereferenceExpr` class. +* Deleted the deprecated `getUseInstruction` and `getDefinitionInstruction` predicates from the `Operand` class. +* Deleted the deprecated `isInParameter`, `isInParameterPointer`, and `isInQualifier` predicates from the `FunctionInput` class. +* Deleted the deprecated `isOutParameterPointer`, `isOutQualifier`, `isOutReturnValue`, and `isOutReturnPointer` predicate from the `FunctionOutput` class. +* Deleted the deprecated 3-argument `isGuardPhi` predicate from the `RangeSsaDefinition` class. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index cd3f72e2513..a3f820f884d 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.6.0 diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 8e6602b6634..5a75c36d89d 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 0.5.5-dev +version: 0.6.0 groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index 2024538e99c..510cd92b275 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.5.5 + +### Deprecated Queries + +* The `NetworkToBufferSizeConfiguration` and `UntrustedDataToExternalApiConfig` dataflow configurations have been deprecated. Please use `NetworkToBufferSizeFlow` and `UntrustedDataToExternalApiFlow`. +* The `LeapYearCheckConfiguration`, `FiletimeYearArithmeticOperationCheckConfiguration`, and `PossibleYearArithmeticOperationCheckConfiguration` dataflow configurations have been deprecated. Please use `LeapYearCheckFlow`, `FiletimeYearArithmeticOperationCheckFlow` and `PossibleYearArithmeticOperationCheckFlow`. + ## 0.5.4 No user-facing changes. diff --git a/cpp/ql/src/change-notes/2023-03-08-deprecated-dataflow-configurations.md b/cpp/ql/src/change-notes/2023-03-08-deprecated-dataflow-configurations.md deleted file mode 100644 index 46952f5b1a3..00000000000 --- a/cpp/ql/src/change-notes/2023-03-08-deprecated-dataflow-configurations.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: deprecated ---- -* The `NetworkToBufferSizeConfiguration` and `UntrustedDataToExternalApiConfig` dataflow configurations have been deprecated. Please use `NetworkToBufferSizeFlow` and `UntrustedDataToExternalApiFlow`. diff --git a/cpp/ql/src/change-notes/2023-03-08-deprecated-leap-year-dataflow-configurations.md b/cpp/ql/src/change-notes/released/0.5.5.md similarity index 57% rename from cpp/ql/src/change-notes/2023-03-08-deprecated-leap-year-dataflow-configurations.md rename to cpp/ql/src/change-notes/released/0.5.5.md index 1ea59f77680..d8b6132e12b 100644 --- a/cpp/ql/src/change-notes/2023-03-08-deprecated-leap-year-dataflow-configurations.md +++ b/cpp/ql/src/change-notes/released/0.5.5.md @@ -1,4 +1,6 @@ ---- -category: deprecated ---- +## 0.5.5 + +### Deprecated Queries + +* The `NetworkToBufferSizeConfiguration` and `UntrustedDataToExternalApiConfig` dataflow configurations have been deprecated. Please use `NetworkToBufferSizeFlow` and `UntrustedDataToExternalApiFlow`. * The `LeapYearCheckConfiguration`, `FiletimeYearArithmeticOperationCheckConfiguration`, and `PossibleYearArithmeticOperationCheckConfiguration` dataflow configurations have been deprecated. Please use `LeapYearCheckFlow`, `FiletimeYearArithmeticOperationCheckFlow` and `PossibleYearArithmeticOperationCheckFlow`. diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index cd3f72e2513..03e491f0899 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.5.5 diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index 9c312b5a568..88e2c2a1921 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 0.5.5-dev +version: 0.5.5 groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index 1f2dc408daf..892c022355a 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.4.5 + +No user-facing changes. + ## 1.4.4 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.4.5.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.4.5.md new file mode 100644 index 00000000000..930163bb5ae --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.4.5.md @@ -0,0 +1,3 @@ +## 1.4.5 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index 1dfca6daa3b..a74b6b08d86 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.4.4 +lastReleaseVersion: 1.4.5 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index 14647a2593b..cbc4e04bfe6 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.4.5-dev +version: 1.4.5 groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index 1f2dc408daf..892c022355a 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.4.5 + +No user-facing changes. + ## 1.4.4 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.4.5.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.4.5.md new file mode 100644 index 00000000000..930163bb5ae --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.4.5.md @@ -0,0 +1,3 @@ +## 1.4.5 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index 1dfca6daa3b..a74b6b08d86 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.4.4 +lastReleaseVersion: 1.4.5 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 48bb9aecd88..e7f9d67aa66 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.4.5-dev +version: 1.4.5 groups: - csharp - solorigate diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 42eaea79fd6..4256614c2ee 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,25 @@ +## 0.5.5 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. +* Deleted the deprecated `getAssertionIndex`, and `getAssertedParameter` predicates from the `AssertMethod` class. +* Deleted the deprecated `OverridableMethod` and `OverridableAccessor` classes. +* The `unsafe` predicate for `Modifiable` has been extended to cover delegate return types and identify pointer like types at any nest level. This is relevant for `unsafe` declarations extracted from assemblies. + ## 0.5.4 ### Minor Analysis Improvements diff --git a/csharp/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md b/csharp/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md deleted file mode 100644 index 89190af399f..00000000000 --- a/csharp/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -category: majorAnalysis ---- -* The main data flow and taint tracking APIs have been changed. The old APIs - remain in place for now and translate to the new through a - backwards-compatible wrapper. If multiple configurations are in scope - simultaneously, then this may affect results slightly. The new API is quite - similar to the old, but makes use of a configuration module instead of a - configuration class. diff --git a/csharp/ql/lib/change-notes/2023-03-02-unsafemembers.md b/csharp/ql/lib/change-notes/2023-03-02-unsafemembers.md deleted file mode 100644 index 7ff64ca1301..00000000000 --- a/csharp/ql/lib/change-notes/2023-03-02-unsafemembers.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* The `unsafe` predicate for `Modifiable` has been extended to cover delegate return types and identify pointer like types at any nest level. This is relevant for `unsafe` declarations extracted from assemblies. \ No newline at end of file diff --git a/csharp/ql/lib/change-notes/2023-03-03-delete-deps.md b/csharp/ql/lib/change-notes/2023-03-03-delete-deps.md deleted file mode 100644 index f5557fc5b77..00000000000 --- a/csharp/ql/lib/change-notes/2023-03-03-delete-deps.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -category: minorAnalysis ---- -* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. -* Deleted the deprecated `getAssertionIndex`, and `getAssertedParameter` predicates from the `AssertMethod` class. -* Deleted the deprecated `OverridableMethod` and `OverridableAccessor` classes. diff --git a/csharp/ql/lib/change-notes/2023-03-13-mergepathgraph.md b/csharp/ql/lib/change-notes/2023-03-13-mergepathgraph.md deleted file mode 100644 index 63bfade2f10..00000000000 --- a/csharp/ql/lib/change-notes/2023-03-13-mergepathgraph.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. diff --git a/csharp/ql/lib/change-notes/released/0.5.5.md b/csharp/ql/lib/change-notes/released/0.5.5.md new file mode 100644 index 00000000000..8b5ac2e9eab --- /dev/null +++ b/csharp/ql/lib/change-notes/released/0.5.5.md @@ -0,0 +1,21 @@ +## 0.5.5 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. +* Deleted the deprecated `getAssertionIndex`, and `getAssertedParameter` predicates from the `AssertMethod` class. +* Deleted the deprecated `OverridableMethod` and `OverridableAccessor` classes. +* The `unsafe` predicate for `Modifiable` has been extended to cover delegate return types and identify pointer like types at any nest level. This is relevant for `unsafe` declarations extracted from assemblies. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index cd3f72e2513..03e491f0899 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.5.5 diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 34880f509e8..434c2e324b9 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 0.5.5-dev +version: 0.5.5 groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index b75d77162f4..0abf2626a75 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.5.5 + +No user-facing changes. + ## 0.5.4 No user-facing changes. diff --git a/csharp/ql/src/change-notes/released/0.5.5.md b/csharp/ql/src/change-notes/released/0.5.5.md new file mode 100644 index 00000000000..5f5ae32c059 --- /dev/null +++ b/csharp/ql/src/change-notes/released/0.5.5.md @@ -0,0 +1,3 @@ +## 0.5.5 + +No user-facing changes. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index cd3f72e2513..03e491f0899 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.5.5 diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 3ed4e37fefc..a2eae93dec8 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 0.5.5-dev +version: 0.5.5 groups: - csharp - queries diff --git a/go/ql/lib/CHANGELOG.md b/go/ql/lib/CHANGELOG.md index 3bab3bf2b6a..56c35b2f9fe 100644 --- a/go/ql/lib/CHANGELOG.md +++ b/go/ql/lib/CHANGELOG.md @@ -1,3 +1,18 @@ +## 0.4.5 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + ## 0.4.4 No user-facing changes. diff --git a/go/ql/lib/change-notes/2023-03-13-mergepathgraph.md b/go/ql/lib/change-notes/2023-03-13-mergepathgraph.md deleted file mode 100644 index 63bfade2f10..00000000000 --- a/go/ql/lib/change-notes/2023-03-13-mergepathgraph.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. diff --git a/java/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md b/go/ql/lib/change-notes/released/0.4.5.md similarity index 64% rename from java/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md rename to go/ql/lib/change-notes/released/0.4.5.md index 89190af399f..af3533b8018 100644 --- a/java/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md +++ b/go/ql/lib/change-notes/released/0.4.5.md @@ -1,6 +1,11 @@ ---- -category: majorAnalysis ---- +## 0.4.5 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + * The main data flow and taint tracking APIs have been changed. The old APIs remain in place for now and translate to the new through a backwards-compatible wrapper. If multiple configurations are in scope diff --git a/go/ql/lib/codeql-pack.release.yml b/go/ql/lib/codeql-pack.release.yml index e9b57993a01..466cd01cf4e 100644 --- a/go/ql/lib/codeql-pack.release.yml +++ b/go/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.4.4 +lastReleaseVersion: 0.4.5 diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 378f7b0e5e4..7770c7beaa6 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 0.4.5-dev +version: 0.4.5 groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/CHANGELOG.md b/go/ql/src/CHANGELOG.md index 89ee497c17f..e9d64e6c8e8 100644 --- a/go/ql/src/CHANGELOG.md +++ b/go/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.5 + +No user-facing changes. + ## 0.4.4 ### Minor Analysis Improvements diff --git a/go/ql/src/change-notes/released/0.4.5.md b/go/ql/src/change-notes/released/0.4.5.md new file mode 100644 index 00000000000..7ba9b2e8ade --- /dev/null +++ b/go/ql/src/change-notes/released/0.4.5.md @@ -0,0 +1,3 @@ +## 0.4.5 + +No user-facing changes. diff --git a/go/ql/src/codeql-pack.release.yml b/go/ql/src/codeql-pack.release.yml index e9b57993a01..466cd01cf4e 100644 --- a/go/ql/src/codeql-pack.release.yml +++ b/go/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.4.4 +lastReleaseVersion: 0.4.5 diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 02c9d788969..21f9f365c5e 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 0.4.5-dev +version: 0.4.5 groups: - go - queries diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index d7428d81c27..5ff003fb8cb 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,34 @@ +## 0.5.5 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* Removed low-confidence call edges to known neutral call targets from the call graph used in data flow analysis. This includes, for example, custom `List.contains` implementations when the best inferrable type at the call site is simply `List`. +* Added more sink and summary dataflow models for the following packages: + * `java.io` + * `java.lang` + * `java.sql` + * `javafx.scene.web` + * `org.apache.commons.compress.archivers.tar` + * `org.apache.http.client.utils` + * `org.codehaus.cargo.container.installer` +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. +* Deleted the deprecated `getRepresentedString` predicate from the `StringLiteral` class. +* Deleted the deprecated `ServletWriterSource` class. +* Deleted the deprecated `getGroupID`, `getArtefactID`, and `artefactMatches` predicates from the `MavenRepoJar` class. + ## 0.5.4 ### Minor Analysis Improvements diff --git a/java/ql/lib/change-notes/2023-03-03-delete-deps.md b/java/ql/lib/change-notes/2023-03-03-delete-deps.md deleted file mode 100644 index bdc84d43d26..00000000000 --- a/java/ql/lib/change-notes/2023-03-03-delete-deps.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -category: minorAnalysis ---- -* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. -* Deleted the deprecated `getRepresentedString` predicate from the `StringLiteral` class. -* Deleted the deprecated `ServletWriterSource` class. -* Deleted the deprecated `getGroupID`, `getArtefactID`, and `artefactMatches` predicates from the `MavenRepoJar` class. \ No newline at end of file diff --git a/java/ql/lib/change-notes/2023-03-09-more-models.md b/java/ql/lib/change-notes/2023-03-09-more-models.md deleted file mode 100644 index 2d763c0d22b..00000000000 --- a/java/ql/lib/change-notes/2023-03-09-more-models.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -category: majorAnalysis ---- -* Added more sink and summary dataflow models for the following packages: - * `java.io` - * `java.lang` - * `java.sql` - * `javafx.scene.web` - * `org.apache.commons.compress.archivers.tar` - * `org.apache.http.client.utils` - * `org.codehaus.cargo.container.installer` diff --git a/java/ql/lib/change-notes/2023-03-13-mergepathgraph.md b/java/ql/lib/change-notes/2023-03-13-mergepathgraph.md deleted file mode 100644 index 63bfade2f10..00000000000 --- a/java/ql/lib/change-notes/2023-03-13-mergepathgraph.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. diff --git a/java/ql/lib/change-notes/2023-03-14-neutral-dispatch.md b/java/ql/lib/change-notes/2023-03-14-neutral-dispatch.md deleted file mode 100644 index f01e8700757..00000000000 --- a/java/ql/lib/change-notes/2023-03-14-neutral-dispatch.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: majorAnalysis ---- -* Removed low-confidence call edges to known neutral call targets from the call graph used in data flow analysis. This includes, for example, custom `List.contains` implementations when the best inferrable type at the call site is simply `List`. diff --git a/java/ql/lib/change-notes/released/0.5.5.md b/java/ql/lib/change-notes/released/0.5.5.md new file mode 100644 index 00000000000..60e487e4c0c --- /dev/null +++ b/java/ql/lib/change-notes/released/0.5.5.md @@ -0,0 +1,30 @@ +## 0.5.5 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* Removed low-confidence call edges to known neutral call targets from the call graph used in data flow analysis. This includes, for example, custom `List.contains` implementations when the best inferrable type at the call site is simply `List`. +* Added more sink and summary dataflow models for the following packages: + * `java.io` + * `java.lang` + * `java.sql` + * `javafx.scene.web` + * `org.apache.commons.compress.archivers.tar` + * `org.apache.http.client.utils` + * `org.codehaus.cargo.container.installer` +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. +* Deleted the deprecated `getRepresentedString` predicate from the `StringLiteral` class. +* Deleted the deprecated `ServletWriterSource` class. +* Deleted the deprecated `getGroupID`, `getArtefactID`, and `artefactMatches` predicates from the `MavenRepoJar` class. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index cd3f72e2513..03e491f0899 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.5.5 diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index 90fcc57cebf..bf49dec886c 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 0.5.5-dev +version: 0.5.5 groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index e2a9e8a56f0..0b18bced9b3 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.5.5 + +### New Queries + +* Added a new query, `java/android/arbitrary-apk-installation`, to detect installation of APKs from untrusted sources. + ## 0.5.4 No user-facing changes. diff --git a/java/ql/src/change-notes/2023-01-19-arbitrary-apk-installation.md b/java/ql/src/change-notes/released/0.5.5.md similarity index 81% rename from java/ql/src/change-notes/2023-01-19-arbitrary-apk-installation.md rename to java/ql/src/change-notes/released/0.5.5.md index 93eb13f87d5..197c7ae1b69 100644 --- a/java/ql/src/change-notes/2023-01-19-arbitrary-apk-installation.md +++ b/java/ql/src/change-notes/released/0.5.5.md @@ -1,5 +1,5 @@ ---- -category: newQuery ---- -* Added a new query, `java/android/arbitrary-apk-installation`, to detect installation of APKs from untrusted sources. +## 0.5.5 +### New Queries + +* Added a new query, `java/android/arbitrary-apk-installation`, to detect installation of APKs from untrusted sources. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index cd3f72e2513..03e491f0899 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.5.5 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 6c1783ce1cb..1d3c43f7e28 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 0.5.5-dev +version: 0.5.5 groups: - java - queries diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index bb0c197b3f2..53553dad5f4 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,3 +1,15 @@ +## 0.5.1 + +### Minor Analysis Improvements + +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. +* Deleted the deprecated `getId` from the `Function`, `NamespaceDefinition`, and `ImportEqualsDeclaration` classes. +* Deleted the deprecated `flowsTo` predicate from the `HTTP::Servers::RequestSource` and `HTTP::Servers::ResponseSource` class. +* Deleted the deprecated `getEventName` predicate from the `SocketIO::ReceiveNode`, `SocketIO::SendNode`, `SocketIOClient::SendNode` classes. +* Deleted the deprecated `RateLimitedRouteHandlerExpr` and `RouteHandlerExpressionWithRateLimiter` classes. +* [Import assertions](https://github.com/tc39/proposal-import-assertions) are now supported. + Previously this feature was only supported in TypeScript code, but is now supported for plain JavaScript as well and is also accessible in the AST. + ## 0.5.0 ### Breaking Changes diff --git a/javascript/ql/lib/change-notes/2023-03-03-import-assertion.md b/javascript/ql/lib/change-notes/2023-03-03-import-assertion.md deleted file mode 100644 index b6ee92a6660..00000000000 --- a/javascript/ql/lib/change-notes/2023-03-03-import-assertion.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -category: minorAnalysis ---- -* [Import assertions](https://github.com/tc39/proposal-import-assertions) are now supported. - Previously this feature was only supported in TypeScript code, but is now supported for plain JavaScript as well and is also accessible in the AST. diff --git a/javascript/ql/lib/change-notes/2023-03-03-delete-deps.md b/javascript/ql/lib/change-notes/released/0.5.1.md similarity index 61% rename from javascript/ql/lib/change-notes/2023-03-03-delete-deps.md rename to javascript/ql/lib/change-notes/released/0.5.1.md index 3ac871fa8a2..972b37b573b 100644 --- a/javascript/ql/lib/change-notes/2023-03-03-delete-deps.md +++ b/javascript/ql/lib/change-notes/released/0.5.1.md @@ -1,8 +1,11 @@ ---- -category: minorAnalysis ---- +## 0.5.1 + +### Minor Analysis Improvements + * Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. * Deleted the deprecated `getId` from the `Function`, `NamespaceDefinition`, and `ImportEqualsDeclaration` classes. * Deleted the deprecated `flowsTo` predicate from the `HTTP::Servers::RequestSource` and `HTTP::Servers::ResponseSource` class. * Deleted the deprecated `getEventName` predicate from the `SocketIO::ReceiveNode`, `SocketIO::SendNode`, `SocketIOClient::SendNode` classes. -* Deleted the deprecated `RateLimitedRouteHandlerExpr` and `RouteHandlerExpressionWithRateLimiter` classes. \ No newline at end of file +* Deleted the deprecated `RateLimitedRouteHandlerExpr` and `RouteHandlerExpressionWithRateLimiter` classes. +* [Import assertions](https://github.com/tc39/proposal-import-assertions) are now supported. + Previously this feature was only supported in TypeScript code, but is now supported for plain JavaScript as well and is also accessible in the AST. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index 30e271c5361..0bf7024c337 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.0 +lastReleaseVersion: 0.5.1 diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index 22328fa622b..8eaa891b23e 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 0.5.1-dev +version: 0.5.1 groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index 2b0ef33f565..1abcc918b2c 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,3 +1,11 @@ +## 0.5.5 + +### Minor Analysis Improvements + +* The following queries now recognize HTML sanitizers as propagating taint: `js/sql-injection`, + `js/path-injection`, `js/server-side-unvalidated-url-redirection`, `js/client-side-unvalidated-url-redirection`, + and `js/request-forgery`. + ## 0.5.4 ### Minor Analysis Improvements diff --git a/javascript/ql/src/change-notes/2023-03-07-html-sanitizer-for-sql.md b/javascript/ql/src/change-notes/released/0.5.5.md similarity index 84% rename from javascript/ql/src/change-notes/2023-03-07-html-sanitizer-for-sql.md rename to javascript/ql/src/change-notes/released/0.5.5.md index b26c1caec02..78f2dd33acf 100644 --- a/javascript/ql/src/change-notes/2023-03-07-html-sanitizer-for-sql.md +++ b/javascript/ql/src/change-notes/released/0.5.5.md @@ -1,6 +1,7 @@ ---- -category: minorAnalysis ---- +## 0.5.5 + +### Minor Analysis Improvements + * The following queries now recognize HTML sanitizers as propagating taint: `js/sql-injection`, `js/path-injection`, `js/server-side-unvalidated-url-redirection`, `js/client-side-unvalidated-url-redirection`, and `js/request-forgery`. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index cd3f72e2513..03e491f0899 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.5.5 diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index eda7c965604..45819411de3 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 0.5.5-dev +version: 0.5.5 groups: - javascript - queries diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index d9ec2274496..80c3e1ddeb5 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.5 + +No user-facing changes. + ## 0.4.4 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/0.4.5.md b/misc/suite-helpers/change-notes/released/0.4.5.md new file mode 100644 index 00000000000..7ba9b2e8ade --- /dev/null +++ b/misc/suite-helpers/change-notes/released/0.4.5.md @@ -0,0 +1,3 @@ +## 0.4.5 + +No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index e9b57993a01..466cd01cf4e 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.4.4 +lastReleaseVersion: 0.4.5 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index e6e1a928060..eeda1afd1ea 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,3 +1,3 @@ name: codeql/suite-helpers -version: 0.4.5-dev +version: 0.4.5 groups: shared diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index cd00bbba31a..de1895d3b6b 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,3 +1,22 @@ +## 0.8.2 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. + ## 0.8.1 ### Major Analysis Improvements diff --git a/python/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md b/python/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md deleted file mode 100644 index 89190af399f..00000000000 --- a/python/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -category: majorAnalysis ---- -* The main data flow and taint tracking APIs have been changed. The old APIs - remain in place for now and translate to the new through a - backwards-compatible wrapper. If multiple configurations are in scope - simultaneously, then this may affect results slightly. The new API is quite - similar to the old, but makes use of a configuration module instead of a - configuration class. diff --git a/python/ql/lib/change-notes/2023-03-03-delete-deps.md b/python/ql/lib/change-notes/2023-03-03-delete-deps.md deleted file mode 100644 index 887db05e8c9..00000000000 --- a/python/ql/lib/change-notes/2023-03-03-delete-deps.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: minorAnalysis ---- -* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. \ No newline at end of file diff --git a/python/ql/lib/change-notes/2023-03-13-mergepathgraph.md b/python/ql/lib/change-notes/2023-03-13-mergepathgraph.md deleted file mode 100644 index 63bfade2f10..00000000000 --- a/python/ql/lib/change-notes/2023-03-13-mergepathgraph.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. diff --git a/go/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md b/python/ql/lib/change-notes/released/0.8.2.md similarity index 53% rename from go/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md rename to python/ql/lib/change-notes/released/0.8.2.md index 89190af399f..6855fdaf72a 100644 --- a/go/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md +++ b/python/ql/lib/change-notes/released/0.8.2.md @@ -1,9 +1,18 @@ ---- -category: majorAnalysis ---- +## 0.8.2 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + * The main data flow and taint tracking APIs have been changed. The old APIs remain in place for now and translate to the new through a backwards-compatible wrapper. If multiple configurations are in scope simultaneously, then this may affect results slightly. The new API is quite similar to the old, but makes use of a configuration module instead of a configuration class. + +### Minor Analysis Improvements + +* Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index 2f693f95ba6..404110129dc 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.8.1 +lastReleaseVersion: 0.8.2 diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index 77b07a5c101..c25f554065b 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 0.8.2-dev +version: 0.8.2 groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index aa03127e160..3872807e4c5 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.6.5 + +### New Queries + +* Added a new query, `py/shell-command-constructed-from-input`, to detect libraries that unsafely construct shell commands from their inputs. + ## 0.6.4 No user-facing changes. diff --git a/python/ql/src/change-notes/2023-02-03-unsafe-shell-command-construction.md b/python/ql/src/change-notes/released/0.6.5.md similarity index 84% rename from python/ql/src/change-notes/2023-02-03-unsafe-shell-command-construction.md rename to python/ql/src/change-notes/released/0.6.5.md index 0654a93582b..90a9171e732 100644 --- a/python/ql/src/change-notes/2023-02-03-unsafe-shell-command-construction.md +++ b/python/ql/src/change-notes/released/0.6.5.md @@ -1,4 +1,5 @@ ---- -category: newQuery ---- +## 0.6.5 + +### New Queries + * Added a new query, `py/shell-command-constructed-from-input`, to detect libraries that unsafely construct shell commands from their inputs. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index ced8cf94614..86780fb6148 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.4 +lastReleaseVersion: 0.6.5 diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 99238b665e5..c3808c0e9f0 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 0.6.5-dev +version: 0.6.5 groups: - python - queries diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index 9613a598176..167403aac71 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,3 +1,29 @@ +## 0.5.5 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Data flow through `initialize` methods is now taken into account also when the receiver of a `new` call is an (implicit or explicit) `self`. +* The Active Record query methods `reorder` and `count_by_sql` are now recognised as SQL executions. +* Calls to `ActiveRecord::Connection#execute`, including those via subclasses, are now recognised as SQL executions. +* Data flow through `ActionController::Parameters#require` is now tracked properly. +* The severity of parse errors was reduced to warning (previously error). +* Deleted the deprecated `getQualifiedName` predicate from the `ConstantWriteAccess` class. +* Deleted the deprecated `getWhenBranch` and `getAWhenBranch` predicates from the `CaseExpr` class. +* Deleted the deprecated `Self`, `PatternParameter`, `Pattern`, `VariablePattern`, `TuplePattern`, and `TuplePatternParameter` classes. + ## 0.5.4 ### Minor Analysis Improvements diff --git a/ruby/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md b/ruby/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md deleted file mode 100644 index 89190af399f..00000000000 --- a/ruby/ql/lib/change-notes/2023-03-02-dataflow-conf-module.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -category: majorAnalysis ---- -* The main data flow and taint tracking APIs have been changed. The old APIs - remain in place for now and translate to the new through a - backwards-compatible wrapper. If multiple configurations are in scope - simultaneously, then this may affect results slightly. The new API is quite - similar to the old, but makes use of a configuration module instead of a - configuration class. diff --git a/ruby/ql/lib/change-notes/2023-03-03-delete-deps.md b/ruby/ql/lib/change-notes/2023-03-03-delete-deps.md deleted file mode 100644 index aab1e76bf70..00000000000 --- a/ruby/ql/lib/change-notes/2023-03-03-delete-deps.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -category: minorAnalysis ---- -* Deleted the deprecated `getQualifiedName` predicate from the `ConstantWriteAccess` class. -* Deleted the deprecated `getWhenBranch` and `getAWhenBranch` predicates from the `CaseExpr` class. -* Deleted the deprecated `Self`, `PatternParameter`, `Pattern`, `VariablePattern`, `TuplePattern`, and `TuplePatternParameter` classes. \ No newline at end of file diff --git a/ruby/ql/lib/change-notes/2023-03-09-parse-error.md b/ruby/ql/lib/change-notes/2023-03-09-parse-error.md deleted file mode 100644 index da07ab22b5f..00000000000 --- a/ruby/ql/lib/change-notes/2023-03-09-parse-error.md +++ /dev/null @@ -1,4 +0,0 @@ ---- - category: minorAnalysis ---- -* The severity of parse errors was reduced to warning (previously error). diff --git a/ruby/ql/lib/change-notes/2023-03-13-initalize-flow.md b/ruby/ql/lib/change-notes/2023-03-13-initalize-flow.md deleted file mode 100644 index bc366496e6f..00000000000 --- a/ruby/ql/lib/change-notes/2023-03-13-initalize-flow.md +++ /dev/null @@ -1,4 +0,0 @@ ---- - category: minorAnalysis ---- -* Data flow through `initialize` methods is now taken into account also when the receiver of a `new` call is an (implicit or explicit) `self`. diff --git a/ruby/ql/lib/change-notes/2023-03-13-mergepathgraph.md b/ruby/ql/lib/change-notes/2023-03-13-mergepathgraph.md deleted file mode 100644 index 63bfade2f10..00000000000 --- a/ruby/ql/lib/change-notes/2023-03-13-mergepathgraph.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: feature ---- -* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. diff --git a/ruby/ql/lib/change-notes/2023-03-13-rails-sinks.md b/ruby/ql/lib/change-notes/2023-03-13-rails-sinks.md deleted file mode 100644 index 6827b2755ed..00000000000 --- a/ruby/ql/lib/change-notes/2023-03-13-rails-sinks.md +++ /dev/null @@ -1,6 +0,0 @@ ---- - category: minorAnalysis ---- -* The Active Record query methods `reorder` and `count_by_sql` are now recognised as SQL executions. -* Calls to `ActiveRecord::Connection#execute`, including those via subclasses, are now recognised as SQL executions. -* Data flow through `ActionController::Parameters#require` is now tracked properly. \ No newline at end of file diff --git a/ruby/ql/lib/change-notes/released/0.5.5.md b/ruby/ql/lib/change-notes/released/0.5.5.md new file mode 100644 index 00000000000..38877dbfebf --- /dev/null +++ b/ruby/ql/lib/change-notes/released/0.5.5.md @@ -0,0 +1,25 @@ +## 0.5.5 + +### New Features + +* Added support for merging two `PathGraph`s via disjoint union to allow results from multiple data flow computations in a single `path-problem` query. + +### Major Analysis Improvements + +* The main data flow and taint tracking APIs have been changed. The old APIs + remain in place for now and translate to the new through a + backwards-compatible wrapper. If multiple configurations are in scope + simultaneously, then this may affect results slightly. The new API is quite + similar to the old, but makes use of a configuration module instead of a + configuration class. + +### Minor Analysis Improvements + +* Data flow through `initialize` methods is now taken into account also when the receiver of a `new` call is an (implicit or explicit) `self`. +* The Active Record query methods `reorder` and `count_by_sql` are now recognised as SQL executions. +* Calls to `ActiveRecord::Connection#execute`, including those via subclasses, are now recognised as SQL executions. +* Data flow through `ActionController::Parameters#require` is now tracked properly. +* The severity of parse errors was reduced to warning (previously error). +* Deleted the deprecated `getQualifiedName` predicate from the `ConstantWriteAccess` class. +* Deleted the deprecated `getWhenBranch` and `getAWhenBranch` predicates from the `CaseExpr` class. +* Deleted the deprecated `Self`, `PatternParameter`, `Pattern`, `VariablePattern`, `TuplePattern`, and `TuplePatternParameter` classes. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index cd3f72e2513..03e491f0899 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.5.5 diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index 767902b86d9..ecd2b8b0a00 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 0.5.5-dev +version: 0.5.5 groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index 03759edabe6..39ca0718982 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.5.5 + +### New Queries + +* Added a new query, `rb/zip-slip`, to detect arbitrary file writes during extraction of zip/tar archives. + ## 0.5.4 No user-facing changes. diff --git a/ruby/ql/src/change-notes/2023-02-17-zip-slip-query.md b/ruby/ql/src/change-notes/2023-02-17-zip-slip-query.md deleted file mode 100644 index ebf17acb7be..00000000000 --- a/ruby/ql/src/change-notes/2023-02-17-zip-slip-query.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -category: newQuery ---- -* Added a new query, `rb/zip-slip`, to detect arbitrary file writes during extraction of zip/tar archives. \ No newline at end of file diff --git a/ruby/ql/src/change-notes/released/0.5.5.md b/ruby/ql/src/change-notes/released/0.5.5.md new file mode 100644 index 00000000000..20cdffb6307 --- /dev/null +++ b/ruby/ql/src/change-notes/released/0.5.5.md @@ -0,0 +1,5 @@ +## 0.5.5 + +### New Queries + +* Added a new query, `rb/zip-slip`, to detect arbitrary file writes during extraction of zip/tar archives. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index cd3f72e2513..03e491f0899 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.5.4 +lastReleaseVersion: 0.5.5 diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index ca67c75eca6..08c92e6b22a 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 0.5.5-dev +version: 0.5.5 groups: - ruby - queries diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index cf315546ed9..771960678f5 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.9 + +No user-facing changes. + ## 0.0.8 No user-facing changes. diff --git a/shared/regex/change-notes/released/0.0.9.md b/shared/regex/change-notes/released/0.0.9.md new file mode 100644 index 00000000000..c9e17c6d6cf --- /dev/null +++ b/shared/regex/change-notes/released/0.0.9.md @@ -0,0 +1,3 @@ +## 0.0.9 + +No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index 58fdc6b45de..ecdd64fbab8 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.8 +lastReleaseVersion: 0.0.9 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index f688e4a8e28..ddf814e93b5 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 0.0.9-dev +version: 0.0.9 groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index b051605d8b6..68bd110c267 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.13 + +No user-facing changes. + ## 0.0.12 No user-facing changes. diff --git a/shared/ssa/change-notes/released/0.0.13.md b/shared/ssa/change-notes/released/0.0.13.md new file mode 100644 index 00000000000..f679eaf0313 --- /dev/null +++ b/shared/ssa/change-notes/released/0.0.13.md @@ -0,0 +1,3 @@ +## 0.0.13 + +No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index 997fb8da83c..044e54e4f7e 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.12 +lastReleaseVersion: 0.0.13 diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index da55082c66b..ae3687f98c1 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/ssa -version: 0.0.13-dev +version: 0.0.13 groups: shared library: true diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index c2a0dedaa8e..282cc1b4857 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.6 + +No user-facing changes. + ## 0.0.5 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/0.0.6.md b/shared/tutorial/change-notes/released/0.0.6.md new file mode 100644 index 00000000000..ccbce856079 --- /dev/null +++ b/shared/tutorial/change-notes/released/0.0.6.md @@ -0,0 +1,3 @@ +## 0.0.6 + +No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index bb45a1ab018..cf398ce02aa 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.5 +lastReleaseVersion: 0.0.6 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index b1958a441e0..f1f209426c4 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 0.0.6-dev +version: 0.0.6 groups: shared library: true diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index 8d859f9b9e6..9e7951e8ea8 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.6 + +No user-facing changes. + ## 0.0.5 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/0.0.6.md b/shared/typetracking/change-notes/released/0.0.6.md new file mode 100644 index 00000000000..ccbce856079 --- /dev/null +++ b/shared/typetracking/change-notes/released/0.0.6.md @@ -0,0 +1,3 @@ +## 0.0.6 + +No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index bb45a1ab018..cf398ce02aa 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.5 +lastReleaseVersion: 0.0.6 diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index c1d91c841cb..93e5003b9be 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 0.0.6-dev +version: 0.0.6 groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index 803a23bed1a..5c1e2e83225 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.13 + +No user-facing changes. + ## 0.0.12 No user-facing changes. diff --git a/shared/typos/change-notes/released/0.0.13.md b/shared/typos/change-notes/released/0.0.13.md new file mode 100644 index 00000000000..f679eaf0313 --- /dev/null +++ b/shared/typos/change-notes/released/0.0.13.md @@ -0,0 +1,3 @@ +## 0.0.13 + +No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index 997fb8da83c..044e54e4f7e 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.12 +lastReleaseVersion: 0.0.13 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index e913e54cb72..723b891ab21 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/typos -version: 0.0.13-dev +version: 0.0.13 groups: shared library: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index 152fb894277..3d405b525ea 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.6 + +No user-facing changes. + ## 0.0.5 No user-facing changes. diff --git a/shared/util/change-notes/released/0.0.6.md b/shared/util/change-notes/released/0.0.6.md new file mode 100644 index 00000000000..ccbce856079 --- /dev/null +++ b/shared/util/change-notes/released/0.0.6.md @@ -0,0 +1,3 @@ +## 0.0.6 + +No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index bb45a1ab018..cf398ce02aa 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.5 +lastReleaseVersion: 0.0.6 diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index 27ebf28723d..b6cab33264f 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 0.0.6-dev +version: 0.0.6 groups: shared library: true dependencies: From e7079b35bcff50ad320d66f3b0b07dc5eed5e7ac Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Thu, 16 Mar 2023 14:28:17 +0100 Subject: [PATCH 028/143] Apply suggestions from code review --- csharp/ql/lib/CHANGELOG.md | 2 +- csharp/ql/lib/change-notes/released/0.5.5.md | 2 +- ruby/ql/lib/CHANGELOG.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 4256614c2ee..bf400a54378 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -18,7 +18,7 @@ * Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. * Deleted the deprecated `getAssertionIndex`, and `getAssertedParameter` predicates from the `AssertMethod` class. * Deleted the deprecated `OverridableMethod` and `OverridableAccessor` classes. -* The `unsafe` predicate for `Modifiable` has been extended to cover delegate return types and identify pointer like types at any nest level. This is relevant for `unsafe` declarations extracted from assemblies. +* The `unsafe` predicate for `Modifiable` has been extended to cover delegate return types and identify pointer-like types at any nest level. This is relevant for `unsafe` declarations extracted from assemblies. ## 0.5.4 diff --git a/csharp/ql/lib/change-notes/released/0.5.5.md b/csharp/ql/lib/change-notes/released/0.5.5.md index 8b5ac2e9eab..873ac6839e3 100644 --- a/csharp/ql/lib/change-notes/released/0.5.5.md +++ b/csharp/ql/lib/change-notes/released/0.5.5.md @@ -18,4 +18,4 @@ * Deleted the deprecated `getPath` and `getFolder` predicates from the `XmlFile` class. * Deleted the deprecated `getAssertionIndex`, and `getAssertedParameter` predicates from the `AssertMethod` class. * Deleted the deprecated `OverridableMethod` and `OverridableAccessor` classes. -* The `unsafe` predicate for `Modifiable` has been extended to cover delegate return types and identify pointer like types at any nest level. This is relevant for `unsafe` declarations extracted from assemblies. +* The `unsafe` predicate for `Modifiable` has been extended to cover delegate return types and identify pointer-like types at any nest level. This is relevant for `unsafe` declarations extracted from assemblies. diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index 167403aac71..fd99d1504a2 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -16,8 +16,8 @@ ### Minor Analysis Improvements * Data flow through `initialize` methods is now taken into account also when the receiver of a `new` call is an (implicit or explicit) `self`. -* The Active Record query methods `reorder` and `count_by_sql` are now recognised as SQL executions. -* Calls to `ActiveRecord::Connection#execute`, including those via subclasses, are now recognised as SQL executions. +* The Active Record query methods `reorder` and `count_by_sql` are now recognized as SQL executions. +* Calls to `ActiveRecord::Connection#execute`, including those via subclasses, are now recognized as SQL executions. * Data flow through `ActionController::Parameters#require` is now tracked properly. * The severity of parse errors was reduced to warning (previously error). * Deleted the deprecated `getQualifiedName` predicate from the `ConstantWriteAccess` class. From 66b03dbd1d45ad0d33a2bae98a97f41b3b00f597 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Thu, 16 Mar 2023 14:29:16 +0100 Subject: [PATCH 029/143] Apply suggestions from code review --- ruby/ql/lib/change-notes/released/0.5.5.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ruby/ql/lib/change-notes/released/0.5.5.md b/ruby/ql/lib/change-notes/released/0.5.5.md index 38877dbfebf..a6c6618886d 100644 --- a/ruby/ql/lib/change-notes/released/0.5.5.md +++ b/ruby/ql/lib/change-notes/released/0.5.5.md @@ -16,8 +16,8 @@ ### Minor Analysis Improvements * Data flow through `initialize` methods is now taken into account also when the receiver of a `new` call is an (implicit or explicit) `self`. -* The Active Record query methods `reorder` and `count_by_sql` are now recognised as SQL executions. -* Calls to `ActiveRecord::Connection#execute`, including those via subclasses, are now recognised as SQL executions. +* The Active Record query methods `reorder` and `count_by_sql` are now recognized as SQL executions. +* Calls to `ActiveRecord::Connection#execute`, including those via subclasses, are now recognized as SQL executions. * Data flow through `ActionController::Parameters#require` is now tracked properly. * The severity of parse errors was reduced to warning (previously error). * Deleted the deprecated `getQualifiedName` predicate from the `ConstantWriteAccess` class. From d4020ad3059a1ee4fbe0d26becbab708fee1a9fe Mon Sep 17 00:00:00 2001 From: Harry Maclean Date: Fri, 17 Mar 2023 10:31:58 +1300 Subject: [PATCH 030/143] Ruby: Run extractor test on centos 7 --- .github/workflows/ruby-build.yml | 39 ++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/.github/workflows/ruby-build.yml b/.github/workflows/ruby-build.yml index 1e7746c8c40..b06fc70bf9e 100644 --- a/.github/workflows/ruby-build.yml +++ b/.github/workflows/ruby-build.yml @@ -235,3 +235,42 @@ jobs: shell: bash run: | codeql database analyze --search-path "${{ runner.temp }}/ruby-bundle" --format=sarifv2.1.0 --output=out.sarif ../database ruby-code-scanning.qls + + # This is a copy of the 'test' job that runs in a centos7 container. + # This tests that the extractor works correctly on systems with an old glibc. + test-centos7: + defaults: + run: + working-directory: ${{ github.workspace }} + strategy: + fail-fast: false + runs-on: ubuntu-latest + container: + image: centos:centos7 + needs: [package] + steps: + - uses: actions/checkout@v3 + - name: Fetch CodeQL + uses: ./.github/actions/fetch-codeql + + - name: Download Ruby bundle + uses: actions/download-artifact@v3 + with: + name: codeql-ruby-bundle + path: ${{ runner.temp }} + - name: Unzip Ruby bundle + shell: bash + run: unzip -q -d "${{ runner.temp }}/ruby-bundle" "${{ runner.temp }}/codeql-ruby-bundle.zip" + + - name: Run QL test + shell: bash + run: | + codeql test run --search-path "${{ runner.temp }}/ruby-bundle" --additional-packs "${{ runner.temp }}/ruby-bundle" ruby/ql/test/library-tests/ast/constants/ + - name: Create database + shell: bash + run: | + codeql database create --search-path "${{ runner.temp }}/ruby-bundle" --language ruby --source-root ruby/ql/test/library-tests/ast/constants/ ../database + - name: Analyze database + shell: bash + run: | + codeql database analyze --search-path "${{ runner.temp }}/ruby-bundle" --format=sarifv2.1.0 --output=out.sarif ../database ruby-code-scanning.qls From c447e125bbd775f6f407c1495ecfe6fb4093c8ec Mon Sep 17 00:00:00 2001 From: Harry Maclean Date: Fri, 17 Mar 2023 10:59:49 +1300 Subject: [PATCH 031/143] Ruby: Install gh cli in centos7 test --- .github/workflows/ruby-build.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ruby-build.yml b/.github/workflows/ruby-build.yml index b06fc70bf9e..3449c87fdaa 100644 --- a/.github/workflows/ruby-build.yml +++ b/.github/workflows/ruby-build.yml @@ -247,8 +247,14 @@ jobs: runs-on: ubuntu-latest container: image: centos:centos7 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} needs: [package] steps: + - name: Install gh cli + run: | + yum-config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo + yum install -y gh - uses: actions/checkout@v3 - name: Fetch CodeQL uses: ./.github/actions/fetch-codeql From 2abb03304dc2ee0db01872492b7440578d55d6ad Mon Sep 17 00:00:00 2001 From: Harry Maclean Date: Fri, 17 Mar 2023 11:56:04 +1300 Subject: [PATCH 032/143] Install required dependencies for gh in centos 7 --- .github/workflows/ruby-build.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ruby-build.yml b/.github/workflows/ruby-build.yml index 3449c87fdaa..a40c19662f5 100644 --- a/.github/workflows/ruby-build.yml +++ b/.github/workflows/ruby-build.yml @@ -254,7 +254,10 @@ jobs: - name: Install gh cli run: | yum-config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo - yum install -y gh + # fetch-codeql requires unzip and jq + # jq is available in epel-release (https://docs.fedoraproject.org/en-US/epel/) + yum install -y gh unzip epel-release + yum install -y jq - uses: actions/checkout@v3 - name: Fetch CodeQL uses: ./.github/actions/fetch-codeql From 5332344e5d4ad8e87b7ada11f780754d89a14e89 Mon Sep 17 00:00:00 2001 From: Harry Maclean Date: Fri, 17 Mar 2023 12:13:30 +1300 Subject: [PATCH 033/143] Work around github actions bug --- .github/workflows/ruby-build.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ruby-build.yml b/.github/workflows/ruby-build.yml index a40c19662f5..1445d0c6589 100644 --- a/.github/workflows/ruby-build.yml +++ b/.github/workflows/ruby-build.yml @@ -262,24 +262,29 @@ jobs: - name: Fetch CodeQL uses: ./.github/actions/fetch-codeql + # Due to a bug in Actions, we can't use runner.temp here. + # https://github.com/actions/runner/issues/2185 + - name: Ensure temp directory exists + run: mkdir -p /tmp + - name: Download Ruby bundle uses: actions/download-artifact@v3 with: name: codeql-ruby-bundle - path: ${{ runner.temp }} + path: /tmp - name: Unzip Ruby bundle shell: bash - run: unzip -q -d "${{ runner.temp }}/ruby-bundle" "${{ runner.temp }}/codeql-ruby-bundle.zip" + run: unzip -q -d /tmp/ruby-bundle /tmp/codeql-ruby-bundle.zip - name: Run QL test shell: bash run: | - codeql test run --search-path "${{ runner.temp }}/ruby-bundle" --additional-packs "${{ runner.temp }}/ruby-bundle" ruby/ql/test/library-tests/ast/constants/ + codeql test run --search-path /tmp/ruby-bundle --additional-packs /tmp/ruby-bundle ruby/ql/test/library-tests/ast/constants/ - name: Create database shell: bash run: | - codeql database create --search-path "${{ runner.temp }}/ruby-bundle" --language ruby --source-root ruby/ql/test/library-tests/ast/constants/ ../database + codeql database create --search-path /tmp/ruby-bundle --language ruby --source-root ruby/ql/test/library-tests/ast/constants/ ../database - name: Analyze database shell: bash run: | - codeql database analyze --search-path "${{ runner.temp }}/ruby-bundle" --format=sarifv2.1.0 --output=out.sarif ../database ruby-code-scanning.qls + codeql database analyze --search-path /tmp/ruby-bundle --format=sarifv2.1.0 --output=out.sarif ../database ruby-code-scanning.qls From 981e171525e81c5481e7d5bb613d0c0ea03b03cc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 17 Mar 2023 13:27:00 +0000 Subject: [PATCH 034/143] Post-release preparation for codeql-cli-2.12.5 --- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/qlpack.yml | 2 +- 23 files changed, 23 insertions(+), 23 deletions(-) diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index 5a75c36d89d..12ad778c119 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 0.6.0 +version: 0.6.1-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index 88e2c2a1921..eb82996adba 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 0.5.5 +version: 0.5.6-dev groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index cbc4e04bfe6..2b2be57e934 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.4.5 +version: 1.4.6-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index e7f9d67aa66..e588fb9218e 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.4.5 +version: 1.4.6-dev groups: - csharp - solorigate diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 434c2e324b9..9c1c247e967 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 0.5.5 +version: 0.5.6-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index a2eae93dec8..36a7fe45eee 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 0.5.5 +version: 0.5.6-dev groups: - csharp - queries diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 7770c7beaa6..a8601ec94b7 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 0.4.5 +version: 0.4.6-dev groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index 21f9f365c5e..86760bca0f9 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 0.4.5 +version: 0.4.6-dev groups: - go - queries diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index bf49dec886c..263e9321c54 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 0.5.5 +version: 0.5.6-dev groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 1d3c43f7e28..6295db39e31 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 0.5.5 +version: 0.5.6-dev groups: - java - queries diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index 8eaa891b23e..5c650164c39 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 0.5.1 +version: 0.5.2-dev groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 45819411de3..ca8f353446a 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 0.5.5 +version: 0.5.6-dev groups: - javascript - queries diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index eeda1afd1ea..11aa41479a2 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,3 +1,3 @@ name: codeql/suite-helpers -version: 0.4.5 +version: 0.4.6-dev groups: shared diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index c25f554065b..35773496d10 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 0.8.2 +version: 0.8.3-dev groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index c3808c0e9f0..0de886af534 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 0.6.5 +version: 0.6.6-dev groups: - python - queries diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index ecd2b8b0a00..0cbb3cc99da 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 0.5.5 +version: 0.5.6-dev groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 08c92e6b22a..58e6d53f3bc 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 0.5.5 +version: 0.5.6-dev groups: - ruby - queries diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index ddf814e93b5..245e2e6b546 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 0.0.9 +version: 0.0.10-dev groups: shared library: true dependencies: diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index ae3687f98c1..573e0fdb8dc 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/ssa -version: 0.0.13 +version: 0.0.14-dev groups: shared library: true diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index f1f209426c4..529717d22d8 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 0.0.6 +version: 0.0.7-dev groups: shared library: true diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index 93e5003b9be..59d5f4d66e1 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 0.0.6 +version: 0.0.7-dev groups: shared library: true dependencies: diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 723b891ab21..ec9b54559f6 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/typos -version: 0.0.13 +version: 0.0.14-dev groups: shared library: true diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index b6cab33264f..9fe13ca503a 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 0.0.6 +version: 0.0.7-dev groups: shared library: true dependencies: From a9ef3f95a2bea1d58ea5f334e09bb51ab0a22c83 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 20 Mar 2023 09:33:30 +0100 Subject: [PATCH 035/143] Ruby: Introduce `ContentSet::isElementOfType[OrUnknown]/1` --- .../dataflow/internal/DataFlowPrivate.qll | 6 ++- .../ruby/dataflow/internal/DataFlowPublic.qll | 43 ++++++++++++++++++- .../security/UnsafeCodeConstructionQuery.qll | 4 +- .../UnsafeShellCommandConstructionQuery.qll | 4 +- .../ruby/typetracking/TypeTrackerSpecific.qll | 6 +++ .../flow-summaries/semantics.expected | 42 ++++++++++++++++++ .../dataflow/flow-summaries/semantics.rb | 8 ++-- 7 files changed, 101 insertions(+), 12 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index 82a5271e9b9..cfce508e706 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -1,3 +1,4 @@ +private import codeql.util.Boolean private import codeql.ruby.AST private import codeql.ruby.ast.internal.Synthesis private import codeql.ruby.CFG @@ -456,12 +457,15 @@ private module Cached { FlowSummaryImplSpecific::ParsePositions::isParsedElementLowerBoundPosition(_, includeUnknown, lower) } or + TElementContentOfTypeContent(string type, Boolean includeUnknown) { + type = any(Content::KnownElementContent content).getIndex().getValueType() + } or TNoContentSet() // Only used by type-tracking cached class TContentSet = TSingletonContent or TAnyElementContent or TKnownOrUnknownElementContent or - TElementLowerBoundContent; + TElementLowerBoundContent or TElementContentOfTypeContent; private predicate trackKnownValue(ConstantValue cv) { not cv.isFloat(_) and diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll index 4ea02818c92..418e3f621d2 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPublic.qll @@ -534,6 +534,21 @@ class ContentSet extends TContentSet { this = TElementLowerBoundContent(lower, true) } + /** + * Holds if this content set represents all `KnownElementContent`s where + * the index is of type `type`, as per `ConstantValue::getValueType/0`. + */ + predicate isElementOfType(string type) { this = TElementContentOfTypeContent(type, false) } + + /** + * Holds if this content set represents `UnknownElementContent` unioned with + * all `KnownElementContent`s where the index is of type `type`, as per + * `ConstantValue::getValueType/0`. + */ + predicate isElementOfTypeOrUnknown(string type) { + this = TElementContentOfTypeContent(type, true) + } + /** Gets a textual representation of this content set. */ string toString() { exists(Content c | @@ -558,6 +573,16 @@ class ContentSet extends TContentSet { includeUnknown = true and result = lower + ".." ) + or + exists(string type, boolean includeUnknown | + this = TElementContentOfTypeContent(type, includeUnknown) + | + includeUnknown = false and + result = "any(" + type + ")!" + or + includeUnknown = true and + result = "any(" + type + ")" + ) } /** Gets a content that may be stored into when storing into this set. */ @@ -576,7 +601,14 @@ class ContentSet extends TContentSet { // step that store only into `1` this.isKnownOrUnknownElement(result) or - this.isElementLowerBound(_) and + // These reverse stores are not as accurate as they could be, but making + // them more accurate would result in a large fan-out + ( + this.isElementLowerBound(_) or + this.isElementLowerBoundOrUnknown(_) or + this.isElementOfType(_) or + this.isElementOfTypeOrUnknown(_) + ) and result = TUnknownElementContent() } @@ -603,6 +635,15 @@ class ContentSet extends TContentSet { includeUnknown = true and result = TUnknownElementContent() ) + or + exists(string type, boolean includeUnknown | + this = TElementContentOfTypeContent(type, includeUnknown) + | + type = result.(Content::KnownElementContent).getIndex().getValueType() + or + includeUnknown = true and + result = TUnknownElementContent() + ) } } diff --git a/ruby/ql/lib/codeql/ruby/security/UnsafeCodeConstructionQuery.qll b/ruby/ql/lib/codeql/ruby/security/UnsafeCodeConstructionQuery.qll index e0d9508c4a8..c5b5c5489a2 100644 --- a/ruby/ql/lib/codeql/ruby/security/UnsafeCodeConstructionQuery.qll +++ b/ruby/ql/lib/codeql/ruby/security/UnsafeCodeConstructionQuery.qll @@ -34,8 +34,6 @@ class Configuration extends TaintTracking::Configuration { override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet set) { // allow implicit reads of array elements this.isSink(node) and - set.isKnownOrUnknownElement(any(DataFlow::Content::KnownElementContent content | - content.getIndex().getValueType() = "int" - )) + set.isElementOfTypeOrUnknown("int") } } diff --git a/ruby/ql/lib/codeql/ruby/security/UnsafeShellCommandConstructionQuery.qll b/ruby/ql/lib/codeql/ruby/security/UnsafeShellCommandConstructionQuery.qll index 49f03f18144..35ff4ffea97 100644 --- a/ruby/ql/lib/codeql/ruby/security/UnsafeShellCommandConstructionQuery.qll +++ b/ruby/ql/lib/codeql/ruby/security/UnsafeShellCommandConstructionQuery.qll @@ -36,8 +36,6 @@ class Configuration extends TaintTracking::Configuration { override predicate allowImplicitRead(DataFlow::Node node, DataFlow::ContentSet set) { // allow implicit reads of array elements this.isSink(node) and - set.isKnownOrUnknownElement(any(DataFlow::Content::KnownElementContent content | - content.getIndex().getValueType() = "int" - )) + set.isElementOfTypeOrUnknown("int") } } diff --git a/ruby/ql/lib/codeql/ruby/typetracking/TypeTrackerSpecific.qll b/ruby/ql/lib/codeql/ruby/typetracking/TypeTrackerSpecific.qll index cc11b6b2a87..69ac88c777e 100644 --- a/ruby/ql/lib/codeql/ruby/typetracking/TypeTrackerSpecific.qll +++ b/ruby/ql/lib/codeql/ruby/typetracking/TypeTrackerSpecific.qll @@ -449,6 +449,8 @@ private ContentFilter getFilterFromWithoutContentStep(DataFlow::ContentSet conte or content.isElementLowerBoundOrUnknown(_) or + content.isElementOfTypeOrUnknown(_) + or content.isSingleton(any(DataFlow::Content::UnknownElementContent c)) ) and result = MkElementFilter() @@ -484,6 +486,10 @@ private ContentFilter getFilterFromWithContentStep(DataFlow::ContentSet content) or content.isElementLowerBoundOrUnknown(_) or + content.isElementOfType(_) + or + content.isElementOfTypeOrUnknown(_) + or content.isSingleton(any(DataFlow::Content::ElementContent c)) ) and result = MkElementFilter() diff --git a/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected b/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected index 63405c9785e..4ef45d2ae92 100644 --- a/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected +++ b/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected @@ -248,6 +248,26 @@ edges | semantics.rb:221:14:221:14 | h [element 2] : | semantics.rb:221:10:221:15 | call to s27 | | semantics.rb:221:14:221:14 | h [element] : | semantics.rb:221:10:221:15 | call to s27 | | semantics.rb:221:14:221:14 | h [element] : | semantics.rb:221:10:221:15 | call to s27 | +| semantics.rb:225:9:225:18 | call to source : | semantics.rb:226:13:226:13 | a : | +| semantics.rb:225:9:225:18 | call to source : | semantics.rb:226:13:226:13 | a : | +| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:227:10:227:10 | x [element] : | +| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:227:10:227:10 | x [element] : | +| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:228:10:228:10 | x [element] : | +| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:228:10:228:10 | x [element] : | +| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:229:10:229:10 | x [element] : | +| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:229:10:229:10 | x [element] : | +| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:230:10:230:10 | x [element] : | +| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:230:10:230:10 | x [element] : | +| semantics.rb:226:13:226:13 | a : | semantics.rb:226:9:226:14 | call to s28 [element] : | +| semantics.rb:226:13:226:13 | a : | semantics.rb:226:9:226:14 | call to s28 [element] : | +| semantics.rb:227:10:227:10 | x [element] : | semantics.rb:227:10:227:13 | ...[...] | +| semantics.rb:227:10:227:10 | x [element] : | semantics.rb:227:10:227:13 | ...[...] | +| semantics.rb:228:10:228:10 | x [element] : | semantics.rb:228:10:228:13 | ...[...] | +| semantics.rb:228:10:228:10 | x [element] : | semantics.rb:228:10:228:13 | ...[...] | +| semantics.rb:229:10:229:10 | x [element] : | semantics.rb:229:10:229:13 | ...[...] | +| semantics.rb:229:10:229:10 | x [element] : | semantics.rb:229:10:229:13 | ...[...] | +| semantics.rb:230:10:230:10 | x [element] : | semantics.rb:230:10:230:13 | ...[...] | +| semantics.rb:230:10:230:10 | x [element] : | semantics.rb:230:10:230:13 | ...[...] | | semantics.rb:235:9:235:18 | call to source : | semantics.rb:240:5:240:5 | [post] h [element 1] : | | semantics.rb:235:9:235:18 | call to source : | semantics.rb:240:5:240:5 | [post] h [element 1] : | | semantics.rb:236:9:236:18 | call to source : | semantics.rb:241:5:241:5 | [post] h [element 2] : | @@ -1206,6 +1226,28 @@ nodes | semantics.rb:221:14:221:14 | h [element 2] : | semmle.label | h [element 2] : | | semantics.rb:221:14:221:14 | h [element] : | semmle.label | h [element] : | | semantics.rb:221:14:221:14 | h [element] : | semmle.label | h [element] : | +| semantics.rb:225:9:225:18 | call to source : | semmle.label | call to source : | +| semantics.rb:225:9:225:18 | call to source : | semmle.label | call to source : | +| semantics.rb:226:9:226:14 | call to s28 [element] : | semmle.label | call to s28 [element] : | +| semantics.rb:226:9:226:14 | call to s28 [element] : | semmle.label | call to s28 [element] : | +| semantics.rb:226:13:226:13 | a : | semmle.label | a : | +| semantics.rb:226:13:226:13 | a : | semmle.label | a : | +| semantics.rb:227:10:227:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:227:10:227:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:227:10:227:13 | ...[...] | semmle.label | ...[...] | +| semantics.rb:227:10:227:13 | ...[...] | semmle.label | ...[...] | +| semantics.rb:228:10:228:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:228:10:228:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:228:10:228:13 | ...[...] | semmle.label | ...[...] | +| semantics.rb:228:10:228:13 | ...[...] | semmle.label | ...[...] | +| semantics.rb:229:10:229:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:229:10:229:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:229:10:229:13 | ...[...] | semmle.label | ...[...] | +| semantics.rb:229:10:229:13 | ...[...] | semmle.label | ...[...] | +| semantics.rb:230:10:230:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:230:10:230:10 | x [element] : | semmle.label | x [element] : | +| semantics.rb:230:10:230:13 | ...[...] | semmle.label | ...[...] | +| semantics.rb:230:10:230:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:235:9:235:18 | call to source : | semmle.label | call to source : | | semantics.rb:235:9:235:18 | call to source : | semmle.label | call to source : | | semantics.rb:236:9:236:18 | call to source : | semmle.label | call to source : | diff --git a/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.rb b/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.rb index 4424893a9b5..5ec554aed48 100644 --- a/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.rb +++ b/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.rb @@ -224,10 +224,10 @@ end def m28(i) a = source "a" x = s28(a) - sink x[0] - sink x[1] # $ MISSING: hasValueFlow=a - sink x[2] # $ MISSING: hasValueFlow=a - sink x[i] # $ MISSING: hasValueFlow=a + sink x[0] # $ SPURIOUS: hasValueFlow=a + sink x[1] # $ hasValueFlow=a + sink x[2] # $ hasValueFlow=a + sink x[i] # $ hasValueFlow=a end def m29(i) From fcf1f6a6f9ff85cc98f7b59cbf8f5e212ae2b3ea Mon Sep 17 00:00:00 2001 From: Ian Lynagh Date: Mon, 20 Mar 2023 11:49:54 +0000 Subject: [PATCH 036/143] Kotlin: Don't use distutils in build script We were getting DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12. Use setuptools or check PEP 632 for potential alternatives during the build. --- java/kotlin-extractor/build.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/java/kotlin-extractor/build.py b/java/kotlin-extractor/build.py index f31484bdec3..b52ff05b00e 100755 --- a/java/kotlin-extractor/build.py +++ b/java/kotlin-extractor/build.py @@ -11,8 +11,6 @@ import os import os.path import sys import shlex -import distutils -from distutils import dir_util def parse_args(): @@ -203,7 +201,7 @@ def compile(jars, java_jars, dependency_folder, transform_to_embeddable, output, version.replace('.', '_') if os.path.exists(d): # copy and overwrite files from the version folder to the include folder - distutils.dir_util.copy_tree(d, include_version_folder) + shutil.copytree(d, include_version_folder, dirs_exist_ok=True) # remove all version folders: for version in kotlin_plugin_versions.many_versions: From 6a5db750c4543da479e2318325a2e685a6cfeecc Mon Sep 17 00:00:00 2001 From: Rasmus Lerchedahl Petersen Date: Mon, 20 Mar 2023 15:07:46 +0100 Subject: [PATCH 037/143] python: add test to validation (and fix it) --- python/ql/test/experimental/dataflow/validTest.py | 1 + .../test/experimental/dataflow/variable-capture/collections.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/python/ql/test/experimental/dataflow/validTest.py b/python/ql/test/experimental/dataflow/validTest.py index c2280521113..585f2fbf776 100644 --- a/python/ql/test/experimental/dataflow/validTest.py +++ b/python/ql/test/experimental/dataflow/validTest.py @@ -67,6 +67,7 @@ if __name__ == "__main__": check_tests_valid("variable-capture.in") check_tests_valid("variable-capture.nonlocal") check_tests_valid("variable-capture.dict") + check_tests_valid("variable-capture.collections") check_tests_valid("module-initialization.multiphase") check_tests_valid("fieldflow.test") check_tests_valid_after_version("match.test", (3, 10)) diff --git a/python/ql/test/experimental/dataflow/variable-capture/collections.py b/python/ql/test/experimental/dataflow/variable-capture/collections.py index 11504695ceb..0920c8d595a 100644 --- a/python/ql/test/experimental/dataflow/variable-capture/collections.py +++ b/python/ql/test/experimental/dataflow/variable-capture/collections.py @@ -31,7 +31,7 @@ def SINK_F(x): print("OK") l = [NONSOURCE] -SINK_F(l_mod[0]) +SINK_F(l[0]) l_mod = [SOURCE for x in l] SINK(l_mod[0]) #$ captured From 93c9f59e868752157af239bd10d6a4b4b2f68be3 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Mon, 20 Mar 2023 15:39:20 +0100 Subject: [PATCH 038/143] Python: Extract version specific coverage/classes.py tests Since we can analyze operator.py from Python3, but not in Python 2 (since it's implemented in C), we get a difference for the index tests. note: `operator.length_hint` is only available in Python 3.4 and later, so would always fail under Python 2. --- .../coverage-py2/argumentRoutingTest.expected | 0 .../coverage-py2/argumentRoutingTest.qlref | 1 + .../dataflow/coverage-py2/classes.py | 54 ++++++++++++++ .../coverage-py3/argumentRoutingTest.expected | 0 .../coverage-py3/argumentRoutingTest.qlref | 1 + .../dataflow/coverage-py3/classes.py | 72 +++++++++++++++++++ .../experimental/dataflow/coverage/classes.py | 22 ------ .../test/experimental/dataflow/validTest.py | 2 + 8 files changed, 130 insertions(+), 22 deletions(-) create mode 100644 python/ql/test/experimental/dataflow/coverage-py2/argumentRoutingTest.expected create mode 100644 python/ql/test/experimental/dataflow/coverage-py2/argumentRoutingTest.qlref create mode 100644 python/ql/test/experimental/dataflow/coverage-py2/classes.py create mode 100644 python/ql/test/experimental/dataflow/coverage-py3/argumentRoutingTest.expected create mode 100644 python/ql/test/experimental/dataflow/coverage-py3/argumentRoutingTest.qlref create mode 100644 python/ql/test/experimental/dataflow/coverage-py3/classes.py diff --git a/python/ql/test/experimental/dataflow/coverage-py2/argumentRoutingTest.expected b/python/ql/test/experimental/dataflow/coverage-py2/argumentRoutingTest.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/python/ql/test/experimental/dataflow/coverage-py2/argumentRoutingTest.qlref b/python/ql/test/experimental/dataflow/coverage-py2/argumentRoutingTest.qlref new file mode 100644 index 00000000000..58bedc4c88c --- /dev/null +++ b/python/ql/test/experimental/dataflow/coverage-py2/argumentRoutingTest.qlref @@ -0,0 +1 @@ +../coverage/argumentRoutingTest.ql diff --git a/python/ql/test/experimental/dataflow/coverage-py2/classes.py b/python/ql/test/experimental/dataflow/coverage-py2/classes.py new file mode 100644 index 00000000000..48dbaea8e93 --- /dev/null +++ b/python/ql/test/experimental/dataflow/coverage-py2/classes.py @@ -0,0 +1,54 @@ +# Python 2 specific tests, like the one in coverage/classes.py +# +# User-defined methods, both instance methods and class methods, can be called in many non-standard ways +# i.e. differently from simply `c.f()` or `C.f()`. For example, a user-defined `__await__` method on a +# class `C` will be called by the syntactic construct `await c` when `c` is an instance of `C`. +# +# These tests should cover all the class calls that we hope to support. +# It is based on https://docs.python.org/3/reference/datamodel.html, and headings refer there. +# +# All functions starting with "test_" should run and execute `print("OK")` exactly once. +# This can be checked by running validTest.py. + +import sys +import os + +sys.path.append(os.path.dirname(os.path.dirname((__file__)))) +from testlib import expects + + +def SINK1(x): + pass + + +def SINK2(x): + pass + + +def SINK3(x): + pass + + +def SINK4(x): + pass + + +def OK(): + print("OK") + + +# 3.3.8. Emulating numeric types + +# object.__index__(self) +class With_index: + def __index__(self): + SINK1(self) + OK() # Call not found + return 0 + + +def test_index(): + import operator + + with_index = With_index() #$ MISSING: arg1="SSA variable with_index" func=With_index.__index__ + operator.index(with_index) diff --git a/python/ql/test/experimental/dataflow/coverage-py3/argumentRoutingTest.expected b/python/ql/test/experimental/dataflow/coverage-py3/argumentRoutingTest.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/python/ql/test/experimental/dataflow/coverage-py3/argumentRoutingTest.qlref b/python/ql/test/experimental/dataflow/coverage-py3/argumentRoutingTest.qlref new file mode 100644 index 00000000000..58bedc4c88c --- /dev/null +++ b/python/ql/test/experimental/dataflow/coverage-py3/argumentRoutingTest.qlref @@ -0,0 +1 @@ +../coverage/argumentRoutingTest.ql diff --git a/python/ql/test/experimental/dataflow/coverage-py3/classes.py b/python/ql/test/experimental/dataflow/coverage-py3/classes.py new file mode 100644 index 00000000000..308c79acbb4 --- /dev/null +++ b/python/ql/test/experimental/dataflow/coverage-py3/classes.py @@ -0,0 +1,72 @@ +# Python 3 specific tests, like the one in coverage/classes.py +# +# User-defined methods, both instance methods and class methods, can be called in many non-standard ways +# i.e. differently from simply `c.f()` or `C.f()`. For example, a user-defined `__await__` method on a +# class `C` will be called by the syntactic construct `await c` when `c` is an instance of `C`. +# +# These tests should cover all the class calls that we hope to support. +# It is based on https://docs.python.org/3/reference/datamodel.html, and headings refer there. +# +# All functions starting with "test_" should run and execute `print("OK")` exactly once. +# This can be checked by running validTest.py. + +import sys +import os + +sys.path.append(os.path.dirname(os.path.dirname((__file__)))) +from testlib import expects + + +def SINK1(x): + pass + + +def SINK2(x): + pass + + +def SINK3(x): + pass + + +def SINK4(x): + pass + + +def OK(): + print("OK") + + + +# 3.3.7. Emulating container types + +# object.__length_hint__(self) +class With_length_hint: + def __length_hint__(self): + SINK1(self) + OK() + return 0 + + +def test_length_hint(): + import operator + + with_length_hint = With_length_hint() #$ arg1="SSA variable with_length_hint" func=With_length_hint.__length_hint__ + operator.length_hint(with_length_hint) + + +# 3.3.8. Emulating numeric types + +# object.__index__(self) +class With_index: + def __index__(self): + SINK1(self) + OK() # Call not found + return 0 + + +def test_index(): + import operator + + with_index = With_index() #$ arg1="SSA variable with_index" func=With_index.__index__ + operator.index(with_index) diff --git a/python/ql/test/experimental/dataflow/coverage/classes.py b/python/ql/test/experimental/dataflow/coverage/classes.py index 664adedcc00..2569921d6c9 100644 --- a/python/ql/test/experimental/dataflow/coverage/classes.py +++ b/python/ql/test/experimental/dataflow/coverage/classes.py @@ -535,21 +535,6 @@ def test_len_if(): pass -# object.__length_hint__(self) -class With_length_hint: - def __length_hint__(self): - SINK1(self) - OK() # Call not found - return 0 - - -def test_length_hint(): - import operator - - with_length_hint = With_length_hint() #$ arg1="SSA variable with_length_hint" func=With_length_hint.__length_hint__ - operator.length_hint(with_length_hint) - - # object.__getitem__(self, key) class With_getitem: def __getitem__(self, key): @@ -1378,13 +1363,6 @@ class With_index: return 0 -def test_index(): - import operator - - with_index = With_index() #$ arg1="SSA variable with_index" func=With_index.__index__ - operator.index(with_index) - - def test_index_slicing(): with_index = With_index() #$ MISSING: arg1="SSA variable with_index" func=With_index.__index__ [0][with_index:1] diff --git a/python/ql/test/experimental/dataflow/validTest.py b/python/ql/test/experimental/dataflow/validTest.py index c2280521113..b12ee2953f8 100644 --- a/python/ql/test/experimental/dataflow/validTest.py +++ b/python/ql/test/experimental/dataflow/validTest.py @@ -64,6 +64,8 @@ if __name__ == "__main__": check_tests_valid("coverage.test") check_tests_valid("coverage.argumentPassing") check_tests_valid("coverage.datamodel") + check_tests_valid("coverage-py2.classes") + check_tests_valid("coverage-py3.classes") check_tests_valid("variable-capture.in") check_tests_valid("variable-capture.nonlocal") check_tests_valid("variable-capture.dict") From c1ee2dce6150cdf37b03a7055619543faa557774 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Wed, 15 Mar 2023 15:56:34 -0400 Subject: [PATCH 039/143] Refactor CWE-078/ExecTaintedLocal --- .../Security/CWE/CWE-078/ExecTaintedLocal.ql | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql b/java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql index e246d231da1..f3f152f04b3 100644 --- a/java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql +++ b/java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql @@ -16,16 +16,13 @@ import semmle.code.java.Expr import semmle.code.java.dataflow.FlowSources import semmle.code.java.security.ExternalProcess import semmle.code.java.security.CommandArguments -import DataFlow::PathGraph -class LocalUserInputToArgumentToExecFlowConfig extends TaintTracking::Configuration { - LocalUserInputToArgumentToExecFlowConfig() { this = "LocalUserInputToArgumentToExecFlowConfig" } +private module LocalUserInputToArgumentToExecFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src instanceof LocalUserInput } - override predicate isSource(DataFlow::Node src) { src instanceof LocalUserInput } + predicate isSink(DataFlow::Node sink) { sink.asExpr() instanceof ArgumentToExec } - override predicate isSink(DataFlow::Node sink) { sink.asExpr() instanceof ArgumentToExec } - - override predicate isSanitizer(DataFlow::Node node) { + predicate isBarrier(DataFlow::Node node) { node.getType() instanceof PrimitiveType or node.getType() instanceof BoxedType @@ -34,9 +31,16 @@ class LocalUserInputToArgumentToExecFlowConfig extends TaintTracking::Configurat } } +module LocalUserInputToArgumentToExecFlow = + TaintTracking::Make; + +import LocalUserInputToArgumentToExecFlow::PathGraph + from - DataFlow::PathNode source, DataFlow::PathNode sink, ArgumentToExec execArg, - LocalUserInputToArgumentToExecFlowConfig conf -where conf.hasFlowPath(source, sink) and sink.getNode().asExpr() = execArg + LocalUserInputToArgumentToExecFlow::PathNode source, + LocalUserInputToArgumentToExecFlow::PathNode sink, ArgumentToExec execArg +where + LocalUserInputToArgumentToExecFlow::hasFlowPath(source, sink) and + sink.getNode().asExpr() = execArg select execArg, source, sink, "This command line depends on a $@.", source.getNode(), "user-provided value" From e6e974a752d540160d649f3bcd237608fccb9c30 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Wed, 15 Mar 2023 15:59:48 -0400 Subject: [PATCH 040/143] Refactor CWE-079/SqlConcatenated --- java/ql/src/Security/CWE/CWE-079/XSSLocal.ql | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/java/ql/src/Security/CWE/CWE-079/XSSLocal.ql b/java/ql/src/Security/CWE/CWE-079/XSSLocal.ql index da318a5b7cb..a3326b950ef 100644 --- a/java/ql/src/Security/CWE/CWE-079/XSSLocal.ql +++ b/java/ql/src/Security/CWE/CWE-079/XSSLocal.ql @@ -14,17 +14,18 @@ import java import semmle.code.java.dataflow.FlowSources import semmle.code.java.security.XSS -import DataFlow::PathGraph -class XssLocalConfig extends TaintTracking::Configuration { - XssLocalConfig() { this = "XSSLocalConfig" } +private module XssLocalConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof LocalUserInput } - override predicate isSource(DataFlow::Node source) { source instanceof LocalUserInput } - - override predicate isSink(DataFlow::Node sink) { sink instanceof XssSink } + predicate isSink(DataFlow::Node sink) { sink instanceof XssSink } } -from DataFlow::PathNode source, DataFlow::PathNode sink, XssLocalConfig conf -where conf.hasFlowPath(source, sink) +module XssLocalFlow = TaintTracking::Make; + +import XssLocalFlow::PathGraph + +from XssLocalFlow::PathNode source, XssLocalFlow::PathNode sink +where XssLocalFlow::hasFlowPath(source, sink) select sink.getNode(), source, sink, "Cross-site scripting vulnerability due to $@.", source.getNode(), "user-provided value" From ae57807359b3427a86aae8923b23827bb4841fe6 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Wed, 15 Mar 2023 16:07:16 -0400 Subject: [PATCH 041/143] Refactor CWE-089 Sql queries --- .../Security/CWE/CWE-089/SqlConcatenated.ql | 19 ++++++++------- .../Security/CWE/CWE-089/SqlTaintedLocal.ql | 23 +++++++++++-------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql b/java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql index 13e0c7556f6..aa0f29b1db4 100644 --- a/java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql +++ b/java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql @@ -25,28 +25,27 @@ class UncontrolledStringBuilderSource extends DataFlow::ExprNode { } } -class UncontrolledStringBuilderSourceFlowConfig extends TaintTracking::Configuration { - UncontrolledStringBuilderSourceFlowConfig() { - this = "SqlConcatenated::UncontrolledStringBuilderSourceFlowConfig" - } +private module UncontrolledStringBuilderSourceFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src instanceof UncontrolledStringBuilderSource } - override predicate isSource(DataFlow::Node src) { src instanceof UncontrolledStringBuilderSource } + predicate isSink(DataFlow::Node sink) { sink instanceof QueryInjectionSink } - override predicate isSink(DataFlow::Node sink) { sink instanceof QueryInjectionSink } - - override predicate isSanitizer(DataFlow::Node node) { + predicate isBarrier(DataFlow::Node node) { node.getType() instanceof PrimitiveType or node.getType() instanceof BoxedType } } +module UncontrolledStringBuilderSourceFlow = + TaintTracking::Make; + from QueryInjectionSink query, Expr uncontrolled where ( builtFromUncontrolledConcat(query.asExpr(), uncontrolled) or - exists(StringBuilderVar sbv, UncontrolledStringBuilderSourceFlowConfig conf | + exists(StringBuilderVar sbv | uncontrolledStringBuilderQuery(sbv, uncontrolled) and - conf.hasFlow(DataFlow::exprNode(sbv.getToStringCall()), query) + UncontrolledStringBuilderSourceFlow::hasFlow(DataFlow::exprNode(sbv.getToStringCall()), query) ) ) and not queryTaintedBy(query, _, _) diff --git a/java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql b/java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql index d6c874e1fd8..011eb1711f0 100644 --- a/java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql +++ b/java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql @@ -15,26 +15,29 @@ import semmle.code.java.Expr import semmle.code.java.dataflow.FlowSources import semmle.code.java.security.SqlInjectionQuery -import DataFlow::PathGraph -class LocalUserInputToQueryInjectionFlowConfig extends TaintTracking::Configuration { - LocalUserInputToQueryInjectionFlowConfig() { this = "LocalUserInputToQueryInjectionFlowConfig" } +private module LocalUserInputToQueryInjectionFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src instanceof LocalUserInput } - override predicate isSource(DataFlow::Node src) { src instanceof LocalUserInput } + predicate isSink(DataFlow::Node sink) { sink instanceof QueryInjectionSink } - override predicate isSink(DataFlow::Node sink) { sink instanceof QueryInjectionSink } - - override predicate isSanitizer(DataFlow::Node node) { + predicate isBarrier(DataFlow::Node node) { node.getType() instanceof PrimitiveType or node.getType() instanceof BoxedType } - override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { any(AdditionalQueryInjectionTaintStep s).step(node1, node2) } } +module LocalUserInputToQueryInjectionFlow = + TaintTracking::Make; + +import LocalUserInputToQueryInjectionFlow::PathGraph + from - DataFlow::PathNode source, DataFlow::PathNode sink, LocalUserInputToQueryInjectionFlowConfig conf -where conf.hasFlowPath(source, sink) + LocalUserInputToQueryInjectionFlow::PathNode source, + LocalUserInputToQueryInjectionFlow::PathNode sink +where LocalUserInputToQueryInjectionFlow::hasFlowPath(source, sink) select sink.getNode(), source, sink, "This query depends on a $@.", source.getNode(), "user-provided value" From 73a17536f50c7b65cd08fda5fa85d932e2ba7150 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Wed, 15 Mar 2023 16:42:04 -0400 Subject: [PATCH 042/143] Refactor CWE-129 queries --- .../ImproperValidationOfArrayConstruction.ql | 19 +++++++++------- ...idationOfArrayConstructionCodeSpecified.ql | 21 ++++++++++-------- ...roperValidationOfArrayConstructionLocal.ql | 19 +++++++++------- .../CWE-129/ImproperValidationOfArrayIndex.ql | 22 +++++++++++-------- ...operValidationOfArrayIndexCodeSpecified.ql | 20 +++++++++-------- .../ImproperValidationOfArrayIndexLocal.ql | 20 ++++++++++------- 6 files changed, 70 insertions(+), 51 deletions(-) diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstruction.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstruction.ql index 032f2f4ce3c..c723e7d7067 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstruction.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstruction.ql @@ -13,25 +13,28 @@ import java import ArraySizing import semmle.code.java.dataflow.FlowSources -import DataFlow::PathGraph -class Conf extends TaintTracking::Configuration { - Conf() { this = "RemoteUserInputTocanThrowOutOfBoundsDueToEmptyArrayConfig" } +private module ImproperValidationOfArrayConstructionConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { any(CheckableArrayAccess caa).canThrowOutOfBoundsDueToEmptyArray(sink.asExpr(), _) } } +module ImproperValidationOfArrayConstructionFlow = + TaintTracking::Make; + +import ImproperValidationOfArrayConstructionFlow::PathGraph + from - DataFlow::PathNode source, DataFlow::PathNode sink, Expr sizeExpr, + ImproperValidationOfArrayConstructionFlow::PathNode source, + ImproperValidationOfArrayConstructionFlow::PathNode sink, Expr sizeExpr, ArrayCreationExpr arrayCreation, CheckableArrayAccess arrayAccess where arrayAccess.canThrowOutOfBoundsDueToEmptyArray(sizeExpr, arrayCreation) and sizeExpr = sink.getNode().asExpr() and - any(Conf conf).hasFlowPath(source, sink) + ImproperValidationOfArrayConstructionFlow::hasFlowPath(source, sink) select arrayAccess.getIndexExpr(), source, sink, "This accesses the $@, but the array is initialized using a $@ which may be zero.", arrayCreation, "array", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql index 3d07f044a7c..321479e9f38 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql @@ -13,30 +13,33 @@ import java import ArraySizing -import DataFlow::PathGraph +import semmle.code.java.dataflow.TaintTracking -class BoundedFlowSourceConf extends DataFlow::Configuration { - BoundedFlowSourceConf() { this = "BoundedFlowSource" } - - override predicate isSource(DataFlow::Node source) { +private module BoundedFlowSourceConf implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof BoundedFlowSource and // There is not a fixed lower bound which is greater than zero. not source.(BoundedFlowSource).lowerBound() > 0 } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { any(CheckableArrayAccess caa).canThrowOutOfBoundsDueToEmptyArray(sink.asExpr(), _) } } +module BoundedFlowSourceFlow = DataFlow::Make; + +import BoundedFlowSourceFlow::PathGraph + from - DataFlow::PathNode source, DataFlow::PathNode sink, BoundedFlowSource boundedsource, - Expr sizeExpr, ArrayCreationExpr arrayCreation, CheckableArrayAccess arrayAccess + BoundedFlowSourceFlow::PathNode source, BoundedFlowSourceFlow::PathNode sink, + BoundedFlowSource boundedsource, Expr sizeExpr, ArrayCreationExpr arrayCreation, + CheckableArrayAccess arrayAccess where arrayAccess.canThrowOutOfBoundsDueToEmptyArray(sizeExpr, arrayCreation) and sizeExpr = sink.getNode().asExpr() and boundedsource = source.getNode() and - any(BoundedFlowSourceConf conf).hasFlowPath(source, sink) + BoundedFlowSourceFlow::hasFlowPath(source, sink) select arrayAccess.getIndexExpr(), source, sink, "This accesses the $@, but the array is initialized using $@ which may be zero.", arrayCreation, "array", boundedsource, boundedsource.getDescription().toLowerCase() diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionLocal.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionLocal.ql index ebb91acbc24..34dcc99613d 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionLocal.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionLocal.ql @@ -14,25 +14,28 @@ import java import ArraySizing import semmle.code.java.dataflow.FlowSources -import DataFlow::PathGraph -class Conf extends TaintTracking::Configuration { - Conf() { this = "LocalUserInputTocanThrowOutOfBoundsDueToEmptyArrayConfig" } +private module ImproperValidationOfArrayConstructionLocalConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof LocalUserInput } - override predicate isSource(DataFlow::Node source) { source instanceof LocalUserInput } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { any(CheckableArrayAccess caa).canThrowOutOfBoundsDueToEmptyArray(sink.asExpr(), _) } } +module ImproperValidationOfArrayConstructionLocalFlow = + TaintTracking::Make; + +import ImproperValidationOfArrayConstructionLocalFlow::PathGraph + from - DataFlow::PathNode source, DataFlow::PathNode sink, Expr sizeExpr, + ImproperValidationOfArrayConstructionLocalFlow::PathNode source, + ImproperValidationOfArrayConstructionLocalFlow::PathNode sink, Expr sizeExpr, ArrayCreationExpr arrayCreation, CheckableArrayAccess arrayAccess where arrayAccess.canThrowOutOfBoundsDueToEmptyArray(sizeExpr, arrayCreation) and sizeExpr = sink.getNode().asExpr() and - any(Conf conf).hasFlowPath(source, sink) + ImproperValidationOfArrayConstructionLocalFlow::hasFlowPath(source, sink) select arrayAccess.getIndexExpr(), source, sink, "This accesses the $@, but the array is initialized using a $@ which may be zero.", arrayCreation, "array", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndex.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndex.ql index d3a78f1ab96..afc52fb7f2a 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndex.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndex.ql @@ -13,24 +13,28 @@ import java import ArraySizing import semmle.code.java.dataflow.FlowSources -import DataFlow::PathGraph -class Conf extends TaintTracking::Configuration { - Conf() { this = "RemoteUserInputTocanThrowOutOfBoundsDueToEmptyArrayConfig" } +private module ImproperValidationOfArrayIndexConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - override predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { any(CheckableArrayAccess caa).canThrowOutOfBounds(sink.asExpr()) } - override predicate isSanitizer(DataFlow::Node node) { node.getType() instanceof BooleanType } + predicate isBarrier(DataFlow::Node node) { node.getType() instanceof BooleanType } } -from DataFlow::PathNode source, DataFlow::PathNode sink, CheckableArrayAccess arrayAccess +module ImproperValidationOfArrayIndexFlow = + TaintTracking::Make; + +import ImproperValidationOfArrayIndexFlow::PathGraph + +from + ImproperValidationOfArrayIndexFlow::PathNode source, + ImproperValidationOfArrayIndexFlow::PathNode sink, CheckableArrayAccess arrayAccess where arrayAccess.canThrowOutOfBounds(sink.getNode().asExpr()) and - any(Conf conf).hasFlowPath(source, sink) + ImproperValidationOfArrayIndexFlow::hasFlowPath(source, sink) select arrayAccess.getIndexExpr(), source, sink, "This index depends on a $@ which can cause an ArrayIndexOutOfBoundsException.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexCodeSpecified.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexCodeSpecified.ql index 79911f5422d..65883677aa0 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexCodeSpecified.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexCodeSpecified.ql @@ -14,25 +14,27 @@ import java import ArraySizing import BoundingChecks -import DataFlow::PathGraph +import semmle.code.java.dataflow.TaintTracking -class BoundedFlowSourceConf extends DataFlow::Configuration { - BoundedFlowSourceConf() { this = "BoundedFlowSource" } +private module BoundedFlowSourceConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof BoundedFlowSource } - override predicate isSource(DataFlow::Node source) { source instanceof BoundedFlowSource } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(CheckableArrayAccess arrayAccess | arrayAccess.canThrowOutOfBounds(sink.asExpr())) } } +module BoundedFlowSourceFlow = DataFlow::Make; + +import BoundedFlowSourceFlow::PathGraph + from - DataFlow::PathNode source, DataFlow::PathNode sink, BoundedFlowSource boundedsource, - CheckableArrayAccess arrayAccess + BoundedFlowSourceFlow::PathNode source, BoundedFlowSourceFlow::PathNode sink, + BoundedFlowSource boundedsource, CheckableArrayAccess arrayAccess where arrayAccess.canThrowOutOfBounds(sink.getNode().asExpr()) and boundedsource = source.getNode() and - any(BoundedFlowSourceConf conf).hasFlowPath(source, sink) and + BoundedFlowSourceFlow::hasFlowPath(source, sink) and boundedsource != sink.getNode() and not ( ( diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexLocal.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexLocal.ql index 1b5576f14e8..6cbc26eb372 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexLocal.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexLocal.ql @@ -14,22 +14,26 @@ import java import ArraySizing import semmle.code.java.dataflow.FlowSources -import DataFlow::PathGraph -class Conf extends TaintTracking::Configuration { - Conf() { this = "LocalUserInputTocanThrowOutOfBoundsDueToEmptyArrayConfig" } +private module ImproperValidationOfArrayIndexLocalConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof LocalUserInput } - override predicate isSource(DataFlow::Node source) { source instanceof LocalUserInput } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { any(CheckableArrayAccess caa).canThrowOutOfBounds(sink.asExpr()) } } -from DataFlow::PathNode source, DataFlow::PathNode sink, CheckableArrayAccess arrayAccess +module ImproperValidationOfArrayIndexLocalFlow = + TaintTracking::Make; + +import ImproperValidationOfArrayIndexLocalFlow::PathGraph + +from + ImproperValidationOfArrayIndexLocalFlow::PathNode source, + ImproperValidationOfArrayIndexLocalFlow::PathNode sink, CheckableArrayAccess arrayAccess where arrayAccess.canThrowOutOfBounds(sink.getNode().asExpr()) and - any(Conf conf).hasFlowPath(source, sink) + ImproperValidationOfArrayIndexLocalFlow::hasFlowPath(source, sink) select arrayAccess.getIndexExpr(), source, sink, "This index depends on a $@ which can cause an ArrayIndexOutOfBoundsException.", source.getNode(), "user-provided value" From de6959c688d086c9f2b1bcdbd28c760907701ae9 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Wed, 15 Mar 2023 16:45:07 -0400 Subject: [PATCH 043/143] Refactor CWE-209/StackTraceExposure --- .../Security/CWE/CWE-209/StackTraceExposure.ql | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql b/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql index 02934e98840..bfc0f33f5d0 100644 --- a/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql +++ b/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql @@ -120,22 +120,20 @@ class GetMessageFlowSource extends MethodAccess { } } -class GetMessageFlowSourceToHttpResponseSinkFlowConfig extends TaintTracking::Configuration { - GetMessageFlowSourceToHttpResponseSinkFlowConfig() { - this = "StackTraceExposure::GetMessageFlowSourceToHttpResponseSinkFlowConfig" - } +private module GetMessageFlowSourceToHttpResponseSinkFlowConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node src) { src.asExpr() instanceof GetMessageFlowSource } - override predicate isSource(DataFlow::Node src) { src.asExpr() instanceof GetMessageFlowSource } - - override predicate isSink(DataFlow::Node sink) { sink instanceof InformationLeakSink } + predicate isSink(DataFlow::Node sink) { sink instanceof InformationLeakSink } } +module GetMessageFlowSourceToHttpResponseSinkFlow = + TaintTracking::Make; + /** * A call to `getMessage()` that then flows to a servlet response. */ predicate getMessageFlowsExternally(DataFlow::Node externalExpr, GetMessageFlowSource getMessage) { - any(GetMessageFlowSourceToHttpResponseSinkFlowConfig conf) - .hasFlow(DataFlow::exprNode(getMessage), externalExpr) + GetMessageFlowSourceToHttpResponseSinkFlow::hasFlow(DataFlow::exprNode(getMessage), externalExpr) } from Expr externalExpr, Expr errorInformation From 8856730843f0b98e1f8e04cd957ba4ef3c829431 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Wed, 15 Mar 2023 16:47:51 -0400 Subject: [PATCH 044/143] Refactor CWE-614/InsecureCookie --- java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql b/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql index 0766ee07134..e8aaa106e78 100644 --- a/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql +++ b/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql @@ -26,10 +26,8 @@ predicate isSafeSecureCookieSetting(Expr e) { ) } -class SecureCookieConfiguration extends DataFlow::Configuration { - SecureCookieConfiguration() { this = "SecureCookieConfiguration" } - - override predicate isSource(DataFlow::Node source) { +private module SecureCookieConfiguration implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { exists(MethodAccess ma, Method m | ma.getMethod() = m | m.getDeclaringType() instanceof TypeCookie and m.getName() = "setSecure" and @@ -43,14 +41,16 @@ class SecureCookieConfiguration extends DataFlow::Configuration { ) } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { sink.asExpr() = any(MethodAccess add | add.getMethod() instanceof ResponseAddCookieMethod).getArgument(0) } } +module SecureCookieFlow = DataFlow::Make; + from MethodAccess add where add.getMethod() instanceof ResponseAddCookieMethod and - not any(SecureCookieConfiguration df).hasFlowToExpr(add.getArgument(0)) + not SecureCookieFlow::hasFlowToExpr(add.getArgument(0)) select add, "Cookie is added to response without the 'secure' flag being set." From c7816ea1806b2fa22412cf0c33eda0f55eac41bf Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Thu, 16 Mar 2023 23:15:19 -0400 Subject: [PATCH 045/143] Conform `Config` modules to naming convention --- .../ImproperValidationOfArrayConstructionCodeSpecified.ql | 4 ++-- java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql index 321479e9f38..680b538c870 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql @@ -15,7 +15,7 @@ import java import ArraySizing import semmle.code.java.dataflow.TaintTracking -private module BoundedFlowSourceConf implements DataFlow::ConfigSig { +private module BoundedFlowSourceConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof BoundedFlowSource and // There is not a fixed lower bound which is greater than zero. @@ -27,7 +27,7 @@ private module BoundedFlowSourceConf implements DataFlow::ConfigSig { } } -module BoundedFlowSourceFlow = DataFlow::Make; +module BoundedFlowSourceFlow = DataFlow::Make; import BoundedFlowSourceFlow::PathGraph diff --git a/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql b/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql index e8aaa106e78..821c6f7a1fc 100644 --- a/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql +++ b/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql @@ -26,7 +26,7 @@ predicate isSafeSecureCookieSetting(Expr e) { ) } -private module SecureCookieConfiguration implements DataFlow::ConfigSig { +private module SecureCookieConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { exists(MethodAccess ma, Method m | ma.getMethod() = m | m.getDeclaringType() instanceof TypeCookie and @@ -47,7 +47,7 @@ private module SecureCookieConfiguration implements DataFlow::ConfigSig { } } -module SecureCookieFlow = DataFlow::Make; +module SecureCookieFlow = DataFlow::Make; from MethodAccess add where From b64ca5dcaab9eb699e1b687d5b61961e37052154 Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Mon, 20 Mar 2023 11:47:03 -0400 Subject: [PATCH 046/143] Remove "private" marker from configurations --- java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql | 2 +- java/ql/src/Security/CWE/CWE-079/XSSLocal.ql | 2 +- java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql | 2 +- java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql | 2 +- .../ImproperValidationOfArrayConstructionCodeSpecified.ql | 2 +- .../CWE/CWE-129/ImproperValidationOfArrayConstructionLocal.ql | 2 +- .../Security/CWE/CWE-129/ImproperValidationOfArrayIndex.ql | 2 +- .../CWE-129/ImproperValidationOfArrayIndexCodeSpecified.ql | 2 +- .../CWE/CWE-129/ImproperValidationOfArrayIndexLocal.ql | 2 +- .../src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql | 4 ++-- java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql | 2 +- java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql | 2 +- 12 files changed, 13 insertions(+), 13 deletions(-) diff --git a/java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql b/java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql index f3f152f04b3..e8a80e372b7 100644 --- a/java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql +++ b/java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql @@ -17,7 +17,7 @@ import semmle.code.java.dataflow.FlowSources import semmle.code.java.security.ExternalProcess import semmle.code.java.security.CommandArguments -private module LocalUserInputToArgumentToExecFlowConfig implements DataFlow::ConfigSig { +module LocalUserInputToArgumentToExecFlowConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node src) { src instanceof LocalUserInput } predicate isSink(DataFlow::Node sink) { sink.asExpr() instanceof ArgumentToExec } diff --git a/java/ql/src/Security/CWE/CWE-079/XSSLocal.ql b/java/ql/src/Security/CWE/CWE-079/XSSLocal.ql index a3326b950ef..fd9c397f812 100644 --- a/java/ql/src/Security/CWE/CWE-079/XSSLocal.ql +++ b/java/ql/src/Security/CWE/CWE-079/XSSLocal.ql @@ -15,7 +15,7 @@ import java import semmle.code.java.dataflow.FlowSources import semmle.code.java.security.XSS -private module XssLocalConfig implements DataFlow::ConfigSig { +module XssLocalConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof LocalUserInput } predicate isSink(DataFlow::Node sink) { sink instanceof XssSink } diff --git a/java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql b/java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql index aa0f29b1db4..209d778dca8 100644 --- a/java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql +++ b/java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql @@ -25,7 +25,7 @@ class UncontrolledStringBuilderSource extends DataFlow::ExprNode { } } -private module UncontrolledStringBuilderSourceFlowConfig implements DataFlow::ConfigSig { +module UncontrolledStringBuilderSourceFlowConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node src) { src instanceof UncontrolledStringBuilderSource } predicate isSink(DataFlow::Node sink) { sink instanceof QueryInjectionSink } diff --git a/java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql b/java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql index 011eb1711f0..0ad803533c5 100644 --- a/java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql +++ b/java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql @@ -16,7 +16,7 @@ import semmle.code.java.Expr import semmle.code.java.dataflow.FlowSources import semmle.code.java.security.SqlInjectionQuery -private module LocalUserInputToQueryInjectionFlowConfig implements DataFlow::ConfigSig { +module LocalUserInputToQueryInjectionFlowConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node src) { src instanceof LocalUserInput } predicate isSink(DataFlow::Node sink) { sink instanceof QueryInjectionSink } diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql index 680b538c870..a4335eeb2fe 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql @@ -15,7 +15,7 @@ import java import ArraySizing import semmle.code.java.dataflow.TaintTracking -private module BoundedFlowSourceConfig implements DataFlow::ConfigSig { +module BoundedFlowSourceConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof BoundedFlowSource and // There is not a fixed lower bound which is greater than zero. diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionLocal.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionLocal.ql index 34dcc99613d..a1d13c3d8db 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionLocal.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionLocal.ql @@ -15,7 +15,7 @@ import java import ArraySizing import semmle.code.java.dataflow.FlowSources -private module ImproperValidationOfArrayConstructionLocalConfig implements DataFlow::ConfigSig { +module ImproperValidationOfArrayConstructionLocalConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof LocalUserInput } predicate isSink(DataFlow::Node sink) { diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndex.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndex.ql index afc52fb7f2a..70b23e058a5 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndex.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndex.ql @@ -14,7 +14,7 @@ import java import ArraySizing import semmle.code.java.dataflow.FlowSources -private module ImproperValidationOfArrayIndexConfig implements DataFlow::ConfigSig { +module ImproperValidationOfArrayIndexConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof RemoteFlowSource } predicate isSink(DataFlow::Node sink) { diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexCodeSpecified.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexCodeSpecified.ql index 65883677aa0..fd07e39b6ba 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexCodeSpecified.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexCodeSpecified.ql @@ -16,7 +16,7 @@ import ArraySizing import BoundingChecks import semmle.code.java.dataflow.TaintTracking -private module BoundedFlowSourceConfig implements DataFlow::ConfigSig { +module BoundedFlowSourceConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof BoundedFlowSource } predicate isSink(DataFlow::Node sink) { diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexLocal.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexLocal.ql index 6cbc26eb372..d57df422287 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexLocal.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexLocal.ql @@ -15,7 +15,7 @@ import java import ArraySizing import semmle.code.java.dataflow.FlowSources -private module ImproperValidationOfArrayIndexLocalConfig implements DataFlow::ConfigSig { +module ImproperValidationOfArrayIndexLocalConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof LocalUserInput } predicate isSink(DataFlow::Node sink) { diff --git a/java/ql/src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql b/java/ql/src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql index 72801f205aa..5070283780b 100644 --- a/java/ql/src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql +++ b/java/ql/src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql @@ -33,7 +33,7 @@ class ExtremeSource extends VarAccess { ExtremeSource() { this.getVariable() instanceof ExtremeValueField } } -private module MaxValueFlowConfig implements DataFlow::ConfigSig { +module MaxValueFlowConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source.asExpr().(ExtremeSource).getVariable() instanceof MaxValueField } @@ -47,7 +47,7 @@ private module MaxValueFlowConfig implements DataFlow::ConfigSig { module MaxValueFlow = DataFlow::Make; -private module MinValueFlowConfig implements DataFlow::ConfigSig { +module MinValueFlowConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source.asExpr().(ExtremeSource).getVariable() instanceof MinValueField } diff --git a/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql b/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql index bfc0f33f5d0..be5d3dad848 100644 --- a/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql +++ b/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql @@ -120,7 +120,7 @@ class GetMessageFlowSource extends MethodAccess { } } -private module GetMessageFlowSourceToHttpResponseSinkFlowConfig implements DataFlow::ConfigSig { +module GetMessageFlowSourceToHttpResponseSinkFlowConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node src) { src.asExpr() instanceof GetMessageFlowSource } predicate isSink(DataFlow::Node sink) { sink instanceof InformationLeakSink } diff --git a/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql b/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql index 821c6f7a1fc..807ef383dee 100644 --- a/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql +++ b/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql @@ -26,7 +26,7 @@ predicate isSafeSecureCookieSetting(Expr e) { ) } -private module SecureCookieConfig implements DataFlow::ConfigSig { +module SecureCookieConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { exists(MethodAccess ma, Method m | ma.getMethod() = m | m.getDeclaringType() instanceof TypeCookie and From 6598cc44ee28b5c5d6ebb2024203250e7fdd825e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 21 Mar 2023 00:15:33 +0000 Subject: [PATCH 047/143] Add changed framework coverage reports --- .../library-coverage/coverage.csv | 19 ++++++++++++++----- .../library-coverage/coverage.rst | 12 ++++++------ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/java/documentation/library-coverage/coverage.csv b/java/documentation/library-coverage/coverage.csv index fa61d8d78ea..84e5a0db8eb 100644 --- a/java/documentation/library-coverage/coverage.csv +++ b/java/documentation/library-coverage/coverage.csv @@ -1,7 +1,7 @@ package,sink,source,summary,sink:bean-validation,sink:create-file,sink:fragment-injection,sink:groovy,sink:header-splitting,sink:information-leak,sink:intent-start,sink:jdbc-url,sink:jexl,sink:jndi-injection,sink:ldap,sink:logging,sink:mvel,sink:ognl-injection,sink:open-url,sink:pending-intent-sent,sink:read-file,sink:regex-use,sink:regex-use[-1],sink:regex-use[0],sink:regex-use[],sink:regex-use[f-1],sink:regex-use[f1],sink:regex-use[f],sink:set-hostname-verifier,sink:sql,sink:ssti,sink:url-open-stream,sink:url-redirect,sink:write-file,sink:xpath,sink:xslt,sink:xss,source:android-external-storage-dir,source:android-widget,source:contentprovider,source:remote,summary:taint,summary:value android.app,35,,103,,,11,,,,7,,,,,,,,,17,,,,,,,,,,,,,,,,,,,,,,18,85 android.content,24,31,154,,,,,,,16,,,,,,,,,,,,,,,,,,,8,,,,,,,,4,,27,,63,91 -android.database,59,,39,,,,,,,,,,,,,,,,,,,,,,,,,,59,,,,,,,,,,,,39, +android.database,59,,41,,,,,,,,,,,,,,,,,,,,,,,,,,59,,,,,,,,,,,,41, android.net,,,60,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,45,15 android.os,,2,122,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,41,81 android.support.v4.app,11,,,,,11,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, @@ -16,7 +16,7 @@ com.esotericsoftware.kryo.io,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, com.esotericsoftware.kryo5.io,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, com.fasterxml.jackson.core,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, com.fasterxml.jackson.databind,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,6, -com.google.common.base,4,,85,,,,,,,,,,,,,,,,,,,,3,1,,,,,,,,,,,,,,,,,62,23 +com.google.common.base,4,,87,,,,,,,,,,,,,,,,,,,,3,1,,,,,,,,,,,,,,,,,63,24 com.google.common.cache,,,17,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,17 com.google.common.collect,,,553,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,551 com.google.common.flogger,29,,,,,,,,,,,,,,29,,,,,,,,,,,,,,,,,,,,,,,,,,, @@ -33,8 +33,17 @@ freemarker.cache,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,, freemarker.template,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,7,,,,,,,,,,,, groovy.lang,26,,,,,,26,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, groovy.util,5,,,,,,5,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +hudson.model,4,,1,,2,,,,,,,,,,,,,1,,1,,,,,,,,,,,,,,,,,,,,,1, +hudson.os,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, hudson.remoting,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +hudson.util,4,,1,,3,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,1, +io.netty.bootstrap,3,,,,,,,,,,,,,,,,,3,,,,,,,,,,,,,,,,,,,,,,,, +io.netty.channel,9,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,,,,,,,,,,,,, +io.netty.handler.codec.http,3,,1,,,,,,,,,,,,,,,2,,1,,,,,,,,,,,,,,,,,,,,,1, +io.netty.handler.ssl,2,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,, +io.netty.handler.stream,1,,,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,, io.netty.resolver,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, +io.netty.util.internal,2,,2,,1,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,2, jakarta.faces.context,2,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,7,, jakarta.json,,,123,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,100,23 jakarta.ws.rs.client,1,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,, @@ -44,7 +53,7 @@ java.beans,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, java.io,42,,40,,17,,,,,,,,,,,,,,,3,,,,,,,,,,,,,22,,,,,,,,39,1 java.lang,16,,76,,,,,,,,,,,,8,,,,,3,,4,,,1,,,,,,,,,,,,,,,,53,23 java.net,12,3,16,,,,,,,,,,,,,,,12,,,,,,,,,,,,,,,,,,,,,,3,16, -java.nio,20,,15,,15,,,,,,,,,,,,,,,3,,,,,,,,,,,,,2,,,,,,,,15, +java.nio,20,,16,,15,,,,,,,,,,,,,,,3,,,,,,,,,,,,,2,,,,,,,,16, java.sql,13,,2,,,,,,,,4,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,1,1 java.util,44,,465,,,,,,,,,,,,34,,,,,,,,5,2,,1,2,,,,,,,,,,,,,,38,427 javafx.scene.web,1,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,, @@ -114,7 +123,7 @@ org.springframework.boot.jdbc,1,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, org.springframework.cache,,,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,13 org.springframework.context,,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3, org.springframework.data.repository,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1 -org.springframework.http,14,,70,,,,,,,,,,,,,,,14,,,,,,,,,,,,,,,,,,,,,,,60,10 +org.springframework.http,14,,71,,,,,,,,,,,,,,,14,,,,,,,,,,,,,,,,,,,,,,,61,10 org.springframework.jdbc.core,10,,,,,,,,,,,,,,,,,,,,,,,,,,,,10,,,,,,,,,,,,, org.springframework.jdbc.datasource,4,,,,,,,,,,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, org.springframework.jdbc.object,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,, @@ -128,7 +137,7 @@ org.springframework.web.client,13,3,,,,,,,,,,,,,,,,13,,,,,,,,,,,,,,,,,,,,,,3,, org.springframework.web.context.request,,8,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,8,, org.springframework.web.multipart,,12,13,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,12,13, org.springframework.web.reactive.function.client,2,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,, -org.springframework.web.util,,,163,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,138,25 +org.springframework.web.util,,,165,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,140,25 org.thymeleaf,2,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,2, org.xml.sax,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, org.xmlpull.v1,,3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3,, diff --git a/java/documentation/library-coverage/coverage.rst b/java/documentation/library-coverage/coverage.rst index b0b240d9acc..cc6fdb875ff 100644 --- a/java/documentation/library-coverage/coverage.rst +++ b/java/documentation/library-coverage/coverage.rst @@ -7,7 +7,7 @@ Java framework & library support :widths: auto Framework / library,Package,Flow sources,Taint & value steps,Sinks (total),`CWE‑022` :sub:`Path injection`,`CWE‑036` :sub:`Path traversal`,`CWE‑079` :sub:`Cross-site scripting`,`CWE‑089` :sub:`SQL injection`,`CWE‑090` :sub:`LDAP injection`,`CWE‑094` :sub:`Code injection`,`CWE‑319` :sub:`Cleartext transmission` - Android,``android.*``,52,479,138,,,3,67,,, + Android,``android.*``,52,481,138,,,3,67,,, Android extensions,``androidx.*``,5,183,19,,,,,,, `Apache Commons Collections `_,"``org.apache.commons.collections``, ``org.apache.commons.collections4``",,1600,,,,,,,, `Apache Commons IO `_,``org.apache.commons.io``,,560,107,91,,,,,,15 @@ -15,13 +15,13 @@ Java framework & library support `Apache Commons Text `_,``org.apache.commons.text``,,272,,,,,,,, `Apache HttpComponents `_,"``org.apache.hc.core5.*``, ``org.apache.http``",5,143,28,,,3,,,,25 `Apache Log4j 2 `_,``org.apache.logging.log4j``,,8,359,,,,,,, - `Google Guava `_,``com.google.common.*``,,728,39,,6,,,,, + `Google Guava `_,``com.google.common.*``,,730,39,,6,,,,, JBoss Logging,``org.jboss.logging``,,,324,,,,,,, `JSON-java `_,``org.json``,,236,,,,,,,, - Java Standard Library,``java.*``,3,615,147,32,,,9,,,12 + Java Standard Library,``java.*``,3,616,147,32,,,9,,,12 Java extensions,"``javax.*``, ``jakarta.*``",63,609,33,1,,4,,1,1,2 Kotlin Standard Library,``kotlin*``,,1835,12,10,,,,,,2 - `Spring `_,``org.springframework.*``,29,477,101,,,,19,14,,29 - Others,"``cn.hutool.core.codec``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.fasterxml.jackson.core``, ``com.fasterxml.jackson.databind``, ``com.hubspot.jinjava``, ``com.mitchellbosecke.pebble``, ``com.opensymphony.xwork2.ognl``, ``com.rabbitmq.client``, ``com.thoughtworks.xstream``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``freemarker.cache``, ``freemarker.template``, ``groovy.lang``, ``groovy.util``, ``hudson.remoting``, ``io.netty.resolver``, ``javafx.scene.web``, ``jodd.json``, ``net.sf.saxon.s9api``, ``ognl``, ``okhttp3``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.logging``, ``org.apache.commons.ognl``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.log4j``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.apache.velocity.app``, ``org.apache.velocity.runtime``, ``org.codehaus.cargo.container.installer``, ``org.codehaus.groovy.control``, ``org.dom4j``, ``org.hibernate``, ``org.jdbi.v3.core``, ``org.jooq``, ``org.kohsuke.stapler``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.scijava.log``, ``org.slf4j``, ``org.thymeleaf``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``retrofit2``",60,308,299,6,,,18,18,,12 - Totals,,217,8477,1612,140,6,10,113,33,1,97 + `Spring `_,``org.springframework.*``,29,480,101,,,,19,14,,29 + Others,"``cn.hutool.core.codec``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.fasterxml.jackson.core``, ``com.fasterxml.jackson.databind``, ``com.hubspot.jinjava``, ``com.mitchellbosecke.pebble``, ``com.opensymphony.xwork2.ognl``, ``com.rabbitmq.client``, ``com.thoughtworks.xstream``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``freemarker.cache``, ``freemarker.template``, ``groovy.lang``, ``groovy.util``, ``hudson.model``, ``hudson.os``, ``hudson.remoting``, ``hudson.util``, ``io.netty.bootstrap``, ``io.netty.channel``, ``io.netty.handler.codec.http``, ``io.netty.handler.ssl``, ``io.netty.handler.stream``, ``io.netty.resolver``, ``io.netty.util.internal``, ``javafx.scene.web``, ``jodd.json``, ``net.sf.saxon.s9api``, ``ognl``, ``okhttp3``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.logging``, ``org.apache.commons.ognl``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.log4j``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.apache.velocity.app``, ``org.apache.velocity.runtime``, ``org.codehaus.cargo.container.installer``, ``org.codehaus.groovy.control``, ``org.dom4j``, ``org.hibernate``, ``org.jdbi.v3.core``, ``org.jooq``, ``org.kohsuke.stapler``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.scijava.log``, ``org.slf4j``, ``org.thymeleaf``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``retrofit2``",60,314,327,12,,,18,18,,28 + Totals,,217,8491,1640,146,6,10,113,33,1,113 From 1f75c3836ea67baf267d2bb445b0f7a29bc68f4b Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 21 Mar 2023 09:02:21 +0100 Subject: [PATCH 048/143] C++: Refactor dataflow examples to use `DataFlow::ConfigSig` --- .../analyzing-data-flow-in-cpp/exercise2.ql | 18 +++++++----------- .../analyzing-data-flow-in-cpp/exercise4.ql | 16 +++++++--------- .../fopen-flow-from-getenv.ql | 16 +++++++--------- .../index-flow-from-ntohl.ql | 18 +++++++++--------- 4 files changed, 30 insertions(+), 38 deletions(-) diff --git a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise2.ql b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise2.ql index 10c0bcf5ee8..3fbc4fc10fd 100644 --- a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise2.ql +++ b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise2.ql @@ -1,14 +1,10 @@ import cpp import semmle.code.cpp.dataflow.new.DataFlow -class LiteralToGethostbynameConfiguration extends DataFlow::Configuration { - LiteralToGethostbynameConfiguration() { this = "LiteralToGethostbynameConfiguration" } +module LiteralToGethostbynameConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source.asIndirectExpr(1) instanceof StringLiteral } - override predicate isSource(DataFlow::Node source) { - source.asIndirectExpr(1) instanceof StringLiteral - } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(FunctionCall fc | sink.asIndirectExpr(1) = fc.getArgument(0) and fc.getTarget().hasName("gethostbyname") @@ -16,11 +12,11 @@ class LiteralToGethostbynameConfiguration extends DataFlow::Configuration { } } -from - StringLiteral sl, FunctionCall fc, LiteralToGethostbynameConfiguration cfg, DataFlow::Node source, - DataFlow::Node sink +module LiteralToGethostbynameFlow = DataFlow::Make; + +from StringLiteral sl, FunctionCall fc, DataFlow::Node source, DataFlow::Node sink where source.asIndirectExpr(1) = sl and sink.asIndirectExpr(1) = fc.getArgument(0) and - cfg.hasFlow(source, sink) + LiteralToGethostbynameFlow::hasFlow(source, sink) select sl, fc diff --git a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise4.ql b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise4.ql index 09c01b953e3..fc73440cd7b 100644 --- a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise4.ql +++ b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise4.ql @@ -5,12 +5,10 @@ class GetenvSource extends DataFlow::Node { GetenvSource() { this.asIndirectExpr(1).(FunctionCall).getTarget().hasGlobalName("getenv") } } -class GetenvToGethostbynameConfiguration extends DataFlow::Configuration { - GetenvToGethostbynameConfiguration() { this = "GetenvToGethostbynameConfiguration" } +module GetenvToGethostbynameConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof GetenvSource } - override predicate isSource(DataFlow::Node source) { source instanceof GetenvSource } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(FunctionCall fc | sink.asIndirectExpr(1) = fc.getArgument(0) and fc.getTarget().hasName("gethostbyname") @@ -18,11 +16,11 @@ class GetenvToGethostbynameConfiguration extends DataFlow::Configuration { } } -from - Expr getenv, FunctionCall fc, GetenvToGethostbynameConfiguration cfg, DataFlow::Node source, - DataFlow::Node sink +module GetenvToGethostbynameFlow = DataFlow::Make; + +from Expr getenv, FunctionCall fc, DataFlow::Node source, DataFlow::Node sink where source.asIndirectExpr(1) = getenv and sink.asIndirectExpr(1) = fc.getArgument(0) and - cfg.hasFlow(source, sink) + GetenvToGethostbynameFlow::hasFlow(source, sink) select getenv, fc diff --git a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/fopen-flow-from-getenv.ql b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/fopen-flow-from-getenv.ql index d21ae4ae52e..7d810156e7d 100644 --- a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/fopen-flow-from-getenv.ql +++ b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/fopen-flow-from-getenv.ql @@ -1,17 +1,15 @@ import cpp import semmle.code.cpp.dataflow.new.DataFlow -class EnvironmentToFileConfiguration extends DataFlow::Configuration { - EnvironmentToFileConfiguration() { this = "EnvironmentToFileConfiguration" } - - override predicate isSource(DataFlow::Node source) { +module EnvironmentToFileConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { exists(Function getenv | source.asIndirectExpr(1).(FunctionCall).getTarget() = getenv and getenv.hasGlobalName("getenv") ) } - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(FunctionCall fc | sink.asIndirectExpr(1) = fc.getArgument(0) and fc.getTarget().hasGlobalName("fopen") @@ -19,11 +17,11 @@ class EnvironmentToFileConfiguration extends DataFlow::Configuration { } } -from - Expr getenv, Expr fopen, EnvironmentToFileConfiguration config, DataFlow::Node source, - DataFlow::Node sink +module EnvironmentToFileFlow = DataFlow::Make; + +from Expr getenv, Expr fopen, DataFlow::Node source, DataFlow::Node sink where source.asIndirectExpr(1) = getenv and sink.asIndirectExpr(1) = fopen and - config.hasFlow(source, sink) + EnvironmentToFileFlow::hasFlow(source, sink) select fopen, "This 'fopen' uses data from $@.", getenv, "call to 'getenv'" diff --git a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/index-flow-from-ntohl.ql b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/index-flow-from-ntohl.ql index e6452137053..a81c3a71d75 100644 --- a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/index-flow-from-ntohl.ql +++ b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/index-flow-from-ntohl.ql @@ -2,18 +2,16 @@ import cpp import semmle.code.cpp.controlflow.Guards import semmle.code.cpp.dataflow.new.TaintTracking -class NetworkToBufferSizeConfiguration extends TaintTracking::Configuration { - NetworkToBufferSizeConfiguration() { this = "NetworkToBufferSizeConfiguration" } - - override predicate isSource(DataFlow::Node node) { +module NetworkToBufferSizeConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node node) { node.asExpr().(FunctionCall).getTarget().hasGlobalName("ntohl") } - override predicate isSink(DataFlow::Node node) { + predicate isSink(DataFlow::Node node) { exists(ArrayExpr ae | node.asExpr() = ae.getArrayOffset()) } - override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) { + predicate isAdditionalFlowStep(DataFlow::Node pred, DataFlow::Node succ) { exists(Loop loop, LoopCounter lc | loop = lc.getALoop() and loop.getControllingExpr().(RelationalOperation).getGreaterOperand() = pred.asExpr() @@ -22,7 +20,7 @@ class NetworkToBufferSizeConfiguration extends TaintTracking::Configuration { ) } - override predicate isSanitizer(DataFlow::Node node) { + predicate isBarrier(DataFlow::Node node) { exists(GuardCondition gc, Variable v | gc.getAChild*() = v.getAnAccess() and node.asExpr() = v.getAnAccess() and @@ -32,7 +30,9 @@ class NetworkToBufferSizeConfiguration extends TaintTracking::Configuration { } } -from DataFlow::Node ntohl, DataFlow::Node offset, NetworkToBufferSizeConfiguration conf -where conf.hasFlow(ntohl, offset) +module NetworkToBufferSizeFlow = TaintTracking::Make; + +from DataFlow::Node ntohl, DataFlow::Node offset +where NetworkToBufferSizeFlow::hasFlow(ntohl, offset) select offset, "This array offset may be influenced by $@.", ntohl, "converted data from the network" From 2fdfa0808a8dfe5d110ddef9b6fcb5bb88d0dafd Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Tue, 21 Mar 2023 09:11:33 +0100 Subject: [PATCH 049/143] C++: Refactor experimental queries to use `DataFlow::ConfigSig` --- .../CWE/CWE-193/ConstantSizeArrayOffByOne.ql | 36 +++++++++---------- .../CWE/CWE-193/InvalidPointerDeref.ql | 36 ++++++++++--------- 2 files changed, 35 insertions(+), 37 deletions(-) diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql b/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql index bdf8d175a48..35cce4a30da 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql @@ -15,8 +15,7 @@ import experimental.semmle.code.cpp.semantic.SemanticBound import experimental.semmle.code.cpp.semantic.SemanticExprSpecific import semmle.code.cpp.ir.IR import semmle.code.cpp.ir.dataflow.DataFlow -import semmle.code.cpp.ir.dataflow.DataFlow2 -import DataFlow2::PathGraph +import PointerArithmeticToDerefFlow::PathGraph pragma[nomagic] Instruction getABoundIn(SemBound b, IRFunction func) { @@ -36,16 +35,16 @@ predicate bounded(Instruction i, Instruction b, int delta) { ) } -class FieldAddressToPointerArithmeticConf extends DataFlow::Configuration { - FieldAddressToPointerArithmeticConf() { this = "FieldAddressToPointerArithmeticConf" } +module FieldAddressToPointerArithmeticConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { isFieldAddressSource(_, source) } - override predicate isSource(DataFlow::Node source) { isFieldAddressSource(_, source) } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(PointerAddInstruction pai | pai.getLeft() = sink.asInstruction()) } } +module FieldAddressToPointerArithmeticFlow = DataFlow::Make; + predicate isFieldAddressSource(Field f, DataFlow::Node source) { source.asInstruction().(FieldAddressInstruction).getField() = f } @@ -70,11 +69,8 @@ predicate isInvalidPointerDerefSink(DataFlow::Node sink, Instruction i, string o } predicate isConstantSizeOverflowSource(Field f, PointerAddInstruction pai, int delta) { - exists( - int size, int bound, FieldAddressToPointerArithmeticConf conf, DataFlow::Node source, - DataFlow::InstructionNode sink - | - conf.hasFlow(source, sink) and + exists(int size, int bound, DataFlow::Node source, DataFlow::InstructionNode sink | + FieldAddressToPointerArithmeticFlow::hasFlow(source, sink) and isFieldAddressSource(f, source) and pai.getLeft() = sink.asInstruction() and f.getUnspecifiedType().(ArrayType).getArraySize() = size and @@ -86,21 +82,21 @@ predicate isConstantSizeOverflowSource(Field f, PointerAddInstruction pai, int d ) } -class PointerArithmeticToDerefConf extends DataFlow2::Configuration { - PointerArithmeticToDerefConf() { this = "PointerArithmeticToDerefConf" } - - override predicate isSource(DataFlow::Node source) { +module PointerArithmeticToDerefConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { isConstantSizeOverflowSource(_, source.asInstruction(), _) } - override predicate isSink(DataFlow::Node sink) { isInvalidPointerDerefSink(sink, _, _) } + predicate isSink(DataFlow::Node sink) { isInvalidPointerDerefSink(sink, _, _) } } +module PointerArithmeticToDerefFlow = DataFlow::Make; + from - Field f, DataFlow2::PathNode source, DataFlow2::PathNode sink, Instruction deref, - PointerArithmeticToDerefConf conf, string operation, int delta + Field f, PointerArithmeticToDerefFlow::PathNode source, + PointerArithmeticToDerefFlow::PathNode sink, Instruction deref, string operation, int delta where - conf.hasFlowPath(source, sink) and + PointerArithmeticToDerefFlow::hasFlowPath(source, sink) and isInvalidPointerDerefSink(sink.getNode(), deref, operation) and isConstantSizeOverflowSource(f, source.getNode().asInstruction(), delta) select source, source, sink, diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-193/InvalidPointerDeref.ql b/cpp/ql/src/experimental/Security/CWE/CWE-193/InvalidPointerDeref.ql index a35ed79a440..9cadcb505d0 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-193/InvalidPointerDeref.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-193/InvalidPointerDeref.ql @@ -17,7 +17,6 @@ import cpp import experimental.semmle.code.cpp.dataflow.ProductFlow -import semmle.code.cpp.ir.dataflow.DataFlow3 import experimental.semmle.code.cpp.semantic.analysis.RangeAnalysis import experimental.semmle.code.cpp.semantic.SemanticBound import experimental.semmle.code.cpp.semantic.SemanticExprSpecific @@ -204,14 +203,14 @@ predicate isInvalidPointerDerefSink(DataFlow::Node sink, Instruction i, string o * A configuration to track flow from a pointer-arithmetic operation found * by `AllocToInvalidPointerConf` to a dereference of the pointer. */ -class InvalidPointerToDerefConf extends DataFlow3::Configuration { - InvalidPointerToDerefConf() { this = "InvalidPointerToDerefConf" } +module InvalidPointerToDerefConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { invalidPointerToDerefSource(_, source, _) } - override predicate isSource(DataFlow::Node source) { invalidPointerToDerefSource(_, source, _) } - - override predicate isSink(DataFlow::Node sink) { isInvalidPointerDerefSink(sink, _, _) } + predicate isSink(DataFlow::Node sink) { isInvalidPointerDerefSink(sink, _, _) } } +module InvalidPointerToDerefFlow = DataFlow::Make; + /** * Holds if `pai` is a pointer-arithmetic operation and `source` is a dataflow node with a * pointer-value that is non-strictly upper bounded by `pai + delta`. @@ -236,13 +235,13 @@ newtype TMergedPathNode = // The path nodes computed by the first projection of `AllocToInvalidPointerConf` TPathNode1(DataFlow::PathNode p) or // The path nodes computed by `InvalidPointerToDerefConf` - TPathNode3(DataFlow3::PathNode p) or + TPathNode3(InvalidPointerToDerefFlow::PathNode p) or // The read/write that uses the invalid pointer identified by `InvalidPointerToDerefConf`. // This one is needed because the sink identified by `InvalidPointerToDerefConf` is the // pointer, but we want to raise an alert at the dereference. TPathNodeSink(Instruction i) { exists(DataFlow::Node n | - any(InvalidPointerToDerefConf conf).hasFlow(_, n) and + InvalidPointerToDerefFlow::hasFlow(_, n) and isInvalidPointerDerefSink(n, i, _) ) } @@ -252,7 +251,7 @@ class MergedPathNode extends TMergedPathNode { final DataFlow::PathNode asPathNode1() { this = TPathNode1(result) } - final DataFlow3::PathNode asPathNode3() { this = TPathNode3(result) } + final InvalidPointerToDerefFlow::PathNode asPathNode3() { this = TPathNode3(result) } final Instruction asSinkNode() { this = TPathNodeSink(result) } @@ -280,7 +279,7 @@ class PathNode1 extends MergedPathNode, TPathNode1 { class PathNode3 extends MergedPathNode, TPathNode3 { override string toString() { - exists(DataFlow3::PathNode p | + exists(InvalidPointerToDerefFlow::PathNode p | this = TPathNode3(p) and result = p.toString() ) @@ -324,7 +323,9 @@ query predicate edges(MergedPathNode node1, MergedPathNode node2) { * Holds if `p1` is a sink of `AllocToInvalidPointerConf` and `p2` is a source * of `InvalidPointerToDerefConf`, and they are connected through `pai`. */ -predicate joinOn1(PointerArithmeticInstruction pai, DataFlow::PathNode p1, DataFlow3::PathNode p2) { +predicate joinOn1( + PointerArithmeticInstruction pai, DataFlow::PathNode p1, InvalidPointerToDerefFlow::PathNode p2 +) { isSinkImpl(pai, p1.getNode(), _, _) and invalidPointerToDerefSource(pai, p2.getNode(), _) } @@ -334,28 +335,29 @@ predicate joinOn1(PointerArithmeticInstruction pai, DataFlow::PathNode p1, DataF * that dereferences `p1`. The string `operation` describes whether the `i` is * a `StoreInstruction` or `LoadInstruction`. */ -predicate joinOn2(DataFlow3::PathNode p1, Instruction i, string operation) { +predicate joinOn2(InvalidPointerToDerefFlow::PathNode p1, Instruction i, string operation) { isInvalidPointerDerefSink(p1.getNode(), i, operation) } predicate hasFlowPath( - MergedPathNode source1, MergedPathNode sink, DataFlow3::PathNode source3, + MergedPathNode source1, MergedPathNode sink, InvalidPointerToDerefFlow::PathNode source3, PointerArithmeticInstruction pai, string operation ) { exists( - AllocToInvalidPointerConf conf1, InvalidPointerToDerefConf conf2, DataFlow3::PathNode sink3, + AllocToInvalidPointerConf conf1, InvalidPointerToDerefFlow::PathNode sink3, DataFlow::PathNode sink1 | conf1.hasFlowPath(source1.asPathNode1(), _, sink1, _) and joinOn1(pai, sink1, source3) and - conf2.hasFlowPath(source3, sink3) and + InvalidPointerToDerefFlow::hasFlowPath(source3, sink3) and joinOn2(sink3, sink.asSinkNode(), operation) ) } from - MergedPathNode source, MergedPathNode sink, int k, string kstr, DataFlow3::PathNode source3, - PointerArithmeticInstruction pai, string operation, Expr offset, DataFlow::Node n + MergedPathNode source, MergedPathNode sink, int k, string kstr, + InvalidPointerToDerefFlow::PathNode source3, PointerArithmeticInstruction pai, string operation, + Expr offset, DataFlow::Node n where hasFlowPath(source, sink, source3, pai, operation) and invalidPointerToDerefSource(pai, source3.getNode(), k) and From 346086524bb15bdc96bde18ccafebe2a13388891 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Tue, 21 Mar 2023 10:09:01 +0100 Subject: [PATCH 050/143] Python: Accept dataflow-consistency test changes To PRs must have had a conflict when merged separately --- .../dataflow/variable-capture/dataflow-consistency.expected | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/python/ql/test/experimental/dataflow/variable-capture/dataflow-consistency.expected b/python/ql/test/experimental/dataflow/variable-capture/dataflow-consistency.expected index 820c89524bf..fa1789c0a86 100644 --- a/python/ql/test/experimental/dataflow/variable-capture/dataflow-consistency.expected +++ b/python/ql/test/experimental/dataflow/variable-capture/dataflow-consistency.expected @@ -1,5 +1,10 @@ uniqueEnclosingCallable uniqueCallEnclosingCallable +| collections.py:39:17:39:38 | Lambda() | Call should have one enclosing callable but has 0. | +| collections.py:39:17:39:38 | Lambda() | Call should have one enclosing callable but has 0. | +| collections.py:45:19:45:24 | mod() | Call should have one enclosing callable but has 0. | +| collections.py:45:19:45:24 | mod() | Call should have one enclosing callable but has 0. | +| collections.py:52:13:52:24 | mod_local() | Call should have one enclosing callable but has 0. | uniqueType uniqueNodeLocation missingLocation From e90559b86d9739cd3ce2eb0611f8901d4c7c3602 Mon Sep 17 00:00:00 2001 From: Rasmus Wriedt Larsen Date: Tue, 21 Mar 2023 10:24:28 +0100 Subject: [PATCH 051/143] Python: Add missing `options` files I could not for the life of me figure out why the tests were failing, when they were working for me locally :facepalm: --- python/ql/test/experimental/dataflow/coverage-py2/options | 1 + python/ql/test/experimental/dataflow/coverage-py3/options | 1 + 2 files changed, 2 insertions(+) create mode 100644 python/ql/test/experimental/dataflow/coverage-py2/options create mode 100644 python/ql/test/experimental/dataflow/coverage-py3/options diff --git a/python/ql/test/experimental/dataflow/coverage-py2/options b/python/ql/test/experimental/dataflow/coverage-py2/options new file mode 100644 index 00000000000..8dd8d25c998 --- /dev/null +++ b/python/ql/test/experimental/dataflow/coverage-py2/options @@ -0,0 +1 @@ +semmle-extractor-options: --max-import-depth=1 --lang=2 diff --git a/python/ql/test/experimental/dataflow/coverage-py3/options b/python/ql/test/experimental/dataflow/coverage-py3/options new file mode 100644 index 00000000000..cfef58cf2b2 --- /dev/null +++ b/python/ql/test/experimental/dataflow/coverage-py3/options @@ -0,0 +1 @@ +semmle-extractor-options: --max-import-depth=1 --lang=3 From 2876b4aa5deedc9ad354ab559b3115a4064405b7 Mon Sep 17 00:00:00 2001 From: Chris Smowton Date: Tue, 21 Mar 2023 09:25:33 +0000 Subject: [PATCH 052/143] maven-httpo-repository: add Maven wrapper Maven 3.9.1 changes the format of the error message this test is looking for (though it still matches the target regex). Use the Maven wrapper to avoid such sensitivity to the precise version present in the environment. --- .../maven-http-repository/.gitattributes | 6 + .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 59925 bytes .../.mvn/wrapper/maven-wrapper.properties | 18 ++ .../diagnostics/maven-http-repository/mvnw | 287 ++++++++++++++++++ .../maven-http-repository/mvnw.cmd | 187 ++++++++++++ 5 files changed, 498 insertions(+) create mode 100644 java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.gitattributes create mode 100644 java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.jar create mode 100644 java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.properties create mode 100755 java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw create mode 100644 java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw.cmd diff --git a/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.gitattributes b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.gitattributes new file mode 100644 index 00000000000..36e4b9d7df9 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.gitattributes @@ -0,0 +1,6 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# These are explicitly windows files and should use crlf +*.bat text eol=crlf +*.cmd text eol=crlf diff --git a/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.jar b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..bf82ff01c6cdae4a1bb754a6e062954d77ac5c11 GIT binary patch literal 59925 zcmb5U1CS=sk~ZA7ZQHhc+Mc%Ywrx+_*0gQgw(Xv_ZBOg(y}RG;-uU;sUu;#Jh>EHw zGfrmZsXF;&D$0O@!2kh40RbILm8t;!w*&h7T24$wm|jX=oKf)`hV~7E`UmXw?e4Pt z`>_l#5YYGC|ANU0%S(xiDXTEZiATrw!Spl1gyQYxsqjrZO`%3Yq?k$Dr=tVr?HIeHlsmnE9=ZU6I2QoCjlLn85rrn7M!RO}+ z%|6^Q>sv`K3j6Ux>as6NoB}L8q#ghm_b)r{V+Pf3xj>b^+M8ZFY`k|FHgl zM!^0D!qDCjU~cj+fXM$0v@vuwvHcft?EeYw=4fbdZ{qkb#PI)>7{J=%Ux*@pi~i^9 z{(nu6>i-Y^_7lUudx7B}(hUFa*>e0ZwEROS{eRc_U*VV`F$C=Jtqb-$9MS)~&L3im zV)8%4)^9W3c4IT94|h)3k zdAT_~?$Z0{&MK=M0K)Y#_0R;gEjTs0uy4JHvr6q{RKur)D^%t>W+U;a*TZ;VL{kcnJJT z3mD=m7($$%?Y#>-Edcet`uWDH(@wIl+|_f#5l8odHg_|+)4AAYP9)~B^10nU306iE zaS4Y#5&gTL4eHH6&zd(VGyR0Qccx;>0R~Y5#29OkJpSAyr4&h1CYY|I}o)z ze}OiPf5V~(ABejc1pN%8rJQHwPn_`O*q7Dm)p}3K(mm1({hFmfY{yYbM)&Y`2R=h? zTtYwx?$W-*1LqsUrUY&~BwJjr)rO{qI$a`=(6Uplsti7Su#&_03es*Yp0{U{(nQCr z?5M{cLyHT_XALxWu5fU>DPVo99l3FAB<3mtIS<_+71o0jR1A8rd30@j;B75Z!uH;< z{shmnFK@pl080=?j0O8KnkE;zsuxzZx z4X2?!Dk7}SxCereOJK4-FkOq3i{GD#xtAE(tzLUiN~R2WN*RMuA3uYv-3vr9N8;p- z0ovH_gnvKnB5M{_^d`mUsVPvYv`38c2_qP$*@)N(ZmZosbxiRG=Cbm`0ZOx23Zzgs zLJPF;&V~ZV;Nb8ELEf73;P5ciI7|wZBtDl}on%WwtCh8Lf$Yfq`;Hb1D!-KYz&Kd< z+WE+o-gPb6S%ah2^mF80rK=H*+8mQdyrR+)Ar5krl4S!TAAG+sv8o+Teg)`9b22%4 zI7vnPTq&h=o=Z|$;>tEj(i@KN^8N@nk}}6SBhDIGCE4TrmVvM^PlBVZsbZcmR$P7v3{Pw88(jhhI?28MZ>uB%H z&+HAqu-MDFVk5|LYqUXBMR74n1nJ|qLNe#G7UaE>J{uX(rz6McAWj)Ui2R!4y&B01 z`}LOF7k|z0$I+psk+U^Z3YiAH-{>k*@z|0?L4MPNdtsPB+(F791LsRX$Dm(Gycm1k}n z#a2T#*)k-v{}p@^L5PC^@bH+-YO4v`l7Gq)9pgSns??ISG!M6>7&GySTZkVhykqk* zijh9sE`ky?DQPo+7}Vu@?}15_zTovL$r%h~*)=6*vTz?G#h|~>p(ukh%MKOCV^Jxa zi~lMP5+^-OW%Te@b#UoL6T1%9h-W}*hUtdu!>odxuT`kTg6U3+a@6QTiwM0I zqXcEI2x-gOS74?=&<18fYRv&Ms)R>e;Qz&0N20K9%CM_Iq#3V8%pwU>rAGbaXoGVS z-r5a$;fZ>75!`u@7=vV?y@7J;S;E#lvQ?Ar>%ao zOX)rc794W?X64tUEk>y|m_aCxU#N>o!Xw7##(7dIZDuYn0+9DoafcrK_(IUSl$m`A zZF1;0D&2KMWxq{!JlB#Yo*~RCRR~RBkfBb1)-;J`)fjK%LQgUfj-6(iNb3|)(r4fB z-3-I@OH8NV#Rr1`+c=9-0s3A3&EDUg1gC3 zVVb)^B@WE;ePBj#Rg2m!twC+Fe#io0Tzv)b#xh64;e}usgfxu(SfDvcONCs$<@#J@ zQrOhaWLG+)32UCO&4%us+o5#=hq*l-RUMAc6kp~sY%|01#<|RDV=-c0(~U2iF;^~Z zEGyIGa;#2iBbNLww#a{)mO^_H26>4DzS zW3Ln9#3bY?&5y|}CNM1c33!u1X@E`O+UCM*7`0CQ9bK1=r%PTO%S(Xhn0jV&cY5!; zknWK#W@!pMK$6<7w)+&nQZwlnxpxV_loGvL47cDabBUjf{BtT=5h1f2O&`n<$C%+3 zm$_pHm|BCm`G@w&Db)?4fM_YHa%}k|QMMl^&R}^}qj!z-hSy7npCB+A1jrr|1}lLs zw#c+UwVNwxP{=c;rL2BGdx*7zEe1Bcd{@%1-n8y7D4tiWqfpUVh-lHmLXM^KZShOH z*xFp)8|Y+bM`|>mg}p~MOHeh4Ev0_oE?T1n|HMCuuhyf*JDmFP(@8+hi#f-8(!7>g zH}lOHg#Nw(x(LkB`Q;g)oVAM{fXLqlew~t2GU);6V}=6Hx<4O5T!!-c93s;NqxUDm zofsXe!Q%wAD~BBUQ3dIiCtR4WMh-t>ISH?ZMus*wja+&<^&&Gm-nBlDvNS4vFnsl^ ztNpIbyMcWMPfKMe=YnWeIVj|?e>nZbwm$=sV@Qj@A@PE#Gnjlk{CGPDsqFS_)9LEa zuKx7=Sa>|^MiSKB?)pG()OoM}_%lx|mMlX&!?+`^^4bT=yz=ZoxWH_ngA*jX*IZcHOjb62dT(qTvBPn`2AFuL0q` zG+T@693;<++Z2>R2bD`qi0y2-Zf>Ao)K0f&d2P zfP78gpA6dVzjNaH?(M_mDL)R0U=lEaBZvDI4%DXB?8uw7yMJ~gE#%4F`v`Nr+^}vY zNk!D`{o4;L#H`(&_&69MXgCe`BzoU+!tF?72v9Ywy}vJ>QpqhIh5d@V>0xHtnyvuH zkllrfsI^;%I{@6lUi{~rA_w0mAm940-d++CcVAe<%1_RMLrby@&kK~cJQDXKIiybT z-kqt-K3rNz|3HT@un%{nW0OI{_DTXa-Gt@ONBB`7yPzA#K+GBJn@t@$=}KtxV871R zdlK|BI%we#j)k%=s3KJX%`+e4L~_qWz2@P z#)_IbEn(N_Ea!@g!rjt?kw;wph2ziGM|CPAOSzd(_Cp~tpAPO_7R!r5msJ4J@6?@W zb7r0)y);{W17k3}ls4DaNKdRpv@#b#oh4zlV3U@E2TCET9y3LQs1&)-c6+olCeAYp zOdn^BGxjbJIUL0yuFK_Dqpq%@KGOvu(ZgtKw;O*bxSb1Yp#>D?c~ir9P;<3wS2!-P zMc%jlfyqGiZiTjBA(FcUQ9mq#D-cvB9?$ctRZ;8+0s}_I8~6!fM~(jD=psem4Ee>J zWw&CJ7z{P9{Q7Ubye9)gwd`}~OSe#Rf$+;U1GvliVlhuHCK9yJZ2>_y@94OzD`#Ze z9)jO->@7)Bx~CeDJqQK|0%Pfmg&-w7mHdq3hENhQ;IKK;+>|iFp;c?M^kE!kGY&!y zk0I0Fk*!r6F59pwb<6v2ioT*86d(Tee%E1tmlfVjA#rHqA%a~cH`ct#9wX$-o9erW zXJEEOOJ&dezJO$TrCEB2LVOPr4a1H9%k<&lGZo1LDHNDa_xlUqto!CGM^Y}cxJn@x ziOYwn=mHBj_FAw|vMAK^Oqb(dg4Q?7Umqwc#pL?^vpIVNpINMEiP4Ml+xGo3f$#n$ zSTA3aJ)pM~4OPF>OOXOH&EW^(@T%5hknDw^bLpH%?4DjNr1s9Q9(3+8zy87a{1<&7 zQ@0A|_nnege~*7+LF5%wzLWD`lXWotLU4Y&{0i|(kn5hdwj^9o@)((-j86#TKNN|Got?9j^EYE8XJ}!o>}=@hY~siOur_pZ`mJW+ zg}Q?7Q_~bhh6s%uqEU!cv`B=jEp1K|eld>}I`pHtYzif`aZCe88}u$J6??5!TjY7Z zi_PXV!PdeegMrv48ein(j_-BWXDa73W&U|uQY2%u#HZ5hI@4>q?YPsd?K$Vm;~XD| za8S@laz_>}&|R%BD&V-i4%Q6dPCyvF3vd@kU>rvB!x*5ubENu_D>JSGcAwBe1xXs> z#6>7f9RU7nBW^%VMe9x%V$+)28`I~HD=gM$1Sivq)mNV>xD~CileqbUCO{vWg4Rh# zor2~~5hCEN)_0u$!q<(|hY5H=>Bbu%&{4ZV_rD1<#JLjo7b^d16tZ8WIRSY-f>X{Z zrJFo^lCo+3AagC{EW4g= z#o?8?8vCfRVy)U15jF^~4Gl{&Ybt92qe)hZ^_X>`+9vgWKwyZiaxznCo|TfVh3jIi zcEf?H`U;iFaJh=3Gy2JXApN`o zE=O1Gg$YQt6|76IiMNF?q#SA1bPB@dw#H+-V@9gL>;1mg+Cb#k1ey8`dvR+(4ebj= zUV1Z)tKRo}YEh@TN=$v(;aR{{n8vk`w|nNuHuckt$h27 z8*aBefUxw1*r#xB#9egcpXEi_*UAJYXXk!L7j@ zEHre9TeA?cA^qC?JqR^Tr%MObx)3(nztwV-kCeU-pv~$-T<>1;$_fqD%D@B13@6nJvk$Tb z%oMcxY|wp&wv8pf7?>V>*_$XB&mflZG#J;cO4(H9<>)V(X0~FRrD50GSAr_n^}6UI=}MTD3{q9rAHBj;!)G9GGx;~wMc8S8e@_! z_A@g2tE?_kGw#r}Y07^+v*DjB7v08O#kihqtSjT)2uwHG1UbSIKEAO<7Nt3T;R`YCSSj z!e)qa4Y~g>{F>ed`oWGW>((#s$zQGbsS&sg}^pBd?yeAN05Roe8> zT5^XsnI??pY-edI9fQNz3&cr}&YORzr4;sw1u{|Ne1V}nxSb|%Xa_Xy5#TrcTBpS@ z368Ly!a8oDB$mv21-kqD9t&0#7+@mt50oW4*qGcwbx}EyQ=zv+>?xQUL*ja2`WGq` z)sWi!%{f{lG)P(lu6{68R~smEp!Jy9!#~65DQ1AHIc%r7doy*L!1L>x7gLJdR;hH_ zP$2dAdV+VY*^|&oN=|}3-FdyGooDOM-vAGCT@@JyuF4C(otz>?^9!lR%m-tde}ePe z)Jp)zydtP%C02mCPddGz5R9NYvrS6)Bv$~r@W&cP5lLp7-4NrEQDN3%6AmXH@Tdfj zZ+k^}6%>L=d8BK-pxgvV`ix>w6F;U0C zlZ#lnOYYDhj4r)_+s){%-OP5Z{)Xy~)T{p`w1d-Z`uhiyaHX5R=prRWzg^tr8b$NI z3YKgTUvnV)o{xug^1=F=B;=5i^p6ZQ3ES<#>@?2!i0763S{RDit@XiOrjHyVHS*O` z`z@(K2K8gwhd0$u@upveU3ryuDP~by=Xy(MYd_#3r)*XC z^9+R*>njXE-TIP1lci2Q!U>qTn(dh*x7Zxv8r{aX7H$;tD?d1a-PrZ_=K*c8e050Z zQPw-n`us6g%-5T&A%0G0Pakpyp2}L*esj#H#HB!%;_(n z?@GhGHsn-TmjhdE&(mGUnQ3irA0sJtKpZ!N{aFsHtyTb#dkl=dRF+oo-dwy<#wYi=wik;LC6p#Fm zMTEA@?rBOmn>eCuHR%C{!jx>b|+<6B-)Z%(=lG{@y_@8s2x4Hym6ckPdCB$7NZFp_|El()ANXTORs zO@b$@1`3tXjEm>;bX)%xTUC>T)r6eTFtq*Rp*_?%C+fEzT##kVNH` zV}-lw6&hY;cyl5#RR-w!&K4e)Nf4noLFyjiAbKvP7Y!=2lRiRjc$&d?P~!zM@4!?3-vyqs zhm*63jiRI7cfruv!o=zO%H2cQ#o64%*4YAJ=xp~No53pO?eEA$`fR4x=^|*#{u3bx z1YB3OT97ZU3=ol)l`K!lB?~Dj(p_i0)NN=fdgz(QBu>8xV*FGZUb7m4NEbrA+BJ1O z%CPI+T>JPq9zpg~<>QR+je>?{g)rSuWpyCDcc2@rE8T>oNWPiP*u zLZc3LaQVEsC6emsi7DCL0;U0BP!SwAkXuetI25TYuCwD8~Z|M@2_ z0FaBG|x zW)FZvkPsN^5(Q}whYFk-E8)zC(+hZMRe5VA6GZM!beBdDBqq#Rye$I~h@Kf8ae!Ay z*>8BsT)dYB${E3A^j5m_ks3*1_a^uA+^E{Gxcgw2`f7jw8=^DG391okclzQA zwB6_C;;k_7OnwT<<5RjXf#XxTO9}jrCP+Ina|?UA%gFvNJy7HFEx9r{(c&yDZ9e2aovtJL$um8u>s&1k@G6# z-s55RDvTcFYZji6x+UMyCu{&*d4N<{6;H^PEF!?X@SqMfGFR}LYImL1;U}{iT!qnA zgqLCyvSp>>nS}|sv56Dnwxdo&HrZG1WQL_EkC!D6j)JW4Tv1yyqe&aM- zHXlKm;srQVctoDYl&e}E-P8h#PCQNW{Dg*Te>(zP#h*8faKJ!x-}2Rd)+>ssE`OS? zH{q>EEfl3rrD`3e_VOu!qFXm7TC9*Ni&^{$S76?jtB;*1+&lyEq_j{|Nhg&s;W6R9 zB#r9L#a7UU(Vnq#7asUx%ZyVz{CiVL5!CBl-7p|Kl&=g>)8e?z&u?Q^r>L@P zcB6n=#5Wz+@-j`qSB=wD1p_n<(NhAp8wa!IxDP?M&_ zKNcJonwpOS>a3-OBC9jGV@*WND}F8~E_QS7+H3ZK6w&kq>B}kc123ypkAfx`&en&T z+?U=!q?N5DDkt(2$KU;t^dR}IVC|M)pn@S)m{saxD4V?TZZWh@hK|C|n(P&eXLAq1 zZ#v0gPhHJYiyjEkJT~&%u@zLE`Lm!p!&-VAfk?eF{HN%PeV5S87-u3n;g}^R(OZqI zA|##x9SAAKAb!FSr9+E^(}_HX+lb+XLQiWF2UmH*7tM?y7R{u3(Vr<5h8V>Y-c`SgYgD9RvV*ZP{xBLuk-5sAcGP5G zDdk)Ua8PaYS-R*C(V(}4>%>{X%~yk{l3&El7iOz}m0Y8MAl_Qc`-2(z2T3kJ4L1Ek zW&^0C5lA$XL5oFZ0#iRevGn2ZyiotWRIag?#IT-E$gv92YXfp3P1BJxO zShcix4$;b#UM2o=3x#3;cA8Q#>eO8bAQ6o|-tw;9#7`gGIFVll^%!T5&!M|F|99EZ z?=t(Tag~g}`Wep_VX!|sgf_=8n|trl((YTM-kWDQ1U@WIg!~YjGqsZNOrayhav_lrw< zgSle+;b;p^Ff)tDt~?&TweI#6(}<3?Uw1@|4MvG2w}sQgX*N;Q=eD+(bJ%jKJ9L2o z3%MlC9=i-DKzXOun`;&7ZI$Iw?Y|j!RhIn*O`mRl2_vUnE*Rf6$?{IC&#;ZS4_)ww zZ${m6i^cVHNiw5#0MSjEF!NaQfSr&DbTX&tHM{Ke)6Pt9^4_Jf%G&51@IH0aA7QRc zPHND$ytZTZ7-07AEv8Rn%5+<=Bx1tWJSG_?CqXuJ99Zwp=hP2?0a{F)A8HLWkv z)nWbhcgRVdtQ4DpZiw6*)QeCWDXGN6@7m@}SN?Ai*4{l!jL`wrp_lL`bJF6HVAOnj zNa*fTj+{niV5~*O zN5NwHHcEed1knV2GNSZ~H6A+13`U_yY?Dlr@mtyq*Eutin@fLqITcw+{ zgfCsGo5WmpCuv^;uTtgub$oSUezlUgy1KkqBTfdC=XJ}^QYY+iHNnhYEU)j7Oq^M^ zVSeY5OiE#eElD6|4Haq&dOHw4)&QX=k_Ut{?Uvr21pd&diJ zB2+roNX!_7mJ$9n7GNdG8v{=K#ifQnT&%`l82sR{h&TKf?oxK%8RlG}Ia$WP=oQ3C z8x#$S3Rrheyw7recyTpSGf`^->QMX@9dPE# z?9u`K#Vk!hl`$zv<^Wl(#=J4ewGvm4>kxbr*k(>JDRyr_k#52zWRbBBxSsQfy=+DkvQ40v`jh_1C>g+G@4HuqNae&XeekQeAwk+&jN88l@etjc2U0(3m{pQ8vycb^=k>?R~DSv8<0tRfmLp27RlxR~V8j?ClC z)_B-Ne*s0#m}G~_QwykU<`~vMvpTlr7=W&w=#4eEKq!$muL_QJblmEh6*MUg!$z4fC{DBd*3h=N|lf1X7dTfqL1v6~_al z%J+WD;fSJ>TKV*mid$G+8eIjdfK%pu!#kkan;Qi>LK<0bn$?ecFn-b|@+^+OT=0nl zZzN%OUn9w14s`D45>E^)F8?Z?;l!%DF^oL|Yt!@m^V@3twFD@^D5$*5^c%)sM*sbi zk(RQq-d<^O7T8RfFwEK9_us2+S$&W1-Z3OR+XF6$eJl7IgHM~N8sHzWeuzxpB% zE9h3~^*;?_y)7i>a4#z6(ZQ%RaIo)|BtphTOyY@sM+vd#MYN11?ZV(xUvXb&MFg6g z=p`JrH(5;XsW4xVbiJ?|`nutpC1h*K1p~zS%9GcwUz0UWv0GXKX{69Mbhpcsxie0^ zGqgqzpqFAefIt5 zbjNv;*RSO}%{l!Z)c-Qw`A_=i-}4-?=swGSMI^E7)y37u+#O1^yiI2ehK4F|VMVkK z!hIFgJ+Ixg^6jI3#G8UbMwE1a!y~wFx@T(|6G*f($Q=e5na9eDt?f6v;SI;w0g-j% z!J#+aN|M&6l+$5a()!Cs22!+qIEIPkl)zxaaqx#rxQ_>N-kau^^0U$_bj`Aj28>km zI4^hUZb4$c;z)GTY)9y!5eJ{HNqSO{kJDcTYt-+y5;5RiVE9 z-rfg@X78JdxPkxzqWM?WOW8U(8(Lfc7xz`AqOH6jg!Y-7TpXRJ!mtM~T)9C^L}gSL z;YSLGDG_JZayritQkYm6_9cy96BXEf5-2!+OGf|OA7sdZg?o)Z<$B#|?fq|82c!WU zA|T92NDMBJCWHwuFa{aCfTqmu)kwClHDDbMnUQhx07}$x&ef5J(Vmp?fxerb?&J3W zEcoupee$`(0-Aipdr2XA7n`Vp9X;@`bGTh>URo?1%p&sSNNw!h%G)TZ^kT8~og*H% z!X8H2flq&|Mvn=U>8LSX_1WeQi24JnteP@|j;(g*B2HR-L-*$Ubi+J1heSK4&4lJ| zV!1rQLp=f2`FKko6Wb9aaD_i=<=1h?02JU2)?Ey_SS%6EQ>I20QL=(nW-P4=5mvTJ z&kgssLD)l`rHDCI`%vQMOV-yUxHQyhojHdYC*$H1=nrJKqFo93>xvB=M`$}Roksx# zRgV+d8#sk=v+tN#P-n?dx%RC(iv;9-YS-7PrZu#xJ5%k4i*8joRv1J`M_tOQR`{eV zE~<8%VC63sx|_U&{Bpy&?!~^Ce+CNv^T)?diyKrA zu^d&el}PFVWKFz9wkriy~eruRakPmmS0ZsKRiEMGj!_V`HL0FT$ zQU#r2x}sc&kxyY}K}1C{S`{Vdq_TYD4*4zgkU_ShWmQwGl2*ks*=_2Y*s%9QE)5EL zjq8+CA~jxHywIXd=tyIho1XBio%O)2-sMmqnmR&ZQWWD*!GB&UKv6%Ta=zRBv&eyf z{;f~`|5~B_&z17;pNS$3XoIA~G@mWw1YgrTRH95$f&qLKq5wY@A`UX)0I9GbBoHcu zF+!}=i8N>_J}axHrlmb)A1>vwib%T;N(z z!qkz-mizPTt^2F1``LZ#Is;SC`!6@p@t72+xBF5s!+V#&XJ54bJ|~2p(;ngG3+4NA zG?$Orjti%b`%<{?^7HlMZ3wR29z7?;KBDbAvK`kgqx4(N-xp5MuWJ1**FC|9j~trE zo`+jX&aFP*4hP;(>mA>X7yZujK`$QP9w?a`f9cQJaAA2cdE{Tm@v?W3gT&w=XzhbY zCDpADyRHQ?5fOuf*DrAnVn6BjADR2&!sV&wX1+TC*Qk}9xt8KA7}6LBN-_;c;r`H= zwL1uGsU0;W?OEez?W5HYvu>6SR+O8l#ZM+X@T3>y9G^L76W?!YFcytB^-`NyTDB=; zw421!sr`Wwopu>VDWNN>IN&RxE08d0JJZigpK%)p|Ep&aHWO`AFP)}VkqQg1S#TY> z(W)bm7duX(Nvry|l%sGs+Eudz3=_A0i@M47VtBp1RTz_zxlmqgi53tT!_i)(bad*R zt<1n~oT!|>QLmYf?YL$n8QEJ2A6liMI!hRY#mB@?9sWAUW8! z3#M&1`ZQmRP*o`jtHjbA78}!&iq6v&rlp|5&!}O}NT>|10NoWbiq5@7lhquTSHBCO z2a!-M+(e10feoq(nVw~!ZC;y+4M=F0%n)oHB7{BRYdVpeTN zryeS3Ecv^OC_2HcYbRWnOSY2McCa2PfRXH~!iu|fA^#y<&eJkS1^d|DM3)QKAnMe1 zp%9s~@jq$zOV8LQ$SoOZGMPYE@s<@m$#S(N##mh{yFb!URLo?VmR4c2D<_vio;v$u zEJivu^J$RML#dZFhO#!?D8s-JTIP{sV5EqzlSRH3SEW;p+f8?qW%}bdYNyDgxQcQg z)s4r6KHcPGxO_ErHr?P}mfM;FZE)8_I3? zDjMJvQui}|DLHJ=GXcz4%f~W;nZtC{WKitP66ONo4K<7TO!t?TYs_icsROOjf=!bP z#iDYw8Xa2L$P!_IMS+YdG$s?Gh(pybF}++ekEr=v(g97IC8z28gdGEK?6QPNA@g_H znGEeNG!5O#5gfi{IY+V>Q!Z=}bTeH|H2IGYcgh~!jjG`b~gGo!$<2(Kis_p5;(P-s_l8JWL!*jOOFW7(UIXj)5^C~7r z>g7M$hT|sIVBpur@M~;gi~j(BNMp8UkYv?y&{`-sK=@)-@S(2kqobO@Wt_pSnMh|eW*8azy%8exS@DAQxn9~G zE=4(L_gg-jHh5LtdXPgG=|7Xcq4E&x?X2G2ma(6{%4i1k?yUE4(M*Qk6_ z1vv$_*9q$Ow(QAvO;Y5T^gBQ8XX5ULw$iW6S>Q`+1H*Qj+COZ<4PxD-Fwh71j0cBx zz1pnDR}STs5k`ekB^)M`Iu39H@BwM@^8_X7VVp@epjNMqRjF($LBH!#dnEe)By}7T z7*XbIUY>#irgB@|lb)RRvHN^cPT%6slXqX1FW;4YMtNurd;?3g>rm zCSyAc0+aO+x0NojMi`4bp59%=g=zuk4R4o~hTUxxaj-YA z@UtFr6OY{A=_+?qZnrqBO49}q~-hZ!+0QZzD)8F6c7AMQ8Edl-y|d#R;NOh4ukOeId((#ChBKo`M=8Z@5!BZsX7A3n)%+;0Dy*bI-#fNe6_VV1{v%_*=I&54mqAWAg z3XmVyRkbAG&>7rIx23lx*caz7vL$Tha&FcrqTEUNZXhFsibRbc*L@H$q*&{Bx?^60 zRY;2!ODe~pKwKFrQ{(`51;0#9$tKAkXx7c-OI>j-bmJb*`eqq_;q-_i>B=}Mn^h`z za=K-$4B2-GE(-X{u|gHZ+)8*(@CW35iUra3LHje(qEJao_&fXoo%kNF}#{ zYeCndcH;)cUYsmcLrAwQySyF2t+dUrBDL;uWF|wuX8S|lr+Kg8>%G?Kuzxf;L!gZoxAqhd;`!i$5wZfphJ-c zd|uR@Q=cF4N1HXz1y}KjQJ8{7#aqNM_|j!oz6@&wEfq)8)wG4ngiGocMk=1Ft54#R zLyJe(u>P{fm>k_wUn20W9BZ#%fN9ZePCU*5DGK$uQ{GP3{oE1Qd^}1uSrdHw<-AM% znk>YZOU^R94BahzlbdB994?8{%lZ*NSZ4J+IKP3;K9;B))u#S>TRHMqa-y}{@z#V5wvOmV6zw~pafq=5ncOsU z`b-zkO|3C@lwd3SiQZeinzVP4uu+V>2-LKKA)WQXBXPb#G9E8UQ%5@sBgZtYwKzkq zNI6FloMR!lx7fV|WjJ*b`&y_UK9mPl*` z;XO8P%7{H*K=GrNF#+K3At?5`_oXT|Vz!Rh_05t2S&yd`A2 zjcyVJB|#czi?o<&biP<}0alxnpPLzJ9d#_R9(c$2IPXg7=4mL{7WoN>JTCCZ%zV{) zm691r%m?d5yR3l=Qxn7|f0?e7@ zk^9ia@dNTbyi6%GO;kec5sHCjtyr*i1QSY;G}gTsivUQRTG(i)y`O_~K{I*S+x=>M z;}<><>$k8!-=R}>b#)kmSE&~qf+xi@lJazu^F@~pV>MQ3ISq0)qH;F^;_yT@vc-Pr z390Cb$Zq{edB^7W@Mz_+gQ$>@*@>hJIjn4*`B@N%Lt_t1J1wT!aN`jpEBE5;Z|_X| zT^67k%@CVrtYeC}n;uLV%ZSClL-hu4Q5t8ke5a8BZ`=p#4yh?Xa^Q~OrJm_6aD?yj z!Od*^0L5!;q95XIh28eUbyJRpma5tq`0ds9GcX^qcBuCk#1-M-PcC@xgaV`dTbrNS$rEmz&;`STTF>1pK8< z7ykUcQ^6tZ?Yk3DVGovmRU?@pWL#e2L7cLSeBrZc$+IyWiBmoex!W#F#PlFAMT00niUZfkGz z0o{&eGEc{wC^aE3-eC$<2|Ini!y;&5zPE>9MO-I7kOD#cLp<3a%Juu2?88km=iL=? zg)Nm=ku7YEsu57C#BvklPYQ>o_{4C>a9C*0Px#k2ZkQ)j3FI#lIW3mT#f*2!gL4$_ zZDI76!tIw5o=j7Opkr~D0loH62&g?CHDg;Lp^HZ;W7)N+=s>^NuhmsYC?}lxS;sOE z69`R?BLA*%2m_L7BSZ^X5BKaWF-Y?b-HqGLcTd9NU7vY8k|j{O`cOrwxB2WW@tmhU zt`FA4?YCJwFISu42CLh~%e8Qg093rgqDa!ASGd!qoQ1e+yhXD=@Q7u0*^ddk+;D{) zKG0?!-U>8p8=*&(bw!x;E{EjWUUQyY3zVB2V}@t$lg*Bn3FId6V_Ez&aJ%8kzKZg$ zVwL+>zsp;_`X|m4RRvc|Wtejy* z?bG~}+B%y$b6zBRba$P?mX#UbwE{i{@jbuL@tZ6Rn;SCu#2M*$dpQIn$Hqv`MgjBn zURSnq5+1ReLXsI#*A8G1&h5`YFo^I17Y=&&1eQDtwY8HI3#DdGWslPJSP1` z1D()O()qzD6U~BYRUPw6gfc4Wx!am$yM#i~5MCmF8=7(q7;n3?L@7uuvn$;8B8wk8 z3>T-EJ5X9Z3@yH;L=9QFtWmzdE_;Kw^v+te+u`pF zN4&*o>iRKeC&l_{U^a`eymoog3(GY&2h;5vMyRyld37+7bW+&7tvIfrL9TpA@{Z

dy!05UMhSKsK zV1FiJ5SlAhkpcl_H0wRzql?0Qp5wz72o2cMC@utM(|&o0ZO_JpXr+N7l~F?Ef_02md^m|Ly|(EN; z%;)3t6SWt{5hgzszZWS1v^AU?`~Rctor7%qx@EySW!tuG+qP}nwr$(CZQHi1PTA*F z*Vo_ezW4q*-hHnl_8%)^$Bx*s=9+Vi%$1qr5fK%c+Hm4kiE$B;kgV)wam25w$Y7#k5$> zyB^6k3i~L_6~PX554`c3Lxx;&_sT;I^U92G@fS6#(Xv!B%;H3+{e)1R6lyU)8AK1_ z?@>F5H=sXG=ep;kDRZO_ofS}`Jus*Qp3`_V4v~&b-RQ=t8AN5H5{@!_Il~0 zZd!-aH=h)(7CJ&tL%%{P{6d_g=5tsj%S3Z!QxjrLdjoKmNP-zSjdJ!?qL(UMq38ps zjKSz5gzwhDFA;5md5yYb>QN)U_@8Xpjl4yw5065)+#MSGp;yQ*{%mt>12;$~R{eVV>o|juO{Z^ z^o^m@DOBrE2mm1nLgBfA(Wi=X9R%(1UYZcZJ!3;*bR^smI~6lyn`O4BOwo-STsQcyodVA~leg9`{=l(qDl@DCM>s+w`%S_q*PIjYP ziuHHuj0VVW1%+TH*lx9#-$^q&l)G_ojju-w{# zVs{oOc>_fcS51xY+19tN`;V~R0wVyuxdkS|t zC}~Gtu-UyA{H5~6*ocUWM)RfQ076mL1r zFVWV%zx!_*zk`5&dFbdq4nbWxIwAu=`+$V-`m<*-Z*mE2X|>OCAJVV;wlq0E$hVe@&x7V(!xg1*;%`} zxxBu5;jmZEH*e!Rj=Mz|udBR8BR6LiGoLWb<1=<14it;Fuk$6=7YCR&;F+%r`{S6M zP92W>ECy`pZR$Q<6n8Zw1|uh*M=zK=QP0b38_aX#$gB^y>EahIiUzy^MP1ct%UhZX z>FFLVJ=H`FRSq!<_DtWyjLZ6t^Nf|?<69Aj$U0*lrAJG0{t;t8Y^SKLacoR%3EXw+ zDi5T^PkjmJp7@B|$lkEwHHaQ7BGc$})@qNRqk4JH!(bgPM!{Mb&Kz|UGk?QskODW5-NCJ3`Fbks<}%TsOB+e{Hn1i7BP z(XsKkfl`r0N)u1VqaPYGlDxR3>%y{&vYaQCnX8AAv8h8>a^4<#jAhtfa;TdoFlN=?Ac{@Cdxj{YI z!kxobbr?~GU8JKwH2Ywa(#i=Rzof$nu?4-zlN#QJflTO^QkyarxNI<~MY1}jy~Jz` zBRwV&0+G01D9biQ4PR*1NiSqTXZB~NdI6yVEU|AiWJYA>k9G=*`R^VFjr{jhqZ$&G za0#huq)Mhb&8oR!jrv%;xRe@b&PWBXh7ATurhUY7yobngzP;($8b5g z9U{5JMt%fMp(N6ZVGsYa2p(#ry;Y&;GG(DG((_GrS%r&waWuX94*RX8>&x|Lzv8WCaXaWo(3FK=U@G#S$8kCX_R6q|VO;WbeXk~x zmq?NS+S2WfO|{j{dKy5``SRA!r+%)`DCW{s?8uZJW{-4%x}KJzAtiyY6b#)!fe0kA z)=W5C>X6ZLRFH_-$)Z(B8Hr}FD#FLGum2gRluDsrJHf$do$r!ORQqrI6~=-H0vPiG zC2V88MIp?Xhc&UnIS(c)naRXTu-r!%x0J;3uWjp5K%!b_v$;;T0*{_2txs!*+BgP} z%eY2;N7AFz(g@fFy&(hWk`R9#fRZ&X598A7xjHyoDJ4!3CK{Grr4>0bTBw3ps{tN7KqVY^)~B5St2NQS9wH_Lc=s8$1H5J?52_$nh z+rnm{F~bVIsiCZ^Gy&eV*X9JTJZB^`|6F$9|Fq@ekZKP~h_BWGsow^hUpo~MCTrdk^1B;= zNXiYAZnUPm>}{vX*&Yb&{0FNvW!V)h-<{na1yT-|kAkG7xU7QA-NAc|e4Nf2`OWnV zxbr6@^wO^6xW+Xdu=Z{sdK+Qw3Dii+X&Y(VdCv>CFEIOt?MCM?9@CDUKm7+N>%!q z$WI;(L@2YJ&Qfwr7k@<77r}%_q3O8c#><<+(JFdeT2?e+nsP4h+`n(HuX8^8qLN88 zv^9`|ICnNwS^PYDf7ebCGG~QNosD6-%$5;6Yx$`PGlZVnxs6ntftJW^L?iy3KIBDW&1q;{OspV)`a4w`+K45XmW5g6HLPL(lu zM^>HAPux}=ZJ?|;f=zDh!2|)WLyu7pHcc)9vAr(R_-sI`3GRfExjVpYMgql~xox)Q z)W3=WFT93oMdC)bluYO{cphI8Hjl&)W$TKN(PAk2r&mB9-)@%@xbewYx!c z{}phewJ939{qT;q&KR_!>>XnVYPC^kRaX%+G_v;*kg4g0jdi&G2G5$4#bk+*0mK8` zie_>y1oDA_0hGE(n`I(s0k(P&;*KDaX278vofbbNMZ-&1MCmPD*6d6oN$VjMzpTd@C8e zg81s83_+Y#T;duYQ%tXE$RWVk=@P5Z1VY<1C?mU)7?G9IHYx#rHCx1Mhb!ajXBoJ-rANULXqSAu0Mn9s%@_;uy-AOG|5#jDZ3j5dR7|< zR_{f>x5E@uRa$=rDD-yel$t(bf5=#v9ZWObAu%fou?4KkV-kvjmRiGX7iDe(Q)_^=>m}`2$#Xi#5CpJTi#5EF1T1mmPB}c@A6ou~a`>sHSeM4gF(ksh|DObX#Ao1r$Jp3I3 z-#zhd+d&)DO54E0K@@kKgxRB5%x&3BZ$OrawIi6~b_kN~$5G(kH6b5BD&%g70UWu6 z-ub`EccvhA2YleM%U@;V)N{Ixrkd0bjN}m=kn%!g%wE&P@WcBs>5NJ~t}y$Ar7F1n_=iC*<|&`C=qG#+ z0|)?s_kRK(@&?Z40!~gQHirKa2ua%+8CVNj{J7LD3|*Wp?EV9bZ1_j%PH`5U;9>aTZzwPD=a zXur{4zSk&)HrOFOmSK8ZKMHdg*HQk|a($OZ(0puje1K8EZNjPavWjhh64i-B(p7Zf z2g`IQ_W)I`lGa!LCabrDUSVPmGZbVX*#xhnAH|koEn~hs`=w;zVM^IEU${9oXf4C9 zk#|zrR`2_TI+u08MszOoi%H;viD}|x@Ax-{F_aW3ZIQHw-pT;hgNi%weuhcB7xt*kubK4fep+r)eaJIl%p9|sqv{M(E4lgwXe=HL2nYvO$$HX>QpPxqUn}WG zs*l{rztHOO@k5#cP%_alezmlZW9HCcT_;auQpbtV(Kh6e(9wF`C;OM(L&uqUaFglN zk@mRfKGV716J9j|zU-6W(m9pmEF&sbiZMv*M3~8lC~<@%sH8mKCL5zS4h--)TNbi$ zGT~m~}sa$tL(& zG_GBAe(+OZUY}-iY-rcb4f^fNZt_IXS52F^MC6>C?-IuOUttpxwVQBy0~D@|I1g*pQ^8D9@mu?5(kge3_GjbOm2G+7-z zkx`X#L5jF0+(b=RSgOE*XGFk$mF562Yft^UFH0micC5KNH~tfuDq*ce5Q~fKPyieC z9su^F5Df-F2X&FrZ1?<8uQ5h`uh~m z=&m+g_sL;h^%^JcRk%COiklbyo`Co8z9C%hj$&e+^pKMm>7Jt({+@)$DJbC`QjMHZ zi%3X-hLW4Gca)8|Pf3A1t4Ud8Gcj`ZNDE=lz<+3#C9z0jMR_q934+6jFXzJ$uCq~+ za-#O3p1hSU;tiKizC8=Mh@y(Ne3L{f0B?%ewopC*gCiXqueXVpGg9HaGK>hK#}F8++%^d7M6b=5@V(e#PAgrUnD^4)b1JPZ-PGNWqckW?kadj9w8b7f zp6l)!4JIwHtcBOekEW-B`yJ(E6n$+g06FFIjgZzz&+`UpKdgY-=lxNe1BI|=Cg;T; z?FYQs{*)^&tV>xbx0m~jf7l5>`+q#>!*0u^UJNZmE(3w>j|yNHB$#6zkjE;_0pL0S ze2gb)=zGHVUt5ge;3k7XmZcc5;mh=#z-ZobkM!xX0De$bw@9s|&m~zN9 z!K5tX5=4qA2sK|$bdVMz5etUdXN!`}2PL8R7qLr)Si} z!IONdCg$e~UlJ3u{n50K+;kj7SP&tC(^xDUbl{fdvL#ilA93{7Vm|&0)1p+nx=!XmT2qv6B?FjPHZV*SamC-ro9lXMAbWtsPx?Xq1Kcc_^$@r-YuI4|#Q?})HOyhMfBUVTIsc4Su?*`>kGqVs(0tbI_r0@mbv4tR&NZCQd@%?W!R_Br)qtk^~)!$ zd{bZ$2k_tV&)c$dz%vTer6*=naysJcAnpE2vboBzhwzL3ZZg^xE_1)_2eUw2B&FcL zW(!+zg@=0oy{=sCi##j;)Rn!Ty7I5A;QytP@}FjBaRXc9p9bUK6(&VZ!%ayA`L8Y0 zHgiu1Y%~0(WC8`wPF)OYDg?-xhpK#kN37I*3t$V> zeFT`E`_n>;_dQuVYN1PBmZ_}9TfEcl#^=`Abh1!Ek&ykSp^2 zUtg|J2l-(Fu4-@Z^fZW1~i@QYwP9Q9$d-lN6U6i%K#778wN;pE7`?CIfN* z4j%4F^H^LF6Q70%gi@GEB7#Kar{F)1=Hjc!yt?q2&-sWb^&Mo@Ali3 zYsI8ugwjs$rA3@sca{d2=a5mZ6PM=U7R~l1{udpZzpk<&^i)W$IV*$FUzyJ>#@G4l zunDZP3O}4G8=e2)DEXo;q|ooRSY*pQ@?dPnSA%LBmzMuh zj6iCX{hWsksbMQPykb&WEA^2^)4$ly11z>xG12rAj}?8Ft!(tswaOoNlpt=|kqrTJ z&?vxxBG>4bNn(%_w*|gVh^|*LD_=TzvKLX^EG3#)_JHhIOGSwPo4|0o#`B(-!+g_f zebxHKe=60kQz4i3=g8Q=o!~GyJjpp(m|JFSl$~J?ocx92m&&RUW=F?w)i?X8sjbbg z0+7xvpM&&Mvk2s6TEQh%-l$+wW+-wwx(yPsAW>CS<4@5r)9$_e^l&p0?yxh8t`Ni| zvkg20%R$9KD0hWHDff&(!UL3EXA@7RAORZg2_v!tmF`q!lSi%o$>srm>6H|S)B^2X ztV|vT66Q&WzEYv3LCrtL@fFVn_1u!3AIwvi9c5g^-LY)$kEOwFcdT%;T!@=Lh3b{K zJ5DKC5TfipAQ;Xelrj5>A z=_T7N`9+b0vmdY_zM3SwtpmRY?wNX&N^VG?5}z__+A;qz)l|ZX+QaujvNXdiXZ(V? z{OmPo1P@Yd;$G3ic^NHAm|1j%cIXFahDM~236V%gF?}nu9!H?ApHB?XA?IZs*m$xN z6e^ufgCQ0+_=81#=-f_IGbvy4Xizg)_Q^<)baO)G5(DO zgxn}JpKET9(UqMupTD8jB3cp z4G`IGH%ByG7iZ-QD?Esze`e049rA`qU8-l!$qPyeHl#z_q%CNdv(L)XI;?Ng4p}qk zjkLr}p4PA1I;7{Kc1WJp_Y!Q55JqK#sB5nY)=dehb&d)~g=roafxSw>Sbm)`xVXcf zG#`10jAW<8I#Nd!Q<)M`*0YE;dZ$(eKex&V5$dNnGAi-clRskp_SX#aKy?8;Y^RA; z@xEcdlr!iVGK@89*}AMBb@T}NL#V3*a00ErFr0GKMbDa2oQ-DkTV{N0Y_X9!nY1oWN1B)$PK)1Hfas5LPvtlH8ZL@g6sQ;=~> z=vTK;Y5TAt=ya36;hG?pES_n__RRVv!qlpCcy$N%vN$cm%p@=41Lzl*;2C>KsLXaT zT7L{$DZI@k7u*!SE|y2=Df|?99>gyrLB^ur~Y)vi9TpSJl6Z57d+o)lQAdh`R5kMGB7)eE`*Q;2G zQEcRN!Q?$b+o zUoag8iRTMmKuJ)5s&zS~S*B1~zU7tUT|q&h!EInBeZf#vwR|05>zpU0zRe0VWg5C; z+*3eGa6)oAS)jk-xN&bD5&{yx=Oh{=T<=akX4F4Yue*V0VM zkH4;7TLKmx%@)s6c5z_Q&5qaRX;$2vIP-ud)H84PAd0uJX*ee_AkeYKVtI6CW@W(9 z8KHRBux28|zpfOJu7mRVm*s z%?_&|3rLG%MZsk-XuimeAl!(zkxHX`$uQhJ=7%bztEXtmw!ImA{G>b$_T&F%g zFsQ^s?i59_UX8n_!c>ZltM6ABcMHOtRyrRBB3#Yo+AYyiYjPIXgd#0RF$%&xX*?+- zsPtBuy)cPjVkYkf31o50Tp3zUe-dekc|5FYz`%%l5L^>Pje2fT{!AGEHxWG_Yi|{!_@x>cc6%5SD z$ZvA==C5j@X;L3MCV!XA?SG9M0(T#83W28(9aS(t{d&siNAR`PZa(ke>q+Bbo82ut zvU5xmnR~F1ffCpw7|Fg1Gx@$)QGYDzf$|nfH3sKP3=Huhz#4)dH-ay~7cR-ML4hxY zJC3AyNh<#3hBqDyFFY{D#*eE*cnh{slzoT{|2On)ATR!sO#t-^ABA9?$(s~V<1UDq zyo>|Hc*Nrxk#`IYFkXaDTnoHWAP3E#`a^&-`SJ1RcPRHkeTbBZ&q3G_0==kIKNsi8 zPK+SND@w;5@(Jm9!|;LDkth-G0@RZYW&YJ3k={qg)_?xtrkih&RnY!V zo$Y^|7$WW_MlSzvW>1PbggdqghA-L1jCJc$kjxUIfuHEPj zLAS_=)=>DNjluF!EIspf<>8IN^gzw?ak~<)+k{ykeXo%GE=68f$Z;ZaxUAiN%zGF_5d-JZ0I9JZ*6=&gi*5l3i_WA7VrU|K{v|a zF=S?&Yw?$7*XrNDug-5bH}qO#ji37gcoNsG74BAO>OHL zJ+$W5wVs^^UjrNk2QiwyJ(aXP&FiHZNvXoDgPCs;lE0r3q^E zb1QZFSr@``4tbojlnOSCOUjP5QW*?2!?w1>p3YwB&Mp*GO3M*qgz>{jv{ak$b7(E?tkY*+R+^&>> z2dO%o%W=L!QGyw(WuAnw#oO{!I(8KwC|wq_y)<9lMxDiZwL#OlUU_DnD8&!tX&a7f zewQGgB8{dwkjR8EC%AP&bY^iirN#jA47*}#6?~g6@a?%^7(){yv(mgF=P`2yXr$Ab zuYEY=Rw^DeYTFZ^Ywa=6!`PU?q?O*FI=gFl`bbPev2k8T+=C;_X>sLJQt7BpOATpg zrpfyxa?;Uc`KUT2B@@q5dI0rCDDr{Q8d~En$h%e_rtAvjTEMd-OH%Qc7)o~}(R!O` z(i0MG6N^6LsC174qc^gK-0ayYDy1n5!q9mg_|@<( zH^wGhrdBV;Qzf}LA3=l3S|l{2(ylqgc3&K7pj~tzGSA`-wO86b&05pv_SO)Zw_hfmjx}wah`^|Qo(J(X2h!rc zPxx05-j4zshLMr@l7%0`IwPtjmgCwA{Sxj^m0H$vopZOcn-(l18gE{v?!K>bbY!=G2sL;OsI!wlS zl`om0y?Z#6@8vtXFRh`e5wNSy>T)H41%)Nt*jt9t?c#B>nBknI{Kbhq*5+Q8Lxe_H!J*!N? zH;Gr-bx%ExZEmt^9#)xcGN#!|?Xz6|l^~v7U7wM4&5cAIxbMj53pOBXW2LxqE#=+s zUC(EG;8)Odp&Rd)Qg_wrCnDExg_o7dmilm!?}lv0f5NK>w#Db7WRQa5Z94pw011GV zyHnjESKowJ&H%GT#al{iWgq|S`7S)99~4MXM?gl`=`rD9WWj$*)*NbWq$x&Jdq^ z(Q<+*Sx9NqE8$^Fqc(bfoIHwRM8##C@jW61>q;vG-*gk8G>_$;P+4b&%lQGl^XQpt z@48~+y!wp4mqN@Q?HOZ!Yr_;kT-E1R!Dz4OldNG)t;&2^&}q?~dMa&r60E7E)}#>< zrV*SWbim~#un~*J_!+nsWF_-x*9gTk>Hl>g2f7!ZQCMExX9omA0+-Fd%?Ek`^u5Av zTse2a$3`W_+4p=xIbdWKo>d*OlH=zIocE<>kNpS;Lx`OQ&-Q1P$CASxn1-0~RGYd=l#b>XT!xg+7u%F$Q7jSakj)eTa>Ty2qji4Eb4HFzvHy#qP|SXp zeb#Lbt?Nt*I~QuZr{s3Gk%GGcNPV5a16K0EjBCtb^pLdk4E5uLHP+1tY@v3z5hntx9$Vv0Tj2xkovNOuQz_TE%+7VTio)we=x|p6Zw6woNPx zcG_Z2O%BbGxfe9ld2ol=fLGR4aFV*%y*3D#mSjOJI|7z5B4+&ACSoxT&RK_fuBkxk z1Z{D-MxPSpq+f$DN!oyle^-|TkMi;fqFJ1UGd5NFA{AM^B_NurnPV??jj4yDq`QF! zXQ%rlV=SedtGKM5GccN+LZ_zY*nRh^QhVnOGA2jgF~DjqY%>eUXu}5pt)p9N9V|0Q zXC@$-8kj_9y)dSR&f2Q-S$t*V60-4m5IfeHAp)(*?%V*RU3YRI+fVm;XbrN;Znfre zHV>~Kt<08qOPU*d|3s=CmW8uaSX^bMnclwZa0*-JYD_xdlH-9QSVqCTFRD6%n}VS4 zy>uY+r9H8?BwSa;PMf%#`x7lDq2Ra&?)MJ=q&X-Vdw3kLg=AF;bh`Ngu`{SU0AP{2FA1bXzI)&Qc+N zQe2V^EkBDVUja~}gLyF(bfSN%OWm}6u4HUH3r`v7TIiEzS4!DYc1O$+O(bDf_b(zmfoP2*iYBPA-5lKMee z{!TLNugW*re`hye;8u`de34Z~ks!!LT7(P~?WfwY)j%M(rRlsVfY75wv`_j8-f<~Zh@@_No5u3lgB08$gw3J7t6YYm|-P>#mI z?Ihgih8w9<&jhN0?+L@xpaZf^v}|(+(B!Te$gx^{k_-y^@xZ8pvz4Teo8$&XcRy}gCz)E#b#7b-MxVm-OaCXYoKRhcAIJfQDELSMoUPZ2A zGJT9WYcGs3O6S~oE52|3o?hBGjTo}Z^#p~Y8HA5Pg?)uzq1dK9(?}wqZwRa130=%H zYf~z=E0yYqfTG0fyWBEMhY>h2^w4T@H3nLOIgGoExay2GP9=7H+(sF!>QtGs1-g&W z_gbac+_K^zlCn7G0blgrvHCKoOxX2B-RbMlZrJ;wg{CYdkQ}uH=vCz{^XL9b5MT@I1LRLBCN2G_*J_s4ZGh zWx7MbR#kfA8X5^2SsOa1ssX$FKr+_smpYMtr_8IC^|BTXp$X~a|@aOR`r7XM(DK=Ni-`62A>;$AvH z9_f{d2&YCRYk$@WOzak*c~OoAFfe6f@DJQ(UOb0(1s-V6+8}t zM%Y6TDbM(n0`0~e(Z=fVgsQi^OTtAv{cQHYLACfn!I5^C`4kt?8a_m$6 zbcTozSL$v*0uQgb2#l)xk-#q3kt{M?g;oWD0s&KKtKIf|mIluc_x>!Nn=F(UZhmoC@MLVWfWf8%A{!LJ-a9ibm(5(&roPX(GX)q zd@M1x1j~Z)riLkJ6l^njEwFgGs7mySZY8C9vkvltS$4KH+PxmEb7GD8$Z)quJ$36>!5YC6H4?tWLx3jX zL_~2klDHUK>j@1}T+ZgC#@^9#==euU-lRuP-UC^5Cc+L8jCGOV7-{#UL(6{hSs1p> z-8|04uLdI$1?;BBEEg_BTk#KN4^e`X!u!4==E(^tnRt1KV|!i-9k}i*QR9@it-?e5<6jq(E{}G5amY*n+H0gn_Y9 z-8;^pTZ~?CK_9>Yi%5S(q=#!=vps#u3bpC*N25|FGH$TQ9Pd_4r2%$YW!S{i=_C!G zD_fX}hHLaDE%xg_fp|i?KbzndD++)5bCZZKr8}JL`2AxVDM>tTh|-T>%j~EB_}}&( z|K(H^a5QtVF|l}x|sSOHm@dqAK_|9T*4ARfIiVq!E1 z{?^1IHFL*xX$M4a3Mm5YU!EpeD1oBkARcKhJu}}&7N2i-A0U4zc4~oNFEZ@*1*d{J z{!TQ-;$6U&WxGgOjF^lV^S+fK(41yMfFZe${01$COSKm>OdY0Ko`nRwC?nIcv5sS48^fobUN+7gD3h<@?TK=U zsq2}1JqYJDkDjs^)6H3!Y^(ni&NTu{w6vfAOZuc(I-NvUIA5QH9(Sk7D2hx zNiT)h!1lkZYyV}v{?Q|*B<@K93LuZprFU9Oj(?x*`7jTy!&B9yOv zBC(n=8x!WoL6TsFoU<~Hlq~@JoFJC(_I;+4<3?2gkpWZU!T~EWMF7v*q|26`QcQ^K zyY7tY=WEzh-Beb}LTZdzTqsr?>f%%?W^OSKq2qcG1lkqAukEF_zkk$u>XCWe4? z#Ea%vy>ICg-GEoSljel7W)-xQqU;Q+>#pyscZDYnsvo{+1MT9<8T4`~uVdxf?M~|B zynet59NiL z!rIjSxz;b%7{vy1l_G16WSgRE^<nid77&vHB`Hc!j_1F`ZD`0gi18)_8?o51 zU@6a|ci)iO?`1pg1#z@MGaRt#+VAApkLK*L@84Osn8n1p&wayu_RhR=UwwK_{XRd- z@_u3Wn-N%#fS{lWoezfKS`U=q7T4pO{SIjeFQMNZYxLGubs&kZYA-$P^!^hNiAC_F z(&Wq`HKids+xS2b*p4AAYkL|*f4oYA(x!rpT&_C7K;2ZG?{}K&D<-FkT@)`3VJ0Xb zH#wfssnie>s1svHRy7r9dzwfw#yY({tYB*1nNx)vazVXK$6z6(v#cyYmxjT(-pz)Q zmT^!`Ze~41QiQ(6|xf}+@C5ZNKgKywZ9F6&s&=xLzP2GjAv3Y0oF|N9sQ z)#f|e$7y6jIc&Qc}%ut}8+Yq?|zk-iAB&`7zddtXt^a zODQ(DgQqHOTe)pS1jRV(Z4SSYxFFm9bj`YffOXR_nrFrf=Pmfr^F8?NXDAH)RY_IJ zia@*!T}8>IHGTVN@d71~NRP5^{UuSEQBA;iP@E>vHBrii=Mt#3LM<}6v(uCW8I>pj z)iuPfGO41XkYTVm86?P+ZI7a!bu#F#q8E#ld66=_3qe5(7rwYzkyP1Cj<^O27m+O1 zqSOMa#3!)|Oi}&%<#TTC!j#90$`EUJWnuAw(DgEXbdGZ}D3-~lWKfV3CT06jARCpc zgW3?!cGxC<4bPFx>G2K|pQw6%H=mDNJ9f0i7Z9 zM9Op2T#uZC_CRl%l}%9a`x8xq0TEG6nyJmw%8@N+>W!pE-tgq@Th2AO(m( z5h}V(JEs-EqPp`)cKevppHePn%`Qoa-TTm}v83nfYu{=X)eka!5~;S>wiZ9KJjMq6 z>Fgx8lpK|M8rEmK1%a_jTLUsb8vpPoSY+$7N+_;3vCrkzy8E~s*E6qfhheM@ zrP!Wm9FgoRV70zMFupOPdouaMx%rka;9iusBffkukbq&Oa!Av$T*C5wgjUDJqJ6aB z(?h;NzQ4!^wA4Jl_hYZYcSg~3H}db;N0wk864a3n*J6lB-nb)I+5y2n+93^b!`=_} zy?b!&O*YX7-^{Ztu`4-1**M4EM4h_wU2-D?C}Aqy5ML7Yl@D#`Ppq--or&5LPqq_} zTx|N&G1%{D- z63FD%(!Xv4BFxTlU%s)bFl{J%a)l zqbCh9*g7WHB#?5O@r&ddY*myj&i_IQQSRbI!%jx#TIh8Iq)wt}a5M>>xO${;MLFTF zQ_O(@DdX&)d|+07Gko>hSrJy|%;=1|&mC?0hPHtn%4a35agZa4ED#_egj-4`fBqo0R#9mQ#BIn&i-6N6{L`Zvuc zhVM*t=AS0*G3(^>#-9WE*H7jAAN6DZVp#r5)s#1Ibo$Ty%9LoC$U%Pi5WROaGDy=C zPt+z^E_YxBba`ZMfei{n!7?uADyKFLcYluL^~1#!m1QqvZ}0E6J}Q3>QHVrfykO_w zv$|82jDqR3+Dr8`t0^fspZL6W?}Nb;in4>0ln_bv#S{!mP!7LHENN-l=~@%6ujbu+43{~BuZ zw^SLl6$KJ<_cuxbNb7Q!O0hDnWC6M4;8A_GNy9bkmdF>;M}Dt+#2h+{u6VQ^>0eSK z?k25<;(Ths!zu0AKiM3QGv1%~7fk+3?IroYB0MoYk(mh#@FSK8vIjI`ov_bH&I$oz zrLZYtsUQX0EBOWR#C}5l3RW{%Bo}~%2(30eRFFehtEwIkdu=PDTFFsev{oQPGaF9N zLO7CGqMw|o4 zXEdacLL>~Z9Q8;+O$?#CmfUc5aG9?YnHuPISSR3nZ8JM_D8dyb$SQv2-HWX?N}@nm z^pSjPE?!b&xN4pT6Iqj~IYUn!w~x*r*YJ!DJC8qDd%4PPqge{1d$*@GPtr)Wz z>kkUX_B@U^7XN4)%$HV&YAuDsY&6oUGVU~47&0HNr6)8$M29v4AHrT6Y7amNwe@2$ zMSs9J#(B)Opvkmq-rs#zH^A-}z<5I6p~|}zU3FOP#3gE}fPLjmm(O>k5}KVb$R=n4 zvES$OqRV_LtbbnFs2e-~T>F$+Tee&KFz1vD>C`sQ)TI=mBR(H3_R%|oh4VtiF3Lw_ z7tdE0!H=H2f)&ytAwMlWbDnuG(ULf9m*DTI1h-oaT(SX8kWAje29U8iM_5m`S?wCh z|2)fTcQ|>_y8p(TEt&BeR`_UPS^SO_Aw+z!Pzmz)2I2q4*o0Z?4L!A|{tFwR-u=j9 zsk_AMkBW&!9LF;X`vOexf?OkPMS?qF1or}T8%dvO4jne0W%dkm317^C;}z8p2F%50 zC&$arDGBdTWteETu7-Ej;`Eo6}jy1~TUaAs~m zhhS2-ZEu)clw!Zg9(sfvs-2Us;-4ssADLua7E|t`zlU(bj*`I2HTml-oa)BD4e;6x z#Il6qrF;-Y&tW8D@woFayo)8iO4hl9<<`}vd|k|mufrz)`$@MDyYyXLUZ9H^p@Jxe zn3mtSIH_Iw3x1|2Uhj^WaR8u^ISw=>@4vIf@UM=kjX!9O{)a6V`2W#l{>NGNfA8Xd zH=IuY-n}iVHvby@n;Z4Nh6Epb#M;g4i74tF_sb-Rd>-;(kwu z!RK#BjQOW9?`I~}#+8PwCNmj9+V$-8Ece{>&Gqh|xAzMwe+X%;d4~ahM4=pFn5%J& z@T0^41a(ePmuQCKNZXc45sKg7Sq99%CmTnsy4$U_RC+C;tYjWEXHr!g4%MNwS8o=t zU5BBC4m*jkf0GUk%P;RA01A1p(jYj9Vw|c~O0{}Vr%@Vn#JfdxEAB5UcKs;NtiXs5`3}FZBK{*S)g3 z$55~%jX_?tZ2!@XL*pbtJ0W!BhNlhcAlYmd__dLYu$LT3VyZdB7?{G*%+mk){+zJ4 zs;d!SlV0vINdFQ8yIDmbS|~){ZQ+Xl-0nVjY{WBZH5Ok(qD#50@k&HaWJ=SGQjG>sw?0g%xYX zo)I%5ZHB10EwcdHota@yKcn98pHZ*azYhpLLnCWD!~gxero1VS zp@{gsIoVg3UI+zeB3s%p_gfSf;DeNK@ONMnGm*)fS&4SKAx4v=6GM980?4Bv)-VW8 z#%=F+UKG0m8qZe7ZTAh#?Cr)Tq8}KQ_&S>Q)0X>H>+#1=Ija73_V>pJg^y?j*~!oY z-dh3EgHGCh#cwnQaC#T22>X=76ohcssCz$4SzkX0OcV~A(0xas~l-q|+(dlYU+po{VjMHA~h+?A9sV>Gg8pemGtgwQ5AD<1!^m1fsM?$4U=Pdx_dA z1Vdd^{^<QaRq{WW`$q8N+3kYCzjK`3k>V=-aI z24Nj-l1^-9@jCMfs_jjagNd?f30jHf$A9_`|w#Lm3Kw0)GM{<}zxR z>)9>F0>Hl3fVi{#9s@Nu0wh9jAuXw^`{pc}oS@tT^KC?^x}q(lC%Kz#g8xDh&VExs zNwY#ntAS8{_V% z>+5d(Cat43U!n=EJ35}M^%!aT7r^byL#@M=>I%4i#Ns}GAERjzpA-XOl0L$U&V?$O zU5Et*b(n1e(Qj=l+Kt#miKG*{HUE^I6ZIRiZkqVvq{2)w$2r|dfN{q6-d5PiP=H>y zFfj3n#fJ%9Wti#CMh3gPv`;=Zu!_H}OdwcEN1rtFVw`_} z_Z7iZ!2v$7Z1VH$Qo_SQ#Tns=?5 z`x!jNy9?0?NhcNi)A88qo3M6Dd#sE$?1>im5Hw1V3NN-b%$fzwzRli)mN1NdKEb(pdIM^yv_VSLm-8J|0?3wwKx390yng>H+3*|GL-*W zhqW^PVcIsjKMvvlr>9Td{6EOHk^L&Om4yV2S>uv;W9x#II$Ugm-=BcL6@dv|(oORY zX7m_FEQ`+Ch_@gwICp#EKsW=&-ti&EPRU}DiodxpG8l}z?0>$@*Qfn^lwUA4vHp>T zn8Xuty_)qK^|cm#L>NdIiWn4-tCFP#ErT)SiO;BWj^5g|5=@2g>;78mCz@MVas?|7 zTw9y_YH6PE62ZarIw}?Se;E~U6>#}oDb;e5%H*HjJ*!+#%z=w@6J{Q%VSe+1aY$-A zYiu2F<=VJ^sE|Gv9({JrR4pe`8$PwHv2b13V1af%!1$s2UkY;kRS;<6g!xUC8O*#Q-fj;-J7t=$q+gn)jXnj( z1wxL)j~-PE{e9s9bfni~T8*~RgP&P!!_c?gcR8}vTUg>9en5>d&RK=wqPzDm#gp4$ zj01f?E#o{t{#5aQ|3r&h{ZwH5!#4lnpFjQM4u=2m&Px?_6-;NO@5vh4aaz$4;+Vfo zXzFr0t(35F%ut&_KV4xqqT+;eWs@}=fuc#Njz-9FE@W#<@0CnSrHbWCOXB6BNkoY5 zx5$>A@1ET6XYn+j+&CX^rNsROBZnuWN+;2(HE>lR0 zdt+vO8Q`bJK=B4C;yF_|RX7V=U2w9SiCA@8{v$N4F98y0ULq4>-vfwx=hNc^ke)jP z=JtUX3@51;5GL@pCPIo6e?R{P_1Z&Yh~!3;`{l=LI!TdT+GBjnhRsd0E4$?t(cF!z z4~#=v5NNe=^9uQHzBg*}*h}OJs4&Oz+O9l{@=ma&6>15fDnS3Lu zhNjlUH_tu4aG8~G#M(x%^W-&-9c^k#MVC8F+(@<=A-S%`Ub$W?Fc$Kt5+9$Idch*` z8DPZGrrDga&I@4J#R*`!JUMdw*O>xdJluM;2O(QyC6bm(|7=LXtOMpeK2{Oc%&@VGgIM}n=xPTsHZu*o|%=ydsHI*DGc2AD4b$rWMYr_F+cj(?lYu$Y(d0;`Gym zsVB+o4{0WaVAxWNLo&g-2maMO*qGgJH^Fz&7= z2fEolQG2QIcl}C3QYX&n7uJjBQw?>=S+N}$3TvDBB4GzLg zRLYKx^=)OTX4DgErJ$67t1~NTT)b{xDBJpm-PJp6oYIFy>k5yf4es3Dl0RBGlcl=6 zkeqZGj7n2lOVEiD7>~>izlNL*I0?~Dk3B&I=?k3@VF&JxNNflsY7~FfIS1h??ud;d z(DEysJz}!|k{hFP%wR_V1vv6eo}VD6bZprUiHm6Oc!Z({ZoD1T7?|r-)XyP$bG-Kk zs+K#Tcp+0iFn)Ojr~N=xynz_nO>QaMQGRLk!77)=oI))vu#!h&Wy>uG*Xlp#{1EDy z%3$r6jdxpHLNJIgSmO)!3NMHED&BdX_<))Ch(?8pE>b8Lyn%w;OM+3lR+y?QTQooRsb|E)Y+ibYPpR&p z6s+)b!X(VTwzS7+!HF5!N~m_e9HxfjR~m1(1NVhmD`i`y54ph*TuOHuB+7D#w|bn^rs6qM}j4>u88m-909 z8Qn378h$ehryt=81-d2(punML3ZG(*KwecJa-AGkfNPyvMS%^{9mNgCm4!IL&HC@J z^l77MMF&_St=`G-5)v585Jn?7Ln~EA!8Fe_82Ch>P0PpQ+VT)sB9MB@HR@Z3(I;CA zJo(00bBCDqE0P=Q-p@S%iEzyp(jhvEEnkvBeitFmh~)w7kJK)2IQLuSThcG;t;19m zA}y3r+ik(BUg}RFoeS0@+Aw!O=T#}{7vd=KmTSobahGQvS@-iPF`2(zEWZ|rcL;+h z*A_P95X#6hgKb=iO8R&>Lx(@?U7Hnbcz{}VWQ+Y_<#T}WigYMJ>43m!22#ZMp5gld zvjS`{o;AuM{G5Q_d%Q8HaIyEgX^dy2Nw)g^$op4#@1uRb@iKc^`0oDIN}!Mz`O)-4 zeusYO!vEkuT+-Cu{)g`VLl%DQ1^)|Es7&0Jo|i!!?smr5TtY%458>ez*n}wn6hK@k z`Jf#NB}A3*Xpcyjt>2`!1o+JMh!McM?KR%_f7^?f=04Td*%F0@2j|n!kd%~Ws5j%c1tuc1<14SI~GT{=5FRz6U0JD0S?LmuiOd&*a4Hl2GA3j*mk~0 zHG{zh;!{+DZUTEyhhE~-I~nx~s|gCSu*A?HC1m3($CYe+6H9wDyGls11or9(nytJ| zd*-n%2D@K`5fS*rJ)?+*sq?mMo6t0*6fGywY7RRNIp4Ub#|f4Kahsq^&@5tt_sEw0 z6$tBs!r=*u#H5mic33oSM;v_oggvkemK}+&k^{?7?z2fqgf*5IzCiS_fY*Gr3UPfh4gBdXY(XjrTV_9xzp6snGzFWJz6*U5Ae z>b#^$8`}Oa>Yx%)Z5Ua^{d@1j`9<3&2(qX3VKiS|pK-r78?u0jI73d-73h_vE*v9^nb#_S=Y|+zY*z1#s8FFs5YJ2SHfgyTzIL#sp<+tP{L67dQd6i78rY* zPo1dBFRd8bfj;rLUm!egc@bm@LV0>{3_0s5RelFi_9kbtHD7z!KV_t9cYA;Qp^bbc zltWd_-A&ujR6b=W(!+E`0+JwY$>sB{$|=DQjq@`FVnLG&nzyoVm#wvk&sDJ%kUz$< zsz`N9uTKBzKyxY92j4VNeFI0ST2*<$kTnW%H&05Zz(!w3IP3>SMCedaI4A zV!|4#j{auL*KY|)(UQMQZG@D-G_i}_&nIGbPs1fosoM8gw&|v0gvu#GWiJny6dkAA z-tutWs3nWft)s%3*w5>H2Uz2q{mj;TB{`%`((Z0bgJ@|&bigU0=wieD!l+jHeA2opi z+<@NBOcX&dBF*y`WU)wDjBvt|L{|-1lJPd|sI&$C8(Rp_U|c3sZXHuWY9QX6;iwQ@ zLl)3S<^&wxggq*BjIn5v)~&}bg&vOc?VbThy}Qj`JF9KRFi;(X#(;=Vy)XB6dBV3J zDevR#SQo(;_9_)=xm+BwUe=4x19DusZ;98PG=+T`ysxWBjg|D)oYj_G%rpHZl7LV) zX$v2yquc{&c9dXA4Uk6IXmP8L=$*(MyP&AihZ^D6zu3_R{e=R?eo&(G zgA&1i|9A5rl>F<&q)_1>d>FMGiksGIAa&&UH3jzB36t8@&K8KuOPGl~Sdzxq8MLok zG>?S8p?u(Vy!;k|@2}?>b17=?6)Ue>Yv6hw&-f2<^6QYo2k0O#M4vuP>vh?m3~FAs zWF|jlFeAtn3PM((0JAqP$ndl)Z#OhZ5y~7=^E}9~1p_iy!7Z70a`oMBSE#o}pjLJh zVTz*5IIgH$C%LtC9E*RfOV079G@4(p_z1lzvA&$?%4XRKRqv;AP-^Pnu?;u+((h8i zL2LgIFjx6Cw&tN3x_U7nKUtE$c!a$9$#6D#qZGn;&uoa&U&%^Lp(&%yiJeB8xx|}Y z`tgF8XP6d)@q^wa%SeIAAnL0Rk7uuKv@%S~4y(V+fD5CQP@ZZivy)%ess1v}K?`t@ zQuF)fi}JY6u72#6vftxICFm+nwzg$GCg1zMT?(U0_l)Pc5!=B4LxEJS4ns<{gO;!< zXgw`8Hc(F_hbG98bMbG9=a+QL9r8@r^6nI{s-;H15v2MGagO#T9zUH9Ae$D7YdLjA z+b+6rUT1u5x61&npD`pu?-5155E}FMJ^B~@Z|iSJ|IA;1n~6ymKz||ax)GgDo`@H! z=P1HkG53^qWlx#xF?6NhQERNoVoC3Pkt;yj{nM9isXV40D1&?jp+)C!d0N7Z~W~jmsBwN~D`fatRBJZO#*%k>!yjFS^0uKVbnUJd2Ryq$#3wPIxJfZVqJ{k&L&9 zXGCBQb4AEn#6de{voh66ZgSnUtK&f&3VPU`{pLb@%fxrO3nm!q)B}6PdXBGvSNwRb znYu@N!ldSa(*GSjg59@YnmN^50&QLU~Q;g};bg&FW1uN-D6+(tiSj13|*jaU7szS?JO%dg{la; zsYTbJ>S51)l`=Ja293O0qU*grE{>~Vl~KEju8(CD)=RK6c8wXv=Ry{0eQY>gXHbMs zf(9?Q^CXoZo16h3k5t4ol0WgU@(59J#$rXL#!T$oiR2;)m5l~P=ou9rBG zKW3L*?Z8_lpgc$u*MB}N{M3p2H4S>dtnu8Y?ig969?)uZXiMBkgy{rwyvHX{IwQ*1 zAaq*bEdCiNur{67aksM~O|G6rDQ9Zva~!a|*~U!cX7%1NuGu&KR{sIq?_r_$D%$FK zxv_K6f~%Io%g_V7`)TPMKhqWVq~k!XKec!HEiArL`92$v=|=Fy{>{a`u^4b%_X}@F zaX=)3VSRhobHA_OLU51xa|m;}5)1(E>KAu5Af;kUL_1Q|j#ePnvNgw%f9VT`kTto~ zH}bUvD8g--TZr)D%6`~)z-4bH@U}GFb+C$o1;du}!_&pT=wTNZRcmcOcPPeBVAB6U zApYkL{b%<4&!DbQ;Zh1g7M80S$3itpF5HI{9ABip!2*Jmd?dIe6pq(l?`GSuohd_}1NBcI-LaLWPNMI*u862C=;tK_$ z(n&p`Ly#LKfE1kWXOo8=oF9Zma{O61Y#!*hdweURwIrF`@}}l=L)N;UYbO*a0={5B zQUPPZEY(0o5Osk`nMW4tB5m+6q$f&l_QhIa+@Wd8uwM`_ByCMc5C*DD%?Pb~C@-qq zcUh(7rHYZwlq0;NNurHgAibV_8IBFj&GvdPGrx4aFyXuJ79qf40_xr5Z*&bu?vUHi zrL{iT&VA80Zh;VY{H%tC6_8BZ({o_1Zv)FXq{4b}9w7xB9s!AIEI+J~1?*I0z!gqC z3xG=tIMJp6tvi@N)02M3zh-%m@oA)pc$rU1H2dNhDf8U~Nl`etmlVKWe5;&7d?}X) z#txXgpFv;o;ZgP|?+G}GT#aCqPZCeLfh~{RR&(0C1`nBj>JD@+Yd*Zipb_W7Gf&dR z5V2ZWykWs2WOT2WZg=R5kzfX%oX!y=y@3yCsa3&v#Q~(KRS0=IQG@~}1gL_Hi9MPT zOb$ZvS{D{a8pi$b?0yjmst@Cz0w#;kwov4k0bZp8{{js0aEg`EA7HHgs5Ad#3jY5h z$|y+wcqmZ4jM^{z+5*F5kf?I-8xU8MX!ONG3S{RC{6wKbw}R+RQPww&oWsAMXvhap zt+d>3e}@taRsYzaJdD+4Db3PcR$O_GT)VSUS82Aly#Lhr7-D^DHL6>UFAa!(Z`tDH2S}%#z)&5j#_v zI%kw=H*yBO2=zB(wjZ=7X^wI{0z0=}w?GQ@HU*|v+fE|{v@1JogpFc!`~(7k&3Q|dsgmZW#r!!e8PcYLjUy34;4uRDf z9#U%h>|eU(4V1H2NwYq^1oLj0j2<77JiF#IyodH-sB`399Jg_m`T>J$i9NBqF_T2| zyC&(TTyrJmb{i;KT(J-dQ+S^>oT@Y3lhjgdc2vlbcOEcq*0q?A*6wQ_9vQ>{0LuDb zZRZ6M1wCSOOxa5#T1c;C9jdqIy%R@%1LB=aqoVR=;61$~LOOqq4|2q|NfP$om`cza zxN$MGnK9`qf0*4Mo_0+=CIO(it+Jy|&3OL}#D@u}0H~9Qi!g9G0v+R!Lxh||kCi%P z(<{KR{57SQLKrXLIm6Z6l& zc$4!0Kzl;r(d}r&AQ6n@8xKsH{QdVC#Q%mnNLtVTh4tKLwY8B;`=gfQktp{QX3*lp z`jUi_(Lx+oeZBQoN2=!c z*Zn<;PjN}Bi2kG?u(|4nb8Qp|G&Vaa0zF69U4C+aLaW{18t48hLP};2qUR{TriE(( z_nufef{Tz|-WBOp)YCQ zAo-a9Tr1n4nZc&V?(4X#(kb*jw}?4Yd6IXU`Uo~-tv&3WlZt7X=AE&j>pXna8_WF7 zu%l%hY6M+wzY%r-KGIFb{7Rh~U65B(_(#e9GL)8hnJqlywnCmU+XCwELaE~6}7dR^0< zmG6o(Pe~FJK>Sp-LmmQ_Y{Ny|<%<-BV3k!?K4k7SP4Ui}8v#G&m)pT5%^uHxV*AOf5Z3mFX_%v@} zNJoU0h@y`^L0CQPfmGf{+kDXi6rb#B zHBK+?u?~L}H9l@Q&SWpRuHhg?M142jRAWZ!52aHNiFbvJ8aIyf!pst`fjGf5-6-f= zwb!bz9W=``d@FkoH4BPMZw#@XZv2wK9l1@uAviWs!4QCw$(cAyCaF|bC^_yq$P%7Z zu{nCX$L?(D3Z0;9JzjM5)QOA}SWlpp#I+9B9jRNo7%=6RC*+7oc@0!e*%D|r3Xd&G zl(~xANHEg(s8pe8%^PLPo!Pq5z$A2(dTpf|bb^>)2{CN|a^v@|NwKqqt4y zZJw|xD>_7omTcgs+u=xRHk>B!XurguZl!#dFd1?Y8D;e#LZ6?H0EVS0ayB!QtN-g$ zcH%6hKcDnOkn3A`eE6n7uz(m=Q__Lq7zgQdsbNhgsPy3#m~(CooW9}SsSp8C3pFuJO|^k466PtsDJwZU4jVD^=Zf6c$sz zJx3=tMkj&d{`&C7jN}vI;f;uc?!x`X7yFG4w_mUx-5YG#Gg~Rqd!M6RXb^Pvi z%t2y}>Hezt%l@$N_n%u|v#*jgp3)OuAYCVJJ)n-Lh+21Y{5( z{EQ?{{yV5!#4u$K;;=zlSwb&nd8J2pr6J!ak^wTk~#7Pug_Ji~W zzIeweDy5|82Dy0Q5*14Ejdd$Dj$?r03lnnPl=5km%95RA6a~DGO6YZEuqdOgUaFQO zu4U~)q1@XvD5O}+Z-ug-R`dp$p%jSwk9xHvD07!%0Tc#7cqp%hs;f4&p-QVcZpkl( z`ElaX+Gb+m8b%|Bzs)6CF9b07oG6b5{^&0|4*JL1*mI&oIx`Bew_lWCMGHW+^3k^T zMzNXq(UD+64Ee8TSm5)lC^r`p9Ug|pAbz()b%^tO2IYYLF!PBtzZWsd% zvISKmColu+(}g)1pXXz_g*7c$hjGX{Ga7|Zq2>!uK?&*K9$hJ&Et&?ekLm>0lfgUI z4MCYovgLTSV>!|vG=YIL0FMldJtyfX3?Oyt8JihgBD<$+&SSv@nW0}+4f^>V=?Jex zISZFs+aFnEzB3pEbC_uWhcEv`H8VLSZ#J!#o;EbI?WSGIwwI5GE;R)DF@be11NTRj zkL(pD$XEpP#a>4CVoAC8AxU(M|H*%J8Pc*TD%d;?W4CO2VlbT3e26X=rIpJMW)||t zBtD;=S4a_foJ;IY*+jQH0n*l_#f+dqI!IR5z`tP>Si>@8Uo<S{B0)7%2v-7I!k$kBpHTmCx3?f$ z-V45|wQlS}4y_x{$ax0I*8%XXm3rf9hzemc%s^*5MWkUflo)UxE7I_{PCY`gk8D7? zq}n;5q%8X6nvMkAp|ztEy>0Vq?p3_-m<;NH90_JLIdb`iwJGs})O^2~OaVug9$s;( z1TZ#2rV}R?B2&11e18F2sxI5*ZBPkV_iN@8bnk)$Oa^XTk>TskAA@lF)Y$Wlk=8bD z^~8Br&7r7Oww1+Qove3QT|**)gcG2hqNcwNmx zdKav4mfpGzC$czs#!CmON)5DFpNkY2Zp|nDF;s7?)6KX+izo--brmr3100TkLCV3NKFgNP zzRDHL-TM{8UGWvFl$e9gDvqs1tm7e8r(%k}m`Y@=_?SSB!g#1F`AJPqV30|!=_t#h z(Fz>96BCh@xDW?bmtWDKMo`x_sQAIHQw8-0=%M6^dS$u~RhUPwsr4pG9c@snMx#!v zz4g;^nRb;#+41L~7pu1BqmOog{Kai+aTtfhd#kjHA~ZLN2kB_bi;KzHjR#|?NgMbq zDtE4{hNCD4;Yl8%E#gLcPNNlK;#P_4h`pCd8+gw2kPiuIy;x?#P+wJDc1lF@JeRB@ z$Q|W*vmy&|?Fno9LHPW%3srylO;$JUqKUMV+^Jr}>;^sS*5lp}0mQKrIH+7jfcj1_ zg+s$)`O(~+Z5M1?oCRX%$?t%xb;lIl73z~;%t!lwX8%D0z6e`q4aN9(@%@&dO|W@V z;++@g`9#rU`e;?9(L$G*XN(8Bx}*DJ_pXYD$X;RIbq8Rr%D=?B$lobn(>RSrmZ>`M z-l<&a!zIsh8VZC13ys|@+*k?NH}m`AtVbM^IEkd?ryM$Cw+$2q#>N(Yi)YDlurNR8 z>WtKfeX;c>G{i;QZ0iQAs5v{=VT)>lsdThblcv*gG3QgFQq=PcL_cL3UQ$N(Nxf4R z4mK|YaaoT7B+@rRIk94fCa+#z8pbv>GA{?k6IfD9Qd$Y`8?O7`P8u?l8Bd@O1+~5F zk3b}KkS^EVpdSt0anCSL5RrJwt8hsKk+@l)dZiqBrNB~tHz-%_@?V2tbD~Rua0hn; zWoW$_b;r;ONq=)Qf5hY79~#b-t;BQ{x$wsnqi}_51Z!v z?L4$6bsRH{)NG@|>9RUTPPU;ONhxDMcV4ew6>^FOq?dPAiRxB-ce;+K97R*jDvO87 z%8ORzfSUXc=Fjj9(@u|Z<>=g^{8`_qMa2JjSc)TIdA9;7Ovs|WIF^2?5?@bHmEE9n z?$-A4c@Mu-|KO#O;O7Z`a9q zxJ`0HDXm>7us3bPC>`CLNegu8cx_I)SX5V?5VP5TcLnIIvESG{2TtKQ!ND(1UekCl zc7Z~|Rf=E8iPbjA*?%a-$`REL@!^e6s)e9S6@+6`78Q&|uy3@IdM-hfL5b}12!>@7 zfi4+{dXzwG`c-9RA($`Q=dT2GyitLcY8XS@vZwkO3Ci+XqErPHx&*hRQ>k!PAe-D( zKu_wUU(Mob>8;nnjzNB<#*tzzfAQ<1dwkKY{0Grhe`2(zv-PHPL9cVv!zUYJW6qGB=2E|tUuu!j*P^h z6A5wz`(>$mvRL93>J%R=#xIxH;;J2358v*)8^Nzz=BoGRGwaZ{3P8dA#muN~;kYDc z>n7*>Wq6krKp{owp7p!m9-g#sJ3KjP8~sZMC@ntYOMBxNs?=;(gUT<86<6XlZGIJq zmjh$mh%uR~bHRQ7BgV^SsjIB;v!HL`s&hF=eEGq3m?O6obVrt*UTHzU@Z4X z-?+ybh4+k#yoVF~sH@?!)5R-q4Q|Rswd5kTiVN*bX#f!fWUUvZ%G_8Wh_-8~Krz1T{UZn5L6|icUfS5@Q;jk& zVuJ-%WbUU5U_BeB_uF?JDo7x^y#3+W2V|U%!@mnHH_HruYy(upytxuSII3PphBQALx?9`yvjWq z!{rDyhWNr%9n&I}DeE;wT&`j5^IrP1xa2A;y)KY>>7rzO`p2Zq`2~9mCr27&C9Y}$ zfx-Fm65aMd-EO3PxIP63dL05*oaG(80iFDGhV@zm4jY1XbsMVt3-+Lk$CYS|8+hS& z8-%Yo2Jc~sPn4sx_K6vo)bL^3@`#>GdT8enLM_X2n`ng{EjEy6QHHDJ@!K4W-u}5j z;R82L;^tjjS9s~0wa*aDf%rR1PNM34(^t5xCC6U85Qv z#9;JkXR1$G`yyCjQMyIG)@UwUJ-!4f);oc9t_(w1yln2mwLz7>DA6+c{VHy#uD;PW zN?W=wE0W_bC`8(N-?(lFJxtjI;7k!>)4VR^AiV>FUDtB2%X2l;BD&j^t*Qr5y0^;) zw?b0Lo~#FTBRnG3aNY;OfGPz$bxA(;DSs7~`8HJMf(s=V$pp@Z>o_eid+dOnJS&Ua za40~9C)`k?Zi>!KS8xnaf9n^g-+oHVESv4eYS(du>_~|A515P|J4yDM=;2 zM0UyQN$}xOR(jHhN`2J1+j$tsogdDId=a1G34kCCB(G4k&=$@;>O>I|B>>^{_48Sc zF7goM;qdlV<~?UOte=}I&Ji_tE;=J>U=Zsh&qu-Rdjs0a+UHRgr^ak6plCe6KMeF@ zJU>)>K~p3`ao6e%LWVNsOi6dIjRmGE6I-(kifp$A3{Sw{=m9-@#~)7C{Vyvh&i?kDsRp06ZX^m-c+W=jeJ^p~r` z&+tq(N2?f3FuG>)h|bl(t=@I?$kxS)Nd|=ilsIL(qm|b|;aqq@BJM+w07*Q$e{p1b zO-~@UruWqZ<2gtf-?x_M^b)WpXI+Vm9hQZ_$sO<6#&`h%{5IL4!UqK9F4uw1q`lGK z{0=2%_apif(a-9CV}ppmK!6k0&h0_%`)R_3$Lf)y<^B~YGbDr6N0;I?p&eL8ihQ+5`uJtvS zwQtSfbOCxj}B3QIBrNu;DxC)>e6{U)~!hCzoqNp zny3{~n|&&G;_;E;K01dODI8 zgce24dlcM~M_7Q@}Ut2iC8q15dzD=iGf1Qb}_RWK_mU~xGb!Gi?!VX_-6|Lq=cFf7%4eVe=NU9K=Wtel9tQbDhyk7@)G zaj0%HnuKM}X@kYq@wq8P8UR1P)|Y09o!s#I`tXB|@NbghgAV!lkM0-Gs6jjMIJD5~ zLTaM>2S^zW_=`bgY{)EZmpg5NLtngzEc@%fOLn^h?{04}l=FyNQF^+-l}ln;N$hmK zs2B#P%)WyHu$muQ{niPwIQuM9iJKo*_bCE-xZ`Z`Ay@{x264);+4~-3-OIP`T-_`# zcPeW@wg{)zN6*M}nuJ;(iPbyb|6*;C%?G9x{IRt_{!DECkKr)?_lU;ef7!wRXIhh~ z{OXLMjPxZGE}TT-R6%H#QB;~Xm}EFe9!XYu$?iDUVr#}hM9pkPMw>)@R}d$J6`8?0 zlQf6iR@+cvy2>IC8e=EIH=_Fr1?>&keJd>^B{lK96=5)r-aH_DJkfsL)$Vn@#gXs5 z^)|2l3$yQ#bdR)*R1ofOEmCKVLP9=hd%Cg0imbqfWFZuEnWf4A+bwIgp6Fm8DZ5NW z9#*z_|FNv%tp!F_|2^DKvo?fmnI~PCrHkyKxU54iYVWw-r`#WH1%;I6#AaySpFu+JAajI9B6z9S6suF{--a*iU!GEB`hCyV+7663v!t`g(2DAf^( zvqL8QNtR_6sWrH?nM7C`d^aC+_^@#|yt$va@g@GW)5eal`&80|=ud zy3H!oR{ftWnPfWzqfu6(PngIVY4=rTa-mUM)x;s0BB)^ecXT%Ht3tf}4*m0dr!KVu zHuSYNA8)lLcAv_i3|cY6Gmlf87vpW zgQK60L2h^GY9g%N=dM-xTG!K_Ac~xyX35Q)Ff>57LNZBXOgcjz2f@}X4z`BsMOa+#jN$U=Mv3JwNnzIQSVcM;*Z3^E zA{w3pwPu#}T&w5q>C*~S!>Ck;QfkE4_@~-}UTIWF({*R?NVbKF#Tt%?4oqa2m1%() zy5ShK6#7M)xe0fFu-=Hz<HZzOA9QOVm*w#3~(}3Db$((Bg$sXXoT3D=1ov zkfK!s{bCbgA!eie60>QMBl$du2R;Ll3Orz#P0szlxIga=FiAe;RxOO3j-ZZT+Q5*? z6Q|eE7B>era5Jggs7a`%P6Eqn0q!c6Z}Qx?#9q-qP&^E*n=zQ71Rd7O)>QQ;5D{>< z2$yN_=V^VeVH*_*rA`uoo|=OY-_oF8)MjR)Bm6AOLGqg_X~2FldHi{{#Wi`MrnVzD zalyDY`H#%&obRVPCEA+Q3Z{==JPNl2U5QKkReQteUVho+E$bNh{-J=04tckZ#4b={ z#YfY19!wIu2|?Mr#~!MdwAhG$=D?u3d+3Y#ql3UC%v@ma(Y->Q6+guK5nSZ@t8GPl zx0v*OK4X_58bPD7r_r&0b8Ke7bAga^g~lBc+6|!@rJbWB4|#ay?>4(A_g~*E1n;i@ zK}pYZg7p5CMF#s2%bg+NMygbkP)>)A8rmWDUoh6^L%h% zUUA?NX=0>Bf2xpSkG+4hsathn7-sQHVo1_lFx>~p=JvevkF4kt|1(jzakgQep^wom zfv;MAa8fkl6)X+?yXVr&KOyuO2y@d*%*(WiWs2?0ULdr`zIB!l;Q2S1<20 z7k5(g7f7pd_44zx-869ZHB4^e`7ds-q;y|P;N;>sldO2o=P!Jawe8~XL`#|I-*kidTo?f;>AJ5z^yPW zL_Yy?tCFf_94%n=(yi!hm6D8JwG0Jd^AsX>tTdbR>88;CQdLJ z+Iljw44H!snRV~hZ+`*L@|C{R2I#7>_C4}O(DEM*Z}R&T2-zmMU=mc?Isr*%;l2Z6E@GdQXQ zE6yFGUdVB+48dw^#eF9P@tRto9xXw7caarv>W81sy`xkBCuxLSS zJYB2+XzL$#8wSySDztc86VU-1jzEqUjNycoV#A3LHku%J`m6DjMA&sBA%70|xj?F> z$%deE3^iWo4K}dQJT1D^^_tdz*`(?FuPq%TL5j8}E2Sgk6A=q77Ds1ZK30w{YP>p& z#8Vq#UY6HzAXjm1xJI4Cl-el^%?p2>fy%Q1LhYK1u%WXGg+sMSOM7{D<9fHu zb+yr%#^ebn7uVIY#S~TK9&<jqK}aJc*IBTk3GesKj0%hEbwuH<+{l)@|rc5 z-GAQ-{>shxYk_GNTO?bgUxJQ-v*(hd_CtaB7b_}5`75XJCbf7RdWO2IB<%VdjUhYJ z7abavE%-q)IMZ(_rXmIk8F0$b2D^fJ^0L!SFQ5mNFGF1!vnRa4I-tx|iXn0K<@piu zn!I_Zc>>#8+J`5P%s$me=Di=Bw0FgqGs=|<>MNzw1bHV!z{tO=ts#3LXvR1i7b-bB z(+XTuNJdAmk#H8ahCAUo5Qv$Z{fbN`t@EL+^l`ZQC3gjy8wnWDjeoZ~-X)RmQva6+ zAGHTbjm(R?DsQ^~dbshIIZMyjaTi`&a1+4*v%>4I+w4}F5KMetKAu0j2ezypAqt?~ zIT!PzHOjTgtiStX=)^XLORSQ-T8qwJbKZV^5`a2_Gx?9e%J=f;XO4t{e|#d~(b1GJ z^$Gx@Zl~deLFp61-Us0Gwc!6HhMq<4J6Dn~itURCUOqntcF|)BJI97<8wc2{_enZy zpQYA?u{$78y*U+Vo3?EV&0iyA3X^e@^)cYW-}n9(1BqMq&0Wxs1(oS1R!Zdmh#os@ zGedoc|34|qg>mCjeSZ;yrfpDU|J?f7%CZ25%mj+lgz{;?5%t#KjMYM#a!k_dxKL=O zw%h=CknWQy=-0?1w6l62Uw>z^%}<=K-$VSu?AJn;lNsw#0&Zfci4WRjOh7A;3M6@8 z^LHs+(~mJ31E3#i4h&vKXpTNhdd9K~voy6W9!>;Z%1xc&r!$%{6E{rXI9`I4OqQNy zxJG*RRQSJ2I}>;)w>OSYhR9M~LZos{lo*6aQd!12G`6~;m}DQuPLfa|WlLRKT+1|B zveXroREliLTFIIgd*oJ1uD}18D_+jkpnH6Ltk3UzmiN5pJ?FgVd8qGL{!Dwzg4I zc39+X9C0Lx{^I$>^PQTBw{Rf3>3_1Om{>t(y9z0b^~)7bDnHXYu{`Eble#U_&d!&& zqO0muWxsKCv7awPsWYwfe3b6hW)i9BW@9*n&ud8*nVdYs9=}KKc5lSZ*Y`aF(3%ap zE0P%VUey^Lu(i4%-Ej2%ie^l4si4mG?ef)m+S?0RB6Dg+JSu{nl}^7YYktIO@2mXg zk6v{~eslFzn0gh)_}|ncga~)ueQfGhocpp+;sA$J2xw~&(AF9YwKW`wbJkP_az%>tbe^WB+J|Mg2}58P`%3hV|#z$|=ikYS{X?2i_aoWVRqrw4GpRmSYS!x-AdZqF1dN@&?yW(6tB{}(slgRUw^dojogkv5-xylMbrrR#(P?LBG6U_1d zQ-8r#_esbnGGsqz-4h|7i~gBpB{xT3sAEf?O&#b5@0H&NPIZ((W9#CKl(AZR>XME` zPb()$5P(&J=uEVS-MZpoOfkqk;1$&rj&6sb^2G1b7ka?Ij}Axx}kXn%#&Ka~=( zBEvbvGPh3#IS#_E#a-6As2n2Z8TwkqN*zO|#2W&)1eLqCc(ck-Ndj;4+eDMHIV!@E z2`}z$+Q+u8`;uvWxbY`D(P8UE-9Rw>pa4WEPe**>A*Ffc}-k zi2sj41}83Yj_aGWadB=UoS))DMxUQ;iFq7o#;?R<_pkho;(Z-2L8j8P^u^D%f+dPG;UpB}sTa&=$IoCtP3saye==&j8<*KzwMwDHF+b<+pKzqR{Y_P<(F0mwn zrcl;zL6KVauEe4gHDhPT>Z@l>wLeSVa>1q*r+G8fesLU+(e^7VMd_Za%hk|*$~GF3 zn(%p#^~OgrCASlWg73E2-_vMibv(SI?cLZI?rTqZtAZ%clOC0It!$JlW0yQ1n#S!g z*z@YiP5%vnB#(n^Cz#oLcZFs+q^eM3S-;B$08#&rD;RZ<<^bHMtZmD^iqw zuBB65e^pB8LmvG%aninJoT`EGDyKd=Wa&3AYvQlr4>f1xEy1lR(5T+zoBBF2uU+0g zDv*2a$^5ln%`9J`F_)uF_lEA&znh=2`?0e2I!uhX68b>eF0xOMaUf^1X~ue9sF|S;^NedDo+GnDO%C+Gy1zg=|O+5EmS8KfwBxOGp^YhWZl9LB+ zoWXCn6}9=cTl!D|ka`B=OG1C=u5GOp{kS!4e_KL!?fWQ3@Ge#H@5XwH z8|@}}^H&;Lh*`Eq-rHN*GBln$7*!&cCq~X4tGQ10-EhUmc2~V$442}#p4}EhN{}hO zt)h1`@j%<93zx6DSiUeHVsA)enh?3KU(twm7ct2hzoFi8Fhz4PBbR4oFYZ&Q$;dT> z!C3D0%&p~^eRAO~HLXDdSN+63B{Q}9X>L4NT6^*ZUtz>@ANBO)j_s3mRYP4t;v;y1 z1J$k76io@2(v=)lQ}ui_yf*ydMmBj?=0@)9wY8RMTQft)j}b1B_xu07p-@NTt1O1- zrP&glb2U2-`-Q`(;a+19I#@FcwNEcG3AfmuF+c=pxVoPID8#uB=m8}g~n(O(fV>{k-yrT z%?ghWQ)IKh$vXwJZ@YAD40G=ap`+1KK4p)Br_1Woavo@T^m<>PC&B#hU!|J&ey|k_ z4nD3pDDgS3(P11-Y$uQNhZVz5N6F>F!h6BZllEk!_MdK|&aPx|cXhY3a?=stT8Y=e zON`*J*XWAt)HGrxwZ*q+Vqa@ZR!L$}q20V!284MwiP%v31Gsxj)?B>8!)?>u^OApn zubibAoVP(51dG%rOn3B)1%o>rsY(~gcHxBV%zHNcGJAG5LXzusqp zf6xIB1mL$bi4w3Gd_OZ<=ql@JspAZdBy`p3fx$rYJ<-5uph=7HP0s?jFr8%~{M}+| zNTO>9R$pfs>diHr8rccBgeCIxUk5pYDmyHW0xgInO29$zSUV$u*HXpl8RB4To$Jl) z{=g^)d?NLZLQw)fbI!8X+h+vqVdLNM)J_c802p356&!dPP6 zCE7UwrwB-(Cm67|{rYWDP!Y8AfYQ_I;43A7XB{1Ynw2%tgXFFTJT;NX#G{D6V^}|d zVDJD7^jm?x;T-)4a6Qv{?DzgRb=^((gMaJ8lLIg#^ggES;cg28O4wNB&wi4wpM0>1vR)_@;4cOr@Ob#+|3e&Q7EJv(^^|?+hTO*&u!_h2Ss`y zx5A)}f$&VC1c<8AQN@#OY^LLn!S!0&Q*9~*T1_5YgpxCYw2a=t(UH`pO*9TnO)F@Z z{`~n3`;;u525tv@p!e>cBQ9@1N1Q-(w^ep?vvNE_t6@CZl1Ngs1HH`dhzAnP1TKgR z&x+=ipcT78VZ`UK6Yo4@10Zu1dFQ^1lLKX#%I7Y+9FjbP)?{2X?wBENh6hH0t!iov~!_g0%`C9z|%z*OpA9f0PuiVfdgO zf~Mpy6+QnL1HT-G5DZEdApC1jdVT`D&y5iJDway1HzLD3f(U2xlZ7~o-yeiq2;Q4Q zs9aAMpu!K)v!10Ec)Wr4NDwHhZq{nR)NJ^N3n_D#JihOkz~zHi5)l;c*?&PH>xu*& VCNKd3JGtOvEm(5t0lFyE{{i--k}m)N literal 0 HcmV?d00001 diff --git a/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.properties b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000000..6686a643d7d --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.0/apache-maven-3.9.0-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw new file mode 100755 index 00000000000..b7f064624f8 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw @@ -0,0 +1,287 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.1.1 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="`/usr/libexec/java_home`"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + printf '%s' "$(cd "$basedir"; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname $0)") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) wrapperUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $wrapperUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + QUIET="--quiet" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + elif command -v curl > /dev/null; then + QUIET="--silent" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaSource="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=`cygpath --path --windows "$javaSource"` + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw.cmd b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw.cmd new file mode 100644 index 00000000000..474c9d6b74c --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw.cmd @@ -0,0 +1,187 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.1.1 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% From b37bb660c50e80d2a353f478d4ea7a7d90b0fbdf Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 21 Mar 2023 09:24:35 +0000 Subject: [PATCH 053/143] C++: Add FP caused by a BufferAccess inside an unevalauted context. --- .../Critical/OverflowStatic/OverflowStatic.expected | 1 + .../CWE/CWE-119/semmle/tests/OverflowBuffer.expected | 1 + .../CWE/CWE-119/semmle/tests/OverflowStatic.expected | 1 + .../query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp | 6 ++++++ 4 files changed, 9 insertions(+) diff --git a/cpp/ql/test/query-tests/Critical/OverflowStatic/OverflowStatic.expected b/cpp/ql/test/query-tests/Critical/OverflowStatic/OverflowStatic.expected index 0e5bbee7d73..e9ee2bce6fe 100644 --- a/cpp/ql/test/query-tests/Critical/OverflowStatic/OverflowStatic.expected +++ b/cpp/ql/test/query-tests/Critical/OverflowStatic/OverflowStatic.expected @@ -14,3 +14,4 @@ | test.cpp:24:27:24:27 | 4 | Potential buffer-overflow: 'buffer1' has size 3 not 4. | | test.cpp:26:27:26:27 | 4 | Potential buffer-overflow: 'buffer2' has size 3 not 4. | | test.cpp:40:22:40:27 | amount | Potential buffer-overflow: 'buffer' has size 100 not 101. | +| test.cpp:62:33:62:43 | access to array | Potential buffer-overflow: 'buffer' has size 100 but 'buffer[101]' may be accessed here. | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowBuffer.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowBuffer.expected index 8006b5b61a0..f21f8ab3646 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowBuffer.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowBuffer.expected @@ -50,6 +50,7 @@ | tests.cpp:546:6:546:10 | call to fread | This 'fread' operation may access 400 bytes but the $@ is only 100 bytes. | tests.cpp:532:7:532:16 | charBuffer | destination buffer | | tests.cpp:569:6:569:15 | access to array | This array indexing operation accesses a negative index -1 on the $@. | tests.cpp:565:7:565:12 | buffer | array | | tests.cpp:577:7:577:13 | access to array | This array indexing operation accesses a negative index -1 on the $@. | tests.cpp:565:7:565:12 | buffer | array | +| tests.cpp:608:33:608:43 | access to array | This array indexing operation accesses byte offset 101 but the $@ is only 100 bytes. | tests.cpp:607:7:607:12 | buffer | array | | tests_restrict.c:12:2:12:7 | call to memcpy | This 'memcpy' operation accesses 2 bytes but the $@ is only 1 byte. | tests_restrict.c:7:6:7:13 | smallbuf | source buffer | | unions.cpp:26:2:26:7 | call to memset | This 'memset' operation accesses 200 bytes but the $@ is only 100 bytes. | unions.cpp:21:10:21:11 | mu | destination buffer | | unions.cpp:27:2:27:7 | call to memset | This 'memset' operation accesses 100 bytes but the $@ is only 10 bytes. | unions.cpp:15:7:15:11 | small | destination buffer | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowStatic.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowStatic.expected index ac44bbf028d..837d6a930ed 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowStatic.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowStatic.expected @@ -5,4 +5,5 @@ | tests.cpp:245:42:245:42 | 6 | Potential buffer-overflow: 'global_array_5' has size 5 not 6. | | tests.cpp:349:2:349:14 | access to array | Potential buffer-overflow: 'charArray' has size 10 but 'charArray[10]' may be accessed here. | | tests.cpp:350:17:350:29 | access to array | Potential buffer-overflow: 'charArray' has size 10 but 'charArray[10]' may be accessed here. | +| tests.cpp:608:33:608:43 | access to array | Potential buffer-overflow: 'buffer' has size 100 but 'buffer[101]' may be accessed here. | | var_size_struct.cpp:103:39:103:41 | 129 | Potential buffer-overflow: 'str' has size 128 not 129. | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp index 6dbbcdd4b3e..8918543847f 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp @@ -603,6 +603,11 @@ void test22(bool b, const char* source) { memcpy(dest, source, n); // GOOD } +int test23() { + char buffer[100]; + return sizeof(buffer) / sizeof(buffer[101]); // GOOD [FALSE POSITIVE] +} + int tests_main(int argc, char *argv[]) { long long arr17[19]; @@ -627,6 +632,7 @@ int tests_main(int argc, char *argv[]) test20(); test21(argc == 0); test22(argc == 0, argv[0]); + test23(); return 0; } From 8623d8eb8e4ec0e6208a72eb73491bde50e1b20e Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 21 Mar 2023 09:41:30 +0000 Subject: [PATCH 054/143] C++: Exclude unevaluated expressions from BufferAccess. --- cpp/ql/lib/semmle/code/cpp/security/BufferAccess.qll | 2 ++ .../Security/CWE/CWE-119/semmle/tests/OverflowBuffer.expected | 1 - .../query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/security/BufferAccess.qll b/cpp/ql/lib/semmle/code/cpp/security/BufferAccess.qll index faeb859506d..e52babcfe2e 100644 --- a/cpp/ql/lib/semmle/code/cpp/security/BufferAccess.qll +++ b/cpp/ql/lib/semmle/code/cpp/security/BufferAccess.qll @@ -14,6 +14,8 @@ int getPointedSize(Type t) { * BufferWrite differ. */ abstract class BufferAccess extends Expr { + BufferAccess() { not this.isUnevaluated() } + abstract string getName(); /** diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowBuffer.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowBuffer.expected index f21f8ab3646..8006b5b61a0 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowBuffer.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowBuffer.expected @@ -50,7 +50,6 @@ | tests.cpp:546:6:546:10 | call to fread | This 'fread' operation may access 400 bytes but the $@ is only 100 bytes. | tests.cpp:532:7:532:16 | charBuffer | destination buffer | | tests.cpp:569:6:569:15 | access to array | This array indexing operation accesses a negative index -1 on the $@. | tests.cpp:565:7:565:12 | buffer | array | | tests.cpp:577:7:577:13 | access to array | This array indexing operation accesses a negative index -1 on the $@. | tests.cpp:565:7:565:12 | buffer | array | -| tests.cpp:608:33:608:43 | access to array | This array indexing operation accesses byte offset 101 but the $@ is only 100 bytes. | tests.cpp:607:7:607:12 | buffer | array | | tests_restrict.c:12:2:12:7 | call to memcpy | This 'memcpy' operation accesses 2 bytes but the $@ is only 1 byte. | tests_restrict.c:7:6:7:13 | smallbuf | source buffer | | unions.cpp:26:2:26:7 | call to memset | This 'memset' operation accesses 200 bytes but the $@ is only 100 bytes. | unions.cpp:21:10:21:11 | mu | destination buffer | | unions.cpp:27:2:27:7 | call to memset | This 'memset' operation accesses 100 bytes but the $@ is only 10 bytes. | unions.cpp:15:7:15:11 | small | destination buffer | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp index 8918543847f..90f942023c4 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/tests.cpp @@ -605,7 +605,7 @@ void test22(bool b, const char* source) { int test23() { char buffer[100]; - return sizeof(buffer) / sizeof(buffer[101]); // GOOD [FALSE POSITIVE] + return sizeof(buffer) / sizeof(buffer[101]); // GOOD } int tests_main(int argc, char *argv[]) From 4d2a1ea1496f25b8778c79c4b1a6a213a0763a4f Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 21 Mar 2023 09:50:47 +0000 Subject: [PATCH 055/143] C++: Also add a FP test to 'OverflowStatic'. --- cpp/ql/test/query-tests/Critical/OverflowStatic/test.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cpp/ql/test/query-tests/Critical/OverflowStatic/test.cpp b/cpp/ql/test/query-tests/Critical/OverflowStatic/test.cpp index 01a4a0adaef..535e3eb0ce4 100644 --- a/cpp/ql/test/query-tests/Critical/OverflowStatic/test.cpp +++ b/cpp/ql/test/query-tests/Critical/OverflowStatic/test.cpp @@ -56,3 +56,8 @@ void f3() { } } } + +int unevaluated_test() { + char buffer[100]; + return sizeof(buffer) / sizeof(buffer[101]); // GOOD [FALSE POSITIVE] +} \ No newline at end of file From 40cc2e78914bc79f1c0d5e58c69de2ba44629cb6 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 21 Mar 2023 09:53:08 +0000 Subject: [PATCH 056/143] C++: Also exclude unevaluated buffers in 'OverflowStatic'. --- cpp/ql/src/Critical/OverflowStatic.ql | 3 ++- .../Critical/OverflowStatic/OverflowStatic.expected | 1 - cpp/ql/test/query-tests/Critical/OverflowStatic/test.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cpp/ql/src/Critical/OverflowStatic.ql b/cpp/ql/src/Critical/OverflowStatic.ql index 962d2ee89b0..13a4fb6bcb7 100644 --- a/cpp/ql/src/Critical/OverflowStatic.ql +++ b/cpp/ql/src/Critical/OverflowStatic.ql @@ -22,7 +22,8 @@ import LoopBounds private predicate staticBufferBase(VariableAccess access, Variable v) { v.getType().(ArrayType).getBaseType() instanceof CharType and access = v.getAnAccess() and - not memberMayBeVarSize(_, v) + not memberMayBeVarSize(_, v) and + not access.isUnevaluated() } predicate staticBuffer(VariableAccess access, Variable v, int size) { diff --git a/cpp/ql/test/query-tests/Critical/OverflowStatic/OverflowStatic.expected b/cpp/ql/test/query-tests/Critical/OverflowStatic/OverflowStatic.expected index e9ee2bce6fe..0e5bbee7d73 100644 --- a/cpp/ql/test/query-tests/Critical/OverflowStatic/OverflowStatic.expected +++ b/cpp/ql/test/query-tests/Critical/OverflowStatic/OverflowStatic.expected @@ -14,4 +14,3 @@ | test.cpp:24:27:24:27 | 4 | Potential buffer-overflow: 'buffer1' has size 3 not 4. | | test.cpp:26:27:26:27 | 4 | Potential buffer-overflow: 'buffer2' has size 3 not 4. | | test.cpp:40:22:40:27 | amount | Potential buffer-overflow: 'buffer' has size 100 not 101. | -| test.cpp:62:33:62:43 | access to array | Potential buffer-overflow: 'buffer' has size 100 but 'buffer[101]' may be accessed here. | diff --git a/cpp/ql/test/query-tests/Critical/OverflowStatic/test.cpp b/cpp/ql/test/query-tests/Critical/OverflowStatic/test.cpp index 535e3eb0ce4..deeb70ffd57 100644 --- a/cpp/ql/test/query-tests/Critical/OverflowStatic/test.cpp +++ b/cpp/ql/test/query-tests/Critical/OverflowStatic/test.cpp @@ -59,5 +59,5 @@ void f3() { int unevaluated_test() { char buffer[100]; - return sizeof(buffer) / sizeof(buffer[101]); // GOOD [FALSE POSITIVE] + return sizeof(buffer) / sizeof(buffer[101]); // GOOD } \ No newline at end of file From eab43973b7546ee222689c108b808aff9458ee9b Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 21 Mar 2023 10:00:11 +0000 Subject: [PATCH 057/143] C++: Add change note. --- cpp/ql/lib/change-notes/2023-03-21-buffer-access.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 cpp/ql/lib/change-notes/2023-03-21-buffer-access.md diff --git a/cpp/ql/lib/change-notes/2023-03-21-buffer-access.md b/cpp/ql/lib/change-notes/2023-03-21-buffer-access.md new file mode 100644 index 00000000000..7b2b6bad0dc --- /dev/null +++ b/cpp/ql/lib/change-notes/2023-03-21-buffer-access.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `BufferAccess` library (`semmle.code.cpp.security.BufferAccess`) no longer matches buffer accesses inside unevaluated contexts (such as inside `sizeof` or `decltype` expressions). As a result, queries using this library may see fewer false positives. \ No newline at end of file From 2ce0d2b7ee6482209dbd07d9f1bf8f9da1170e26 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 21 Mar 2023 10:07:23 +0000 Subject: [PATCH 058/143] C++: Accept more test changes. --- .../Security/CWE/CWE-119/semmle/tests/OverflowStatic.expected | 1 - 1 file changed, 1 deletion(-) diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowStatic.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowStatic.expected index 837d6a930ed..ac44bbf028d 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowStatic.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-119/semmle/tests/OverflowStatic.expected @@ -5,5 +5,4 @@ | tests.cpp:245:42:245:42 | 6 | Potential buffer-overflow: 'global_array_5' has size 5 not 6. | | tests.cpp:349:2:349:14 | access to array | Potential buffer-overflow: 'charArray' has size 10 but 'charArray[10]' may be accessed here. | | tests.cpp:350:17:350:29 | access to array | Potential buffer-overflow: 'charArray' has size 10 but 'charArray[10]' may be accessed here. | -| tests.cpp:608:33:608:43 | access to array | Potential buffer-overflow: 'buffer' has size 100 but 'buffer[101]' may be accessed here. | | var_size_struct.cpp:103:39:103:41 | 129 | Potential buffer-overflow: 'str' has size 128 not 129. | From 41becfe2ba7aa808cda77183913b4f1228dbe89a Mon Sep 17 00:00:00 2001 From: Felicity Chapman Date: Tue, 21 Mar 2023 11:19:53 +0000 Subject: [PATCH 059/143] Add new article to manual TOC --- docs/codeql/codeql-language-guides/codeql-for-cpp.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/codeql/codeql-language-guides/codeql-for-cpp.rst b/docs/codeql/codeql-language-guides/codeql-for-cpp.rst index ab1afbd325b..ddbdfa4e1ca 100644 --- a/docs/codeql/codeql-language-guides/codeql-for-cpp.rst +++ b/docs/codeql/codeql-language-guides/codeql-for-cpp.rst @@ -32,7 +32,7 @@ Experiment and learn how to write effective and efficient queries for CodeQL dat - :doc:`Conversions and classes in C and C++ `: You can use the standard CodeQL libraries for C and C++ to detect when the type of an expression is changed. -- :doc:`Analyzing data flow in C and C++ `: You can use data flow analysis to track the flow of potentially malicious or insecure data that can cause vulnerabilities in your codebase. +- :doc:`Analyzing data flow in C and C++ (New) `: You can use data flow analysis to track the flow of potentially malicious or insecure data that can cause vulnerabilities in your codebase. For information about data flow analysis in versions up to CodeQL 2.12.4, see :doc:`Analyzing data flow in C and C++ `. - :doc:`Refining a query to account for edge cases `: You can improve the results generated by a CodeQL query by adding conditions to remove false positive results caused by common edge cases. From da96ed1ff9f7a67adede946a7b05eaa20f54cb83 Mon Sep 17 00:00:00 2001 From: Felicity Chapman Date: Tue, 21 Mar 2023 11:38:13 +0000 Subject: [PATCH 060/143] A few tweaks --- .../codeql-language-guides/analyzing-data-flow-in-cpp-new.rst | 4 ++-- .../codeql-language-guides/analyzing-data-flow-in-cpp.rst | 2 +- docs/codeql/codeql-language-guides/codeql-for-cpp.rst | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp-new.rst b/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp-new.rst index 5c3d81e3f42..00e15acef2a 100644 --- a/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp-new.rst +++ b/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp-new.rst @@ -2,9 +2,9 @@ .. pull-quote:: Note - The data flow library described here is available from CodeQL 2.12.5 onwards. See :ref:`here ` for the library available in earlier versions. + The data flow library described here is available from CodeQL 2.12.5 onwards. For information on the previous version of the library, see :ref:`Analyzing data flow in C and C++ ` for the library available in earlier versions. -Analyzing data flow in C and C++ (New) +Analyzing data flow in C and C++ (new) ====================================== You can use data flow analysis to track the flow of potentially malicious or insecure data that can cause vulnerabilities in your codebase. diff --git a/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp.rst b/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp.rst index 7cfe15cb64c..b70bfa7a3f8 100644 --- a/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp.rst +++ b/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp.rst @@ -2,7 +2,7 @@ .. pull-quote:: Note - The data flow library described here will be deprecated in the near future. For the replacement library, which is available from CodeQL 2.12.5 onwards, see :ref:`here `. + The data flow library used in this article has been replaced with an improved library which is available from CodeQL 2.12.5 onwards, see :ref:`Analyzing data flow in C and C++ (new) `. The old library will be deprecated in the near future and removed a year after deprecation. Analyzing data flow in C and C++ ================================ diff --git a/docs/codeql/codeql-language-guides/codeql-for-cpp.rst b/docs/codeql/codeql-language-guides/codeql-for-cpp.rst index ddbdfa4e1ca..703c3e93e4f 100644 --- a/docs/codeql/codeql-language-guides/codeql-for-cpp.rst +++ b/docs/codeql/codeql-language-guides/codeql-for-cpp.rst @@ -32,7 +32,7 @@ Experiment and learn how to write effective and efficient queries for CodeQL dat - :doc:`Conversions and classes in C and C++ `: You can use the standard CodeQL libraries for C and C++ to detect when the type of an expression is changed. -- :doc:`Analyzing data flow in C and C++ (New) `: You can use data flow analysis to track the flow of potentially malicious or insecure data that can cause vulnerabilities in your codebase. For information about data flow analysis in versions up to CodeQL 2.12.4, see :doc:`Analyzing data flow in C and C++ `. +- :doc:`Analyzing data flow in C and C++ (new) `: You can use data flow analysis to track the flow of potentially malicious or insecure data that can cause vulnerabilities in your codebase. For information about data flow analysis in versions up to CodeQL 2.12.4, see :doc:`Analyzing data flow in C and C++ `. - :doc:`Refining a query to account for edge cases `: You can improve the results generated by a CodeQL query by adding conditions to remove false positive results caused by common edge cases. From 719708cb89412366f2de628ed613ec1e153757f1 Mon Sep 17 00:00:00 2001 From: Felicity Chapman Date: Tue, 21 Mar 2023 11:40:35 +0000 Subject: [PATCH 061/143] Fix typo --- .../codeql-language-guides/analyzing-data-flow-in-cpp-new.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp-new.rst b/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp-new.rst index 00e15acef2a..911c930458e 100644 --- a/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp-new.rst +++ b/docs/codeql/codeql-language-guides/analyzing-data-flow-in-cpp-new.rst @@ -2,7 +2,7 @@ .. pull-quote:: Note - The data flow library described here is available from CodeQL 2.12.5 onwards. For information on the previous version of the library, see :ref:`Analyzing data flow in C and C++ ` for the library available in earlier versions. + The data flow library described here is available from CodeQL 2.12.5 onwards. For information on the previous version of the library, see :ref:`Analyzing data flow in C and C++ `. Analyzing data flow in C and C++ (new) ====================================== From a865f1666d7de8b183cbf70ab703bfdc692fb163 Mon Sep 17 00:00:00 2001 From: Chris Smowton Date: Tue, 21 Mar 2023 09:25:33 +0000 Subject: [PATCH 062/143] maven-httpo-repository: add Maven wrapper Maven 3.9.1 changes the format of the error message this test is looking for (though it still matches the target regex). Use the Maven wrapper to avoid such sensitivity to the precise version present in the environment. --- .../maven-http-repository/.gitattributes | 6 + .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 59925 bytes .../.mvn/wrapper/maven-wrapper.properties | 18 ++ .../diagnostics/maven-http-repository/mvnw | 287 ++++++++++++++++++ .../maven-http-repository/mvnw.cmd | 187 ++++++++++++ 5 files changed, 498 insertions(+) create mode 100644 java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.gitattributes create mode 100644 java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.jar create mode 100644 java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.properties create mode 100755 java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw create mode 100644 java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw.cmd diff --git a/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.gitattributes b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.gitattributes new file mode 100644 index 00000000000..36e4b9d7df9 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.gitattributes @@ -0,0 +1,6 @@ +# +# https://help.github.com/articles/dealing-with-line-endings/ +# +# These are explicitly windows files and should use crlf +*.bat text eol=crlf +*.cmd text eol=crlf diff --git a/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.jar b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..bf82ff01c6cdae4a1bb754a6e062954d77ac5c11 GIT binary patch literal 59925 zcmb5U1CS=sk~ZA7ZQHhc+Mc%Ywrx+_*0gQgw(Xv_ZBOg(y}RG;-uU;sUu;#Jh>EHw zGfrmZsXF;&D$0O@!2kh40RbILm8t;!w*&h7T24$wm|jX=oKf)`hV~7E`UmXw?e4Pt z`>_l#5YYGC|ANU0%S(xiDXTEZiATrw!Spl1gyQYxsqjrZO`%3Yq?k$Dr=tVr?HIeHlsmnE9=ZU6I2QoCjlLn85rrn7M!RO}+ z%|6^Q>sv`K3j6Ux>as6NoB}L8q#ghm_b)r{V+Pf3xj>b^+M8ZFY`k|FHgl zM!^0D!qDCjU~cj+fXM$0v@vuwvHcft?EeYw=4fbdZ{qkb#PI)>7{J=%Ux*@pi~i^9 z{(nu6>i-Y^_7lUudx7B}(hUFa*>e0ZwEROS{eRc_U*VV`F$C=Jtqb-$9MS)~&L3im zV)8%4)^9W3c4IT94|h)3k zdAT_~?$Z0{&MK=M0K)Y#_0R;gEjTs0uy4JHvr6q{RKur)D^%t>W+U;a*TZ;VL{kcnJJT z3mD=m7($$%?Y#>-Edcet`uWDH(@wIl+|_f#5l8odHg_|+)4AAYP9)~B^10nU306iE zaS4Y#5&gTL4eHH6&zd(VGyR0Qccx;>0R~Y5#29OkJpSAyr4&h1CYY|I}o)z ze}OiPf5V~(ABejc1pN%8rJQHwPn_`O*q7Dm)p}3K(mm1({hFmfY{yYbM)&Y`2R=h? zTtYwx?$W-*1LqsUrUY&~BwJjr)rO{qI$a`=(6Uplsti7Su#&_03es*Yp0{U{(nQCr z?5M{cLyHT_XALxWu5fU>DPVo99l3FAB<3mtIS<_+71o0jR1A8rd30@j;B75Z!uH;< z{shmnFK@pl080=?j0O8KnkE;zsuxzZx z4X2?!Dk7}SxCereOJK4-FkOq3i{GD#xtAE(tzLUiN~R2WN*RMuA3uYv-3vr9N8;p- z0ovH_gnvKnB5M{_^d`mUsVPvYv`38c2_qP$*@)N(ZmZosbxiRG=Cbm`0ZOx23Zzgs zLJPF;&V~ZV;Nb8ELEf73;P5ciI7|wZBtDl}on%WwtCh8Lf$Yfq`;Hb1D!-KYz&Kd< z+WE+o-gPb6S%ah2^mF80rK=H*+8mQdyrR+)Ar5krl4S!TAAG+sv8o+Teg)`9b22%4 zI7vnPTq&h=o=Z|$;>tEj(i@KN^8N@nk}}6SBhDIGCE4TrmVvM^PlBVZsbZcmR$P7v3{Pw88(jhhI?28MZ>uB%H z&+HAqu-MDFVk5|LYqUXBMR74n1nJ|qLNe#G7UaE>J{uX(rz6McAWj)Ui2R!4y&B01 z`}LOF7k|z0$I+psk+U^Z3YiAH-{>k*@z|0?L4MPNdtsPB+(F791LsRX$Dm(Gycm1k}n z#a2T#*)k-v{}p@^L5PC^@bH+-YO4v`l7Gq)9pgSns??ISG!M6>7&GySTZkVhykqk* zijh9sE`ky?DQPo+7}Vu@?}15_zTovL$r%h~*)=6*vTz?G#h|~>p(ukh%MKOCV^Jxa zi~lMP5+^-OW%Te@b#UoL6T1%9h-W}*hUtdu!>odxuT`kTg6U3+a@6QTiwM0I zqXcEI2x-gOS74?=&<18fYRv&Ms)R>e;Qz&0N20K9%CM_Iq#3V8%pwU>rAGbaXoGVS z-r5a$;fZ>75!`u@7=vV?y@7J;S;E#lvQ?Ar>%ao zOX)rc794W?X64tUEk>y|m_aCxU#N>o!Xw7##(7dIZDuYn0+9DoafcrK_(IUSl$m`A zZF1;0D&2KMWxq{!JlB#Yo*~RCRR~RBkfBb1)-;J`)fjK%LQgUfj-6(iNb3|)(r4fB z-3-I@OH8NV#Rr1`+c=9-0s3A3&EDUg1gC3 zVVb)^B@WE;ePBj#Rg2m!twC+Fe#io0Tzv)b#xh64;e}usgfxu(SfDvcONCs$<@#J@ zQrOhaWLG+)32UCO&4%us+o5#=hq*l-RUMAc6kp~sY%|01#<|RDV=-c0(~U2iF;^~Z zEGyIGa;#2iBbNLww#a{)mO^_H26>4DzS zW3Ln9#3bY?&5y|}CNM1c33!u1X@E`O+UCM*7`0CQ9bK1=r%PTO%S(Xhn0jV&cY5!; zknWK#W@!pMK$6<7w)+&nQZwlnxpxV_loGvL47cDabBUjf{BtT=5h1f2O&`n<$C%+3 zm$_pHm|BCm`G@w&Db)?4fM_YHa%}k|QMMl^&R}^}qj!z-hSy7npCB+A1jrr|1}lLs zw#c+UwVNwxP{=c;rL2BGdx*7zEe1Bcd{@%1-n8y7D4tiWqfpUVh-lHmLXM^KZShOH z*xFp)8|Y+bM`|>mg}p~MOHeh4Ev0_oE?T1n|HMCuuhyf*JDmFP(@8+hi#f-8(!7>g zH}lOHg#Nw(x(LkB`Q;g)oVAM{fXLqlew~t2GU);6V}=6Hx<4O5T!!-c93s;NqxUDm zofsXe!Q%wAD~BBUQ3dIiCtR4WMh-t>ISH?ZMus*wja+&<^&&Gm-nBlDvNS4vFnsl^ ztNpIbyMcWMPfKMe=YnWeIVj|?e>nZbwm$=sV@Qj@A@PE#Gnjlk{CGPDsqFS_)9LEa zuKx7=Sa>|^MiSKB?)pG()OoM}_%lx|mMlX&!?+`^^4bT=yz=ZoxWH_ngA*jX*IZcHOjb62dT(qTvBPn`2AFuL0q` zG+T@693;<++Z2>R2bD`qi0y2-Zf>Ao)K0f&d2P zfP78gpA6dVzjNaH?(M_mDL)R0U=lEaBZvDI4%DXB?8uw7yMJ~gE#%4F`v`Nr+^}vY zNk!D`{o4;L#H`(&_&69MXgCe`BzoU+!tF?72v9Ywy}vJ>QpqhIh5d@V>0xHtnyvuH zkllrfsI^;%I{@6lUi{~rA_w0mAm940-d++CcVAe<%1_RMLrby@&kK~cJQDXKIiybT z-kqt-K3rNz|3HT@un%{nW0OI{_DTXa-Gt@ONBB`7yPzA#K+GBJn@t@$=}KtxV871R zdlK|BI%we#j)k%=s3KJX%`+e4L~_qWz2@P z#)_IbEn(N_Ea!@g!rjt?kw;wph2ziGM|CPAOSzd(_Cp~tpAPO_7R!r5msJ4J@6?@W zb7r0)y);{W17k3}ls4DaNKdRpv@#b#oh4zlV3U@E2TCET9y3LQs1&)-c6+olCeAYp zOdn^BGxjbJIUL0yuFK_Dqpq%@KGOvu(ZgtKw;O*bxSb1Yp#>D?c~ir9P;<3wS2!-P zMc%jlfyqGiZiTjBA(FcUQ9mq#D-cvB9?$ctRZ;8+0s}_I8~6!fM~(jD=psem4Ee>J zWw&CJ7z{P9{Q7Ubye9)gwd`}~OSe#Rf$+;U1GvliVlhuHCK9yJZ2>_y@94OzD`#Ze z9)jO->@7)Bx~CeDJqQK|0%Pfmg&-w7mHdq3hENhQ;IKK;+>|iFp;c?M^kE!kGY&!y zk0I0Fk*!r6F59pwb<6v2ioT*86d(Tee%E1tmlfVjA#rHqA%a~cH`ct#9wX$-o9erW zXJEEOOJ&dezJO$TrCEB2LVOPr4a1H9%k<&lGZo1LDHNDa_xlUqto!CGM^Y}cxJn@x ziOYwn=mHBj_FAw|vMAK^Oqb(dg4Q?7Umqwc#pL?^vpIVNpINMEiP4Ml+xGo3f$#n$ zSTA3aJ)pM~4OPF>OOXOH&EW^(@T%5hknDw^bLpH%?4DjNr1s9Q9(3+8zy87a{1<&7 zQ@0A|_nnege~*7+LF5%wzLWD`lXWotLU4Y&{0i|(kn5hdwj^9o@)((-j86#TKNN|Got?9j^EYE8XJ}!o>}=@hY~siOur_pZ`mJW+ zg}Q?7Q_~bhh6s%uqEU!cv`B=jEp1K|eld>}I`pHtYzif`aZCe88}u$J6??5!TjY7Z zi_PXV!PdeegMrv48ein(j_-BWXDa73W&U|uQY2%u#HZ5hI@4>q?YPsd?K$Vm;~XD| za8S@laz_>}&|R%BD&V-i4%Q6dPCyvF3vd@kU>rvB!x*5ubENu_D>JSGcAwBe1xXs> z#6>7f9RU7nBW^%VMe9x%V$+)28`I~HD=gM$1Sivq)mNV>xD~CileqbUCO{vWg4Rh# zor2~~5hCEN)_0u$!q<(|hY5H=>Bbu%&{4ZV_rD1<#JLjo7b^d16tZ8WIRSY-f>X{Z zrJFo^lCo+3AagC{EW4g= z#o?8?8vCfRVy)U15jF^~4Gl{&Ybt92qe)hZ^_X>`+9vgWKwyZiaxznCo|TfVh3jIi zcEf?H`U;iFaJh=3Gy2JXApN`o zE=O1Gg$YQt6|76IiMNF?q#SA1bPB@dw#H+-V@9gL>;1mg+Cb#k1ey8`dvR+(4ebj= zUV1Z)tKRo}YEh@TN=$v(;aR{{n8vk`w|nNuHuckt$h27 z8*aBefUxw1*r#xB#9egcpXEi_*UAJYXXk!L7j@ zEHre9TeA?cA^qC?JqR^Tr%MObx)3(nztwV-kCeU-pv~$-T<>1;$_fqD%D@B13@6nJvk$Tb z%oMcxY|wp&wv8pf7?>V>*_$XB&mflZG#J;cO4(H9<>)V(X0~FRrD50GSAr_n^}6UI=}MTD3{q9rAHBj;!)G9GGx;~wMc8S8e@_! z_A@g2tE?_kGw#r}Y07^+v*DjB7v08O#kihqtSjT)2uwHG1UbSIKEAO<7Nt3T;R`YCSSj z!e)qa4Y~g>{F>ed`oWGW>((#s$zQGbsS&sg}^pBd?yeAN05Roe8> zT5^XsnI??pY-edI9fQNz3&cr}&YORzr4;sw1u{|Ne1V}nxSb|%Xa_Xy5#TrcTBpS@ z368Ly!a8oDB$mv21-kqD9t&0#7+@mt50oW4*qGcwbx}EyQ=zv+>?xQUL*ja2`WGq` z)sWi!%{f{lG)P(lu6{68R~smEp!Jy9!#~65DQ1AHIc%r7doy*L!1L>x7gLJdR;hH_ zP$2dAdV+VY*^|&oN=|}3-FdyGooDOM-vAGCT@@JyuF4C(otz>?^9!lR%m-tde}ePe z)Jp)zydtP%C02mCPddGz5R9NYvrS6)Bv$~r@W&cP5lLp7-4NrEQDN3%6AmXH@Tdfj zZ+k^}6%>L=d8BK-pxgvV`ix>w6F;U0C zlZ#lnOYYDhj4r)_+s){%-OP5Z{)Xy~)T{p`w1d-Z`uhiyaHX5R=prRWzg^tr8b$NI z3YKgTUvnV)o{xug^1=F=B;=5i^p6ZQ3ES<#>@?2!i0763S{RDit@XiOrjHyVHS*O` z`z@(K2K8gwhd0$u@upveU3ryuDP~by=Xy(MYd_#3r)*XC z^9+R*>njXE-TIP1lci2Q!U>qTn(dh*x7Zxv8r{aX7H$;tD?d1a-PrZ_=K*c8e050Z zQPw-n`us6g%-5T&A%0G0Pakpyp2}L*esj#H#HB!%;_(n z?@GhGHsn-TmjhdE&(mGUnQ3irA0sJtKpZ!N{aFsHtyTb#dkl=dRF+oo-dwy<#wYi=wik;LC6p#Fm zMTEA@?rBOmn>eCuHR%C{!jx>b|+<6B-)Z%(=lG{@y_@8s2x4Hym6ckPdCB$7NZFp_|El()ANXTORs zO@b$@1`3tXjEm>;bX)%xTUC>T)r6eTFtq*Rp*_?%C+fEzT##kVNH` zV}-lw6&hY;cyl5#RR-w!&K4e)Nf4noLFyjiAbKvP7Y!=2lRiRjc$&d?P~!zM@4!?3-vyqs zhm*63jiRI7cfruv!o=zO%H2cQ#o64%*4YAJ=xp~No53pO?eEA$`fR4x=^|*#{u3bx z1YB3OT97ZU3=ol)l`K!lB?~Dj(p_i0)NN=fdgz(QBu>8xV*FGZUb7m4NEbrA+BJ1O z%CPI+T>JPq9zpg~<>QR+je>?{g)rSuWpyCDcc2@rE8T>oNWPiP*u zLZc3LaQVEsC6emsi7DCL0;U0BP!SwAkXuetI25TYuCwD8~Z|M@2_ z0FaBG|x zW)FZvkPsN^5(Q}whYFk-E8)zC(+hZMRe5VA6GZM!beBdDBqq#Rye$I~h@Kf8ae!Ay z*>8BsT)dYB${E3A^j5m_ks3*1_a^uA+^E{Gxcgw2`f7jw8=^DG391okclzQA zwB6_C;;k_7OnwT<<5RjXf#XxTO9}jrCP+Ina|?UA%gFvNJy7HFEx9r{(c&yDZ9e2aovtJL$um8u>s&1k@G6# z-s55RDvTcFYZji6x+UMyCu{&*d4N<{6;H^PEF!?X@SqMfGFR}LYImL1;U}{iT!qnA zgqLCyvSp>>nS}|sv56Dnwxdo&HrZG1WQL_EkC!D6j)JW4Tv1yyqe&aM- zHXlKm;srQVctoDYl&e}E-P8h#PCQNW{Dg*Te>(zP#h*8faKJ!x-}2Rd)+>ssE`OS? zH{q>EEfl3rrD`3e_VOu!qFXm7TC9*Ni&^{$S76?jtB;*1+&lyEq_j{|Nhg&s;W6R9 zB#r9L#a7UU(Vnq#7asUx%ZyVz{CiVL5!CBl-7p|Kl&=g>)8e?z&u?Q^r>L@P zcB6n=#5Wz+@-j`qSB=wD1p_n<(NhAp8wa!IxDP?M&_ zKNcJonwpOS>a3-OBC9jGV@*WND}F8~E_QS7+H3ZK6w&kq>B}kc123ypkAfx`&en&T z+?U=!q?N5DDkt(2$KU;t^dR}IVC|M)pn@S)m{saxD4V?TZZWh@hK|C|n(P&eXLAq1 zZ#v0gPhHJYiyjEkJT~&%u@zLE`Lm!p!&-VAfk?eF{HN%PeV5S87-u3n;g}^R(OZqI zA|##x9SAAKAb!FSr9+E^(}_HX+lb+XLQiWF2UmH*7tM?y7R{u3(Vr<5h8V>Y-c`SgYgD9RvV*ZP{xBLuk-5sAcGP5G zDdk)Ua8PaYS-R*C(V(}4>%>{X%~yk{l3&El7iOz}m0Y8MAl_Qc`-2(z2T3kJ4L1Ek zW&^0C5lA$XL5oFZ0#iRevGn2ZyiotWRIag?#IT-E$gv92YXfp3P1BJxO zShcix4$;b#UM2o=3x#3;cA8Q#>eO8bAQ6o|-tw;9#7`gGIFVll^%!T5&!M|F|99EZ z?=t(Tag~g}`Wep_VX!|sgf_=8n|trl((YTM-kWDQ1U@WIg!~YjGqsZNOrayhav_lrw< zgSle+;b;p^Ff)tDt~?&TweI#6(}<3?Uw1@|4MvG2w}sQgX*N;Q=eD+(bJ%jKJ9L2o z3%MlC9=i-DKzXOun`;&7ZI$Iw?Y|j!RhIn*O`mRl2_vUnE*Rf6$?{IC&#;ZS4_)ww zZ${m6i^cVHNiw5#0MSjEF!NaQfSr&DbTX&tHM{Ke)6Pt9^4_Jf%G&51@IH0aA7QRc zPHND$ytZTZ7-07AEv8Rn%5+<=Bx1tWJSG_?CqXuJ99Zwp=hP2?0a{F)A8HLWkv z)nWbhcgRVdtQ4DpZiw6*)QeCWDXGN6@7m@}SN?Ai*4{l!jL`wrp_lL`bJF6HVAOnj zNa*fTj+{niV5~*O zN5NwHHcEed1knV2GNSZ~H6A+13`U_yY?Dlr@mtyq*Eutin@fLqITcw+{ zgfCsGo5WmpCuv^;uTtgub$oSUezlUgy1KkqBTfdC=XJ}^QYY+iHNnhYEU)j7Oq^M^ zVSeY5OiE#eElD6|4Haq&dOHw4)&QX=k_Ut{?Uvr21pd&diJ zB2+roNX!_7mJ$9n7GNdG8v{=K#ifQnT&%`l82sR{h&TKf?oxK%8RlG}Ia$WP=oQ3C z8x#$S3Rrheyw7recyTpSGf`^->QMX@9dPE# z?9u`K#Vk!hl`$zv<^Wl(#=J4ewGvm4>kxbr*k(>JDRyr_k#52zWRbBBxSsQfy=+DkvQ40v`jh_1C>g+G@4HuqNae&XeekQeAwk+&jN88l@etjc2U0(3m{pQ8vycb^=k>?R~DSv8<0tRfmLp27RlxR~V8j?ClC z)_B-Ne*s0#m}G~_QwykU<`~vMvpTlr7=W&w=#4eEKq!$muL_QJblmEh6*MUg!$z4fC{DBd*3h=N|lf1X7dTfqL1v6~_al z%J+WD;fSJ>TKV*mid$G+8eIjdfK%pu!#kkan;Qi>LK<0bn$?ecFn-b|@+^+OT=0nl zZzN%OUn9w14s`D45>E^)F8?Z?;l!%DF^oL|Yt!@m^V@3twFD@^D5$*5^c%)sM*sbi zk(RQq-d<^O7T8RfFwEK9_us2+S$&W1-Z3OR+XF6$eJl7IgHM~N8sHzWeuzxpB% zE9h3~^*;?_y)7i>a4#z6(ZQ%RaIo)|BtphTOyY@sM+vd#MYN11?ZV(xUvXb&MFg6g z=p`JrH(5;XsW4xVbiJ?|`nutpC1h*K1p~zS%9GcwUz0UWv0GXKX{69Mbhpcsxie0^ zGqgqzpqFAefIt5 zbjNv;*RSO}%{l!Z)c-Qw`A_=i-}4-?=swGSMI^E7)y37u+#O1^yiI2ehK4F|VMVkK z!hIFgJ+Ixg^6jI3#G8UbMwE1a!y~wFx@T(|6G*f($Q=e5na9eDt?f6v;SI;w0g-j% z!J#+aN|M&6l+$5a()!Cs22!+qIEIPkl)zxaaqx#rxQ_>N-kau^^0U$_bj`Aj28>km zI4^hUZb4$c;z)GTY)9y!5eJ{HNqSO{kJDcTYt-+y5;5RiVE9 z-rfg@X78JdxPkxzqWM?WOW8U(8(Lfc7xz`AqOH6jg!Y-7TpXRJ!mtM~T)9C^L}gSL z;YSLGDG_JZayritQkYm6_9cy96BXEf5-2!+OGf|OA7sdZg?o)Z<$B#|?fq|82c!WU zA|T92NDMBJCWHwuFa{aCfTqmu)kwClHDDbMnUQhx07}$x&ef5J(Vmp?fxerb?&J3W zEcoupee$`(0-Aipdr2XA7n`Vp9X;@`bGTh>URo?1%p&sSNNw!h%G)TZ^kT8~og*H% z!X8H2flq&|Mvn=U>8LSX_1WeQi24JnteP@|j;(g*B2HR-L-*$Ubi+J1heSK4&4lJ| zV!1rQLp=f2`FKko6Wb9aaD_i=<=1h?02JU2)?Ey_SS%6EQ>I20QL=(nW-P4=5mvTJ z&kgssLD)l`rHDCI`%vQMOV-yUxHQyhojHdYC*$H1=nrJKqFo93>xvB=M`$}Roksx# zRgV+d8#sk=v+tN#P-n?dx%RC(iv;9-YS-7PrZu#xJ5%k4i*8joRv1J`M_tOQR`{eV zE~<8%VC63sx|_U&{Bpy&?!~^Ce+CNv^T)?diyKrA zu^d&el}PFVWKFz9wkriy~eruRakPmmS0ZsKRiEMGj!_V`HL0FT$ zQU#r2x}sc&kxyY}K}1C{S`{Vdq_TYD4*4zgkU_ShWmQwGl2*ks*=_2Y*s%9QE)5EL zjq8+CA~jxHywIXd=tyIho1XBio%O)2-sMmqnmR&ZQWWD*!GB&UKv6%Ta=zRBv&eyf z{;f~`|5~B_&z17;pNS$3XoIA~G@mWw1YgrTRH95$f&qLKq5wY@A`UX)0I9GbBoHcu zF+!}=i8N>_J}axHrlmb)A1>vwib%T;N(z z!qkz-mizPTt^2F1``LZ#Is;SC`!6@p@t72+xBF5s!+V#&XJ54bJ|~2p(;ngG3+4NA zG?$Orjti%b`%<{?^7HlMZ3wR29z7?;KBDbAvK`kgqx4(N-xp5MuWJ1**FC|9j~trE zo`+jX&aFP*4hP;(>mA>X7yZujK`$QP9w?a`f9cQJaAA2cdE{Tm@v?W3gT&w=XzhbY zCDpADyRHQ?5fOuf*DrAnVn6BjADR2&!sV&wX1+TC*Qk}9xt8KA7}6LBN-_;c;r`H= zwL1uGsU0;W?OEez?W5HYvu>6SR+O8l#ZM+X@T3>y9G^L76W?!YFcytB^-`NyTDB=; zw421!sr`Wwopu>VDWNN>IN&RxE08d0JJZigpK%)p|Ep&aHWO`AFP)}VkqQg1S#TY> z(W)bm7duX(Nvry|l%sGs+Eudz3=_A0i@M47VtBp1RTz_zxlmqgi53tT!_i)(bad*R zt<1n~oT!|>QLmYf?YL$n8QEJ2A6liMI!hRY#mB@?9sWAUW8! z3#M&1`ZQmRP*o`jtHjbA78}!&iq6v&rlp|5&!}O}NT>|10NoWbiq5@7lhquTSHBCO z2a!-M+(e10feoq(nVw~!ZC;y+4M=F0%n)oHB7{BRYdVpeTN zryeS3Ecv^OC_2HcYbRWnOSY2McCa2PfRXH~!iu|fA^#y<&eJkS1^d|DM3)QKAnMe1 zp%9s~@jq$zOV8LQ$SoOZGMPYE@s<@m$#S(N##mh{yFb!URLo?VmR4c2D<_vio;v$u zEJivu^J$RML#dZFhO#!?D8s-JTIP{sV5EqzlSRH3SEW;p+f8?qW%}bdYNyDgxQcQg z)s4r6KHcPGxO_ErHr?P}mfM;FZE)8_I3? zDjMJvQui}|DLHJ=GXcz4%f~W;nZtC{WKitP66ONo4K<7TO!t?TYs_icsROOjf=!bP z#iDYw8Xa2L$P!_IMS+YdG$s?Gh(pybF}++ekEr=v(g97IC8z28gdGEK?6QPNA@g_H znGEeNG!5O#5gfi{IY+V>Q!Z=}bTeH|H2IGYcgh~!jjG`b~gGo!$<2(Kis_p5;(P-s_l8JWL!*jOOFW7(UIXj)5^C~7r z>g7M$hT|sIVBpur@M~;gi~j(BNMp8UkYv?y&{`-sK=@)-@S(2kqobO@Wt_pSnMh|eW*8azy%8exS@DAQxn9~G zE=4(L_gg-jHh5LtdXPgG=|7Xcq4E&x?X2G2ma(6{%4i1k?yUE4(M*Qk6_ z1vv$_*9q$Ow(QAvO;Y5T^gBQ8XX5ULw$iW6S>Q`+1H*Qj+COZ<4PxD-Fwh71j0cBx zz1pnDR}STs5k`ekB^)M`Iu39H@BwM@^8_X7VVp@epjNMqRjF($LBH!#dnEe)By}7T z7*XbIUY>#irgB@|lb)RRvHN^cPT%6slXqX1FW;4YMtNurd;?3g>rm zCSyAc0+aO+x0NojMi`4bp59%=g=zuk4R4o~hTUxxaj-YA z@UtFr6OY{A=_+?qZnrqBO49}q~-hZ!+0QZzD)8F6c7AMQ8Edl-y|d#R;NOh4ukOeId((#ChBKo`M=8Z@5!BZsX7A3n)%+;0Dy*bI-#fNe6_VV1{v%_*=I&54mqAWAg z3XmVyRkbAG&>7rIx23lx*caz7vL$Tha&FcrqTEUNZXhFsibRbc*L@H$q*&{Bx?^60 zRY;2!ODe~pKwKFrQ{(`51;0#9$tKAkXx7c-OI>j-bmJb*`eqq_;q-_i>B=}Mn^h`z za=K-$4B2-GE(-X{u|gHZ+)8*(@CW35iUra3LHje(qEJao_&fXoo%kNF}#{ zYeCndcH;)cUYsmcLrAwQySyF2t+dUrBDL;uWF|wuX8S|lr+Kg8>%G?Kuzxf;L!gZoxAqhd;`!i$5wZfphJ-c zd|uR@Q=cF4N1HXz1y}KjQJ8{7#aqNM_|j!oz6@&wEfq)8)wG4ngiGocMk=1Ft54#R zLyJe(u>P{fm>k_wUn20W9BZ#%fN9ZePCU*5DGK$uQ{GP3{oE1Qd^}1uSrdHw<-AM% znk>YZOU^R94BahzlbdB994?8{%lZ*NSZ4J+IKP3;K9;B))u#S>TRHMqa-y}{@z#V5wvOmV6zw~pafq=5ncOsU z`b-zkO|3C@lwd3SiQZeinzVP4uu+V>2-LKKA)WQXBXPb#G9E8UQ%5@sBgZtYwKzkq zNI6FloMR!lx7fV|WjJ*b`&y_UK9mPl*` z;XO8P%7{H*K=GrNF#+K3At?5`_oXT|Vz!Rh_05t2S&yd`A2 zjcyVJB|#czi?o<&biP<}0alxnpPLzJ9d#_R9(c$2IPXg7=4mL{7WoN>JTCCZ%zV{) zm691r%m?d5yR3l=Qxn7|f0?e7@ zk^9ia@dNTbyi6%GO;kec5sHCjtyr*i1QSY;G}gTsivUQRTG(i)y`O_~K{I*S+x=>M z;}<><>$k8!-=R}>b#)kmSE&~qf+xi@lJazu^F@~pV>MQ3ISq0)qH;F^;_yT@vc-Pr z390Cb$Zq{edB^7W@Mz_+gQ$>@*@>hJIjn4*`B@N%Lt_t1J1wT!aN`jpEBE5;Z|_X| zT^67k%@CVrtYeC}n;uLV%ZSClL-hu4Q5t8ke5a8BZ`=p#4yh?Xa^Q~OrJm_6aD?yj z!Od*^0L5!;q95XIh28eUbyJRpma5tq`0ds9GcX^qcBuCk#1-M-PcC@xgaV`dTbrNS$rEmz&;`STTF>1pK8< z7ykUcQ^6tZ?Yk3DVGovmRU?@pWL#e2L7cLSeBrZc$+IyWiBmoex!W#F#PlFAMT00niUZfkGz z0o{&eGEc{wC^aE3-eC$<2|Ini!y;&5zPE>9MO-I7kOD#cLp<3a%Juu2?88km=iL=? zg)Nm=ku7YEsu57C#BvklPYQ>o_{4C>a9C*0Px#k2ZkQ)j3FI#lIW3mT#f*2!gL4$_ zZDI76!tIw5o=j7Opkr~D0loH62&g?CHDg;Lp^HZ;W7)N+=s>^NuhmsYC?}lxS;sOE z69`R?BLA*%2m_L7BSZ^X5BKaWF-Y?b-HqGLcTd9NU7vY8k|j{O`cOrwxB2WW@tmhU zt`FA4?YCJwFISu42CLh~%e8Qg093rgqDa!ASGd!qoQ1e+yhXD=@Q7u0*^ddk+;D{) zKG0?!-U>8p8=*&(bw!x;E{EjWUUQyY3zVB2V}@t$lg*Bn3FId6V_Ez&aJ%8kzKZg$ zVwL+>zsp;_`X|m4RRvc|Wtejy* z?bG~}+B%y$b6zBRba$P?mX#UbwE{i{@jbuL@tZ6Rn;SCu#2M*$dpQIn$Hqv`MgjBn zURSnq5+1ReLXsI#*A8G1&h5`YFo^I17Y=&&1eQDtwY8HI3#DdGWslPJSP1` z1D()O()qzD6U~BYRUPw6gfc4Wx!am$yM#i~5MCmF8=7(q7;n3?L@7uuvn$;8B8wk8 z3>T-EJ5X9Z3@yH;L=9QFtWmzdE_;Kw^v+te+u`pF zN4&*o>iRKeC&l_{U^a`eymoog3(GY&2h;5vMyRyld37+7bW+&7tvIfrL9TpA@{Z

dy!05UMhSKsK zV1FiJ5SlAhkpcl_H0wRzql?0Qp5wz72o2cMC@utM(|&o0ZO_JpXr+N7l~F?Ef_02md^m|Ly|(EN; z%;)3t6SWt{5hgzszZWS1v^AU?`~Rctor7%qx@EySW!tuG+qP}nwr$(CZQHi1PTA*F z*Vo_ezW4q*-hHnl_8%)^$Bx*s=9+Vi%$1qr5fK%c+Hm4kiE$B;kgV)wam25w$Y7#k5$> zyB^6k3i~L_6~PX554`c3Lxx;&_sT;I^U92G@fS6#(Xv!B%;H3+{e)1R6lyU)8AK1_ z?@>F5H=sXG=ep;kDRZO_ofS}`Jus*Qp3`_V4v~&b-RQ=t8AN5H5{@!_Il~0 zZd!-aH=h)(7CJ&tL%%{P{6d_g=5tsj%S3Z!QxjrLdjoKmNP-zSjdJ!?qL(UMq38ps zjKSz5gzwhDFA;5md5yYb>QN)U_@8Xpjl4yw5065)+#MSGp;yQ*{%mt>12;$~R{eVV>o|juO{Z^ z^o^m@DOBrE2mm1nLgBfA(Wi=X9R%(1UYZcZJ!3;*bR^smI~6lyn`O4BOwo-STsQcyodVA~leg9`{=l(qDl@DCM>s+w`%S_q*PIjYP ziuHHuj0VVW1%+TH*lx9#-$^q&l)G_ojju-w{# zVs{oOc>_fcS51xY+19tN`;V~R0wVyuxdkS|t zC}~Gtu-UyA{H5~6*ocUWM)RfQ076mL1r zFVWV%zx!_*zk`5&dFbdq4nbWxIwAu=`+$V-`m<*-Z*mE2X|>OCAJVV;wlq0E$hVe@&x7V(!xg1*;%`} zxxBu5;jmZEH*e!Rj=Mz|udBR8BR6LiGoLWb<1=<14it;Fuk$6=7YCR&;F+%r`{S6M zP92W>ECy`pZR$Q<6n8Zw1|uh*M=zK=QP0b38_aX#$gB^y>EahIiUzy^MP1ct%UhZX z>FFLVJ=H`FRSq!<_DtWyjLZ6t^Nf|?<69Aj$U0*lrAJG0{t;t8Y^SKLacoR%3EXw+ zDi5T^PkjmJp7@B|$lkEwHHaQ7BGc$})@qNRqk4JH!(bgPM!{Mb&Kz|UGk?QskODW5-NCJ3`Fbks<}%TsOB+e{Hn1i7BP z(XsKkfl`r0N)u1VqaPYGlDxR3>%y{&vYaQCnX8AAv8h8>a^4<#jAhtfa;TdoFlN=?Ac{@Cdxj{YI z!kxobbr?~GU8JKwH2Ywa(#i=Rzof$nu?4-zlN#QJflTO^QkyarxNI<~MY1}jy~Jz` zBRwV&0+G01D9biQ4PR*1NiSqTXZB~NdI6yVEU|AiWJYA>k9G=*`R^VFjr{jhqZ$&G za0#huq)Mhb&8oR!jrv%;xRe@b&PWBXh7ATurhUY7yobngzP;($8b5g z9U{5JMt%fMp(N6ZVGsYa2p(#ry;Y&;GG(DG((_GrS%r&waWuX94*RX8>&x|Lzv8WCaXaWo(3FK=U@G#S$8kCX_R6q|VO;WbeXk~x zmq?NS+S2WfO|{j{dKy5``SRA!r+%)`DCW{s?8uZJW{-4%x}KJzAtiyY6b#)!fe0kA z)=W5C>X6ZLRFH_-$)Z(B8Hr}FD#FLGum2gRluDsrJHf$do$r!ORQqrI6~=-H0vPiG zC2V88MIp?Xhc&UnIS(c)naRXTu-r!%x0J;3uWjp5K%!b_v$;;T0*{_2txs!*+BgP} z%eY2;N7AFz(g@fFy&(hWk`R9#fRZ&X598A7xjHyoDJ4!3CK{Grr4>0bTBw3ps{tN7KqVY^)~B5St2NQS9wH_Lc=s8$1H5J?52_$nh z+rnm{F~bVIsiCZ^Gy&eV*X9JTJZB^`|6F$9|Fq@ekZKP~h_BWGsow^hUpo~MCTrdk^1B;= zNXiYAZnUPm>}{vX*&Yb&{0FNvW!V)h-<{na1yT-|kAkG7xU7QA-NAc|e4Nf2`OWnV zxbr6@^wO^6xW+Xdu=Z{sdK+Qw3Dii+X&Y(VdCv>CFEIOt?MCM?9@CDUKm7+N>%!q z$WI;(L@2YJ&Qfwr7k@<77r}%_q3O8c#><<+(JFdeT2?e+nsP4h+`n(HuX8^8qLN88 zv^9`|ICnNwS^PYDf7ebCGG~QNosD6-%$5;6Yx$`PGlZVnxs6ntftJW^L?iy3KIBDW&1q;{OspV)`a4w`+K45XmW5g6HLPL(lu zM^>HAPux}=ZJ?|;f=zDh!2|)WLyu7pHcc)9vAr(R_-sI`3GRfExjVpYMgql~xox)Q z)W3=WFT93oMdC)bluYO{cphI8Hjl&)W$TKN(PAk2r&mB9-)@%@xbewYx!c z{}phewJ939{qT;q&KR_!>>XnVYPC^kRaX%+G_v;*kg4g0jdi&G2G5$4#bk+*0mK8` zie_>y1oDA_0hGE(n`I(s0k(P&;*KDaX278vofbbNMZ-&1MCmPD*6d6oN$VjMzpTd@C8e zg81s83_+Y#T;duYQ%tXE$RWVk=@P5Z1VY<1C?mU)7?G9IHYx#rHCx1Mhb!ajXBoJ-rANULXqSAu0Mn9s%@_;uy-AOG|5#jDZ3j5dR7|< zR_{f>x5E@uRa$=rDD-yel$t(bf5=#v9ZWObAu%fou?4KkV-kvjmRiGX7iDe(Q)_^=>m}`2$#Xi#5CpJTi#5EF1T1mmPB}c@A6ou~a`>sHSeM4gF(ksh|DObX#Ao1r$Jp3I3 z-#zhd+d&)DO54E0K@@kKgxRB5%x&3BZ$OrawIi6~b_kN~$5G(kH6b5BD&%g70UWu6 z-ub`EccvhA2YleM%U@;V)N{Ixrkd0bjN}m=kn%!g%wE&P@WcBs>5NJ~t}y$Ar7F1n_=iC*<|&`C=qG#+ z0|)?s_kRK(@&?Z40!~gQHirKa2ua%+8CVNj{J7LD3|*Wp?EV9bZ1_j%PH`5U;9>aTZzwPD=a zXur{4zSk&)HrOFOmSK8ZKMHdg*HQk|a($OZ(0puje1K8EZNjPavWjhh64i-B(p7Zf z2g`IQ_W)I`lGa!LCabrDUSVPmGZbVX*#xhnAH|koEn~hs`=w;zVM^IEU${9oXf4C9 zk#|zrR`2_TI+u08MszOoi%H;viD}|x@Ax-{F_aW3ZIQHw-pT;hgNi%weuhcB7xt*kubK4fep+r)eaJIl%p9|sqv{M(E4lgwXe=HL2nYvO$$HX>QpPxqUn}WG zs*l{rztHOO@k5#cP%_alezmlZW9HCcT_;auQpbtV(Kh6e(9wF`C;OM(L&uqUaFglN zk@mRfKGV716J9j|zU-6W(m9pmEF&sbiZMv*M3~8lC~<@%sH8mKCL5zS4h--)TNbi$ zGT~m~}sa$tL(& zG_GBAe(+OZUY}-iY-rcb4f^fNZt_IXS52F^MC6>C?-IuOUttpxwVQBy0~D@|I1g*pQ^8D9@mu?5(kge3_GjbOm2G+7-z zkx`X#L5jF0+(b=RSgOE*XGFk$mF562Yft^UFH0micC5KNH~tfuDq*ce5Q~fKPyieC z9su^F5Df-F2X&FrZ1?<8uQ5h`uh~m z=&m+g_sL;h^%^JcRk%COiklbyo`Co8z9C%hj$&e+^pKMm>7Jt({+@)$DJbC`QjMHZ zi%3X-hLW4Gca)8|Pf3A1t4Ud8Gcj`ZNDE=lz<+3#C9z0jMR_q934+6jFXzJ$uCq~+ za-#O3p1hSU;tiKizC8=Mh@y(Ne3L{f0B?%ewopC*gCiXqueXVpGg9HaGK>hK#}F8++%^d7M6b=5@V(e#PAgrUnD^4)b1JPZ-PGNWqckW?kadj9w8b7f zp6l)!4JIwHtcBOekEW-B`yJ(E6n$+g06FFIjgZzz&+`UpKdgY-=lxNe1BI|=Cg;T; z?FYQs{*)^&tV>xbx0m~jf7l5>`+q#>!*0u^UJNZmE(3w>j|yNHB$#6zkjE;_0pL0S ze2gb)=zGHVUt5ge;3k7XmZcc5;mh=#z-ZobkM!xX0De$bw@9s|&m~zN9 z!K5tX5=4qA2sK|$bdVMz5etUdXN!`}2PL8R7qLr)Si} z!IONdCg$e~UlJ3u{n50K+;kj7SP&tC(^xDUbl{fdvL#ilA93{7Vm|&0)1p+nx=!XmT2qv6B?FjPHZV*SamC-ro9lXMAbWtsPx?Xq1Kcc_^$@r-YuI4|#Q?})HOyhMfBUVTIsc4Su?*`>kGqVs(0tbI_r0@mbv4tR&NZCQd@%?W!R_Br)qtk^~)!$ zd{bZ$2k_tV&)c$dz%vTer6*=naysJcAnpE2vboBzhwzL3ZZg^xE_1)_2eUw2B&FcL zW(!+zg@=0oy{=sCi##j;)Rn!Ty7I5A;QytP@}FjBaRXc9p9bUK6(&VZ!%ayA`L8Y0 zHgiu1Y%~0(WC8`wPF)OYDg?-xhpK#kN37I*3t$V> zeFT`E`_n>;_dQuVYN1PBmZ_}9TfEcl#^=`Abh1!Ek&ykSp^2 zUtg|J2l-(Fu4-@Z^fZW1~i@QYwP9Q9$d-lN6U6i%K#778wN;pE7`?CIfN* z4j%4F^H^LF6Q70%gi@GEB7#Kar{F)1=Hjc!yt?q2&-sWb^&Mo@Ali3 zYsI8ugwjs$rA3@sca{d2=a5mZ6PM=U7R~l1{udpZzpk<&^i)W$IV*$FUzyJ>#@G4l zunDZP3O}4G8=e2)DEXo;q|ooRSY*pQ@?dPnSA%LBmzMuh zj6iCX{hWsksbMQPykb&WEA^2^)4$ly11z>xG12rAj}?8Ft!(tswaOoNlpt=|kqrTJ z&?vxxBG>4bNn(%_w*|gVh^|*LD_=TzvKLX^EG3#)_JHhIOGSwPo4|0o#`B(-!+g_f zebxHKe=60kQz4i3=g8Q=o!~GyJjpp(m|JFSl$~J?ocx92m&&RUW=F?w)i?X8sjbbg z0+7xvpM&&Mvk2s6TEQh%-l$+wW+-wwx(yPsAW>CS<4@5r)9$_e^l&p0?yxh8t`Ni| zvkg20%R$9KD0hWHDff&(!UL3EXA@7RAORZg2_v!tmF`q!lSi%o$>srm>6H|S)B^2X ztV|vT66Q&WzEYv3LCrtL@fFVn_1u!3AIwvi9c5g^-LY)$kEOwFcdT%;T!@=Lh3b{K zJ5DKC5TfipAQ;Xelrj5>A z=_T7N`9+b0vmdY_zM3SwtpmRY?wNX&N^VG?5}z__+A;qz)l|ZX+QaujvNXdiXZ(V? z{OmPo1P@Yd;$G3ic^NHAm|1j%cIXFahDM~236V%gF?}nu9!H?ApHB?XA?IZs*m$xN z6e^ufgCQ0+_=81#=-f_IGbvy4Xizg)_Q^<)baO)G5(DO zgxn}JpKET9(UqMupTD8jB3cp z4G`IGH%ByG7iZ-QD?Esze`e049rA`qU8-l!$qPyeHl#z_q%CNdv(L)XI;?Ng4p}qk zjkLr}p4PA1I;7{Kc1WJp_Y!Q55JqK#sB5nY)=dehb&d)~g=roafxSw>Sbm)`xVXcf zG#`10jAW<8I#Nd!Q<)M`*0YE;dZ$(eKex&V5$dNnGAi-clRskp_SX#aKy?8;Y^RA; z@xEcdlr!iVGK@89*}AMBb@T}NL#V3*a00ErFr0GKMbDa2oQ-DkTV{N0Y_X9!nY1oWN1B)$PK)1Hfas5LPvtlH8ZL@g6sQ;=~> z=vTK;Y5TAt=ya36;hG?pES_n__RRVv!qlpCcy$N%vN$cm%p@=41Lzl*;2C>KsLXaT zT7L{$DZI@k7u*!SE|y2=Df|?99>gyrLB^ur~Y)vi9TpSJl6Z57d+o)lQAdh`R5kMGB7)eE`*Q;2G zQEcRN!Q?$b+o zUoag8iRTMmKuJ)5s&zS~S*B1~zU7tUT|q&h!EInBeZf#vwR|05>zpU0zRe0VWg5C; z+*3eGa6)oAS)jk-xN&bD5&{yx=Oh{=T<=akX4F4Yue*V0VM zkH4;7TLKmx%@)s6c5z_Q&5qaRX;$2vIP-ud)H84PAd0uJX*ee_AkeYKVtI6CW@W(9 z8KHRBux28|zpfOJu7mRVm*s z%?_&|3rLG%MZsk-XuimeAl!(zkxHX`$uQhJ=7%bztEXtmw!ImA{G>b$_T&F%g zFsQ^s?i59_UX8n_!c>ZltM6ABcMHOtRyrRBB3#Yo+AYyiYjPIXgd#0RF$%&xX*?+- zsPtBuy)cPjVkYkf31o50Tp3zUe-dekc|5FYz`%%l5L^>Pje2fT{!AGEHxWG_Yi|{!_@x>cc6%5SD z$ZvA==C5j@X;L3MCV!XA?SG9M0(T#83W28(9aS(t{d&siNAR`PZa(ke>q+Bbo82ut zvU5xmnR~F1ffCpw7|Fg1Gx@$)QGYDzf$|nfH3sKP3=Huhz#4)dH-ay~7cR-ML4hxY zJC3AyNh<#3hBqDyFFY{D#*eE*cnh{slzoT{|2On)ATR!sO#t-^ABA9?$(s~V<1UDq zyo>|Hc*Nrxk#`IYFkXaDTnoHWAP3E#`a^&-`SJ1RcPRHkeTbBZ&q3G_0==kIKNsi8 zPK+SND@w;5@(Jm9!|;LDkth-G0@RZYW&YJ3k={qg)_?xtrkih&RnY!V zo$Y^|7$WW_MlSzvW>1PbggdqghA-L1jCJc$kjxUIfuHEPj zLAS_=)=>DNjluF!EIspf<>8IN^gzw?ak~<)+k{ykeXo%GE=68f$Z;ZaxUAiN%zGF_5d-JZ0I9JZ*6=&gi*5l3i_WA7VrU|K{v|a zF=S?&Yw?$7*XrNDug-5bH}qO#ji37gcoNsG74BAO>OHL zJ+$W5wVs^^UjrNk2QiwyJ(aXP&FiHZNvXoDgPCs;lE0r3q^E zb1QZFSr@``4tbojlnOSCOUjP5QW*?2!?w1>p3YwB&Mp*GO3M*qgz>{jv{ak$b7(E?tkY*+R+^&>> z2dO%o%W=L!QGyw(WuAnw#oO{!I(8KwC|wq_y)<9lMxDiZwL#OlUU_DnD8&!tX&a7f zewQGgB8{dwkjR8EC%AP&bY^iirN#jA47*}#6?~g6@a?%^7(){yv(mgF=P`2yXr$Ab zuYEY=Rw^DeYTFZ^Ywa=6!`PU?q?O*FI=gFl`bbPev2k8T+=C;_X>sLJQt7BpOATpg zrpfyxa?;Uc`KUT2B@@q5dI0rCDDr{Q8d~En$h%e_rtAvjTEMd-OH%Qc7)o~}(R!O` z(i0MG6N^6LsC174qc^gK-0ayYDy1n5!q9mg_|@<( zH^wGhrdBV;Qzf}LA3=l3S|l{2(ylqgc3&K7pj~tzGSA`-wO86b&05pv_SO)Zw_hfmjx}wah`^|Qo(J(X2h!rc zPxx05-j4zshLMr@l7%0`IwPtjmgCwA{Sxj^m0H$vopZOcn-(l18gE{v?!K>bbY!=G2sL;OsI!wlS zl`om0y?Z#6@8vtXFRh`e5wNSy>T)H41%)Nt*jt9t?c#B>nBknI{Kbhq*5+Q8Lxe_H!J*!N? zH;Gr-bx%ExZEmt^9#)xcGN#!|?Xz6|l^~v7U7wM4&5cAIxbMj53pOBXW2LxqE#=+s zUC(EG;8)Odp&Rd)Qg_wrCnDExg_o7dmilm!?}lv0f5NK>w#Db7WRQa5Z94pw011GV zyHnjESKowJ&H%GT#al{iWgq|S`7S)99~4MXM?gl`=`rD9WWj$*)*NbWq$x&Jdq^ z(Q<+*Sx9NqE8$^Fqc(bfoIHwRM8##C@jW61>q;vG-*gk8G>_$;P+4b&%lQGl^XQpt z@48~+y!wp4mqN@Q?HOZ!Yr_;kT-E1R!Dz4OldNG)t;&2^&}q?~dMa&r60E7E)}#>< zrV*SWbim~#un~*J_!+nsWF_-x*9gTk>Hl>g2f7!ZQCMExX9omA0+-Fd%?Ek`^u5Av zTse2a$3`W_+4p=xIbdWKo>d*OlH=zIocE<>kNpS;Lx`OQ&-Q1P$CASxn1-0~RGYd=l#b>XT!xg+7u%F$Q7jSakj)eTa>Ty2qji4Eb4HFzvHy#qP|SXp zeb#Lbt?Nt*I~QuZr{s3Gk%GGcNPV5a16K0EjBCtb^pLdk4E5uLHP+1tY@v3z5hntx9$Vv0Tj2xkovNOuQz_TE%+7VTio)we=x|p6Zw6woNPx zcG_Z2O%BbGxfe9ld2ol=fLGR4aFV*%y*3D#mSjOJI|7z5B4+&ACSoxT&RK_fuBkxk z1Z{D-MxPSpq+f$DN!oyle^-|TkMi;fqFJ1UGd5NFA{AM^B_NurnPV??jj4yDq`QF! zXQ%rlV=SedtGKM5GccN+LZ_zY*nRh^QhVnOGA2jgF~DjqY%>eUXu}5pt)p9N9V|0Q zXC@$-8kj_9y)dSR&f2Q-S$t*V60-4m5IfeHAp)(*?%V*RU3YRI+fVm;XbrN;Znfre zHV>~Kt<08qOPU*d|3s=CmW8uaSX^bMnclwZa0*-JYD_xdlH-9QSVqCTFRD6%n}VS4 zy>uY+r9H8?BwSa;PMf%#`x7lDq2Ra&?)MJ=q&X-Vdw3kLg=AF;bh`Ngu`{SU0AP{2FA1bXzI)&Qc+N zQe2V^EkBDVUja~}gLyF(bfSN%OWm}6u4HUH3r`v7TIiEzS4!DYc1O$+O(bDf_b(zmfoP2*iYBPA-5lKMee z{!TLNugW*re`hye;8u`de34Z~ks!!LT7(P~?WfwY)j%M(rRlsVfY75wv`_j8-f<~Zh@@_No5u3lgB08$gw3J7t6YYm|-P>#mI z?Ihgih8w9<&jhN0?+L@xpaZf^v}|(+(B!Te$gx^{k_-y^@xZ8pvz4Teo8$&XcRy}gCz)E#b#7b-MxVm-OaCXYoKRhcAIJfQDELSMoUPZ2A zGJT9WYcGs3O6S~oE52|3o?hBGjTo}Z^#p~Y8HA5Pg?)uzq1dK9(?}wqZwRa130=%H zYf~z=E0yYqfTG0fyWBEMhY>h2^w4T@H3nLOIgGoExay2GP9=7H+(sF!>QtGs1-g&W z_gbac+_K^zlCn7G0blgrvHCKoOxX2B-RbMlZrJ;wg{CYdkQ}uH=vCz{^XL9b5MT@I1LRLBCN2G_*J_s4ZGh zWx7MbR#kfA8X5^2SsOa1ssX$FKr+_smpYMtr_8IC^|BTXp$X~a|@aOR`r7XM(DK=Ni-`62A>;$AvH z9_f{d2&YCRYk$@WOzak*c~OoAFfe6f@DJQ(UOb0(1s-V6+8}t zM%Y6TDbM(n0`0~e(Z=fVgsQi^OTtAv{cQHYLACfn!I5^C`4kt?8a_m$6 zbcTozSL$v*0uQgb2#l)xk-#q3kt{M?g;oWD0s&KKtKIf|mIluc_x>!Nn=F(UZhmoC@MLVWfWf8%A{!LJ-a9ibm(5(&roPX(GX)q zd@M1x1j~Z)riLkJ6l^njEwFgGs7mySZY8C9vkvltS$4KH+PxmEb7GD8$Z)quJ$36>!5YC6H4?tWLx3jX zL_~2klDHUK>j@1}T+ZgC#@^9#==euU-lRuP-UC^5Cc+L8jCGOV7-{#UL(6{hSs1p> z-8|04uLdI$1?;BBEEg_BTk#KN4^e`X!u!4==E(^tnRt1KV|!i-9k}i*QR9@it-?e5<6jq(E{}G5amY*n+H0gn_Y9 z-8;^pTZ~?CK_9>Yi%5S(q=#!=vps#u3bpC*N25|FGH$TQ9Pd_4r2%$YW!S{i=_C!G zD_fX}hHLaDE%xg_fp|i?KbzndD++)5bCZZKr8}JL`2AxVDM>tTh|-T>%j~EB_}}&( z|K(H^a5QtVF|l}x|sSOHm@dqAK_|9T*4ARfIiVq!E1 z{?^1IHFL*xX$M4a3Mm5YU!EpeD1oBkARcKhJu}}&7N2i-A0U4zc4~oNFEZ@*1*d{J z{!TQ-;$6U&WxGgOjF^lV^S+fK(41yMfFZe${01$COSKm>OdY0Ko`nRwC?nIcv5sS48^fobUN+7gD3h<@?TK=U zsq2}1JqYJDkDjs^)6H3!Y^(ni&NTu{w6vfAOZuc(I-NvUIA5QH9(Sk7D2hx zNiT)h!1lkZYyV}v{?Q|*B<@K93LuZprFU9Oj(?x*`7jTy!&B9yOv zBC(n=8x!WoL6TsFoU<~Hlq~@JoFJC(_I;+4<3?2gkpWZU!T~EWMF7v*q|26`QcQ^K zyY7tY=WEzh-Beb}LTZdzTqsr?>f%%?W^OSKq2qcG1lkqAukEF_zkk$u>XCWe4? z#Ea%vy>ICg-GEoSljel7W)-xQqU;Q+>#pyscZDYnsvo{+1MT9<8T4`~uVdxf?M~|B zynet59NiL z!rIjSxz;b%7{vy1l_G16WSgRE^<nid77&vHB`Hc!j_1F`ZD`0gi18)_8?o51 zU@6a|ci)iO?`1pg1#z@MGaRt#+VAApkLK*L@84Osn8n1p&wayu_RhR=UwwK_{XRd- z@_u3Wn-N%#fS{lWoezfKS`U=q7T4pO{SIjeFQMNZYxLGubs&kZYA-$P^!^hNiAC_F z(&Wq`HKids+xS2b*p4AAYkL|*f4oYA(x!rpT&_C7K;2ZG?{}K&D<-FkT@)`3VJ0Xb zH#wfssnie>s1svHRy7r9dzwfw#yY({tYB*1nNx)vazVXK$6z6(v#cyYmxjT(-pz)Q zmT^!`Ze~41QiQ(6|xf}+@C5ZNKgKywZ9F6&s&=xLzP2GjAv3Y0oF|N9sQ z)#f|e$7y6jIc&Qc}%ut}8+Yq?|zk-iAB&`7zddtXt^a zODQ(DgQqHOTe)pS1jRV(Z4SSYxFFm9bj`YffOXR_nrFrf=Pmfr^F8?NXDAH)RY_IJ zia@*!T}8>IHGTVN@d71~NRP5^{UuSEQBA;iP@E>vHBrii=Mt#3LM<}6v(uCW8I>pj z)iuPfGO41XkYTVm86?P+ZI7a!bu#F#q8E#ld66=_3qe5(7rwYzkyP1Cj<^O27m+O1 zqSOMa#3!)|Oi}&%<#TTC!j#90$`EUJWnuAw(DgEXbdGZ}D3-~lWKfV3CT06jARCpc zgW3?!cGxC<4bPFx>G2K|pQw6%H=mDNJ9f0i7Z9 zM9Op2T#uZC_CRl%l}%9a`x8xq0TEG6nyJmw%8@N+>W!pE-tgq@Th2AO(m( z5h}V(JEs-EqPp`)cKevppHePn%`Qoa-TTm}v83nfYu{=X)eka!5~;S>wiZ9KJjMq6 z>Fgx8lpK|M8rEmK1%a_jTLUsb8vpPoSY+$7N+_;3vCrkzy8E~s*E6qfhheM@ zrP!Wm9FgoRV70zMFupOPdouaMx%rka;9iusBffkukbq&Oa!Av$T*C5wgjUDJqJ6aB z(?h;NzQ4!^wA4Jl_hYZYcSg~3H}db;N0wk864a3n*J6lB-nb)I+5y2n+93^b!`=_} zy?b!&O*YX7-^{Ztu`4-1**M4EM4h_wU2-D?C}Aqy5ML7Yl@D#`Ppq--or&5LPqq_} zTx|N&G1%{D- z63FD%(!Xv4BFxTlU%s)bFl{J%a)l zqbCh9*g7WHB#?5O@r&ddY*myj&i_IQQSRbI!%jx#TIh8Iq)wt}a5M>>xO${;MLFTF zQ_O(@DdX&)d|+07Gko>hSrJy|%;=1|&mC?0hPHtn%4a35agZa4ED#_egj-4`fBqo0R#9mQ#BIn&i-6N6{L`Zvuc zhVM*t=AS0*G3(^>#-9WE*H7jAAN6DZVp#r5)s#1Ibo$Ty%9LoC$U%Pi5WROaGDy=C zPt+z^E_YxBba`ZMfei{n!7?uADyKFLcYluL^~1#!m1QqvZ}0E6J}Q3>QHVrfykO_w zv$|82jDqR3+Dr8`t0^fspZL6W?}Nb;in4>0ln_bv#S{!mP!7LHENN-l=~@%6ujbu+43{~BuZ zw^SLl6$KJ<_cuxbNb7Q!O0hDnWC6M4;8A_GNy9bkmdF>;M}Dt+#2h+{u6VQ^>0eSK z?k25<;(Ths!zu0AKiM3QGv1%~7fk+3?IroYB0MoYk(mh#@FSK8vIjI`ov_bH&I$oz zrLZYtsUQX0EBOWR#C}5l3RW{%Bo}~%2(30eRFFehtEwIkdu=PDTFFsev{oQPGaF9N zLO7CGqMw|o4 zXEdacLL>~Z9Q8;+O$?#CmfUc5aG9?YnHuPISSR3nZ8JM_D8dyb$SQv2-HWX?N}@nm z^pSjPE?!b&xN4pT6Iqj~IYUn!w~x*r*YJ!DJC8qDd%4PPqge{1d$*@GPtr)Wz z>kkUX_B@U^7XN4)%$HV&YAuDsY&6oUGVU~47&0HNr6)8$M29v4AHrT6Y7amNwe@2$ zMSs9J#(B)Opvkmq-rs#zH^A-}z<5I6p~|}zU3FOP#3gE}fPLjmm(O>k5}KVb$R=n4 zvES$OqRV_LtbbnFs2e-~T>F$+Tee&KFz1vD>C`sQ)TI=mBR(H3_R%|oh4VtiF3Lw_ z7tdE0!H=H2f)&ytAwMlWbDnuG(ULf9m*DTI1h-oaT(SX8kWAje29U8iM_5m`S?wCh z|2)fTcQ|>_y8p(TEt&BeR`_UPS^SO_Aw+z!Pzmz)2I2q4*o0Z?4L!A|{tFwR-u=j9 zsk_AMkBW&!9LF;X`vOexf?OkPMS?qF1or}T8%dvO4jne0W%dkm317^C;}z8p2F%50 zC&$arDGBdTWteETu7-Ej;`Eo6}jy1~TUaAs~m zhhS2-ZEu)clw!Zg9(sfvs-2Us;-4ssADLua7E|t`zlU(bj*`I2HTml-oa)BD4e;6x z#Il6qrF;-Y&tW8D@woFayo)8iO4hl9<<`}vd|k|mufrz)`$@MDyYyXLUZ9H^p@Jxe zn3mtSIH_Iw3x1|2Uhj^WaR8u^ISw=>@4vIf@UM=kjX!9O{)a6V`2W#l{>NGNfA8Xd zH=IuY-n}iVHvby@n;Z4Nh6Epb#M;g4i74tF_sb-Rd>-;(kwu z!RK#BjQOW9?`I~}#+8PwCNmj9+V$-8Ece{>&Gqh|xAzMwe+X%;d4~ahM4=pFn5%J& z@T0^41a(ePmuQCKNZXc45sKg7Sq99%CmTnsy4$U_RC+C;tYjWEXHr!g4%MNwS8o=t zU5BBC4m*jkf0GUk%P;RA01A1p(jYj9Vw|c~O0{}Vr%@Vn#JfdxEAB5UcKs;NtiXs5`3}FZBK{*S)g3 z$55~%jX_?tZ2!@XL*pbtJ0W!BhNlhcAlYmd__dLYu$LT3VyZdB7?{G*%+mk){+zJ4 zs;d!SlV0vINdFQ8yIDmbS|~){ZQ+Xl-0nVjY{WBZH5Ok(qD#50@k&HaWJ=SGQjG>sw?0g%xYX zo)I%5ZHB10EwcdHota@yKcn98pHZ*azYhpLLnCWD!~gxero1VS zp@{gsIoVg3UI+zeB3s%p_gfSf;DeNK@ONMnGm*)fS&4SKAx4v=6GM980?4Bv)-VW8 z#%=F+UKG0m8qZe7ZTAh#?Cr)Tq8}KQ_&S>Q)0X>H>+#1=Ija73_V>pJg^y?j*~!oY z-dh3EgHGCh#cwnQaC#T22>X=76ohcssCz$4SzkX0OcV~A(0xas~l-q|+(dlYU+po{VjMHA~h+?A9sV>Gg8pemGtgwQ5AD<1!^m1fsM?$4U=Pdx_dA z1Vdd^{^<QaRq{WW`$q8N+3kYCzjK`3k>V=-aI z24Nj-l1^-9@jCMfs_jjagNd?f30jHf$A9_`|w#Lm3Kw0)GM{<}zxR z>)9>F0>Hl3fVi{#9s@Nu0wh9jAuXw^`{pc}oS@tT^KC?^x}q(lC%Kz#g8xDh&VExs zNwY#ntAS8{_V% z>+5d(Cat43U!n=EJ35}M^%!aT7r^byL#@M=>I%4i#Ns}GAERjzpA-XOl0L$U&V?$O zU5Et*b(n1e(Qj=l+Kt#miKG*{HUE^I6ZIRiZkqVvq{2)w$2r|dfN{q6-d5PiP=H>y zFfj3n#fJ%9Wti#CMh3gPv`;=Zu!_H}OdwcEN1rtFVw`_} z_Z7iZ!2v$7Z1VH$Qo_SQ#Tns=?5 z`x!jNy9?0?NhcNi)A88qo3M6Dd#sE$?1>im5Hw1V3NN-b%$fzwzRli)mN1NdKEb(pdIM^yv_VSLm-8J|0?3wwKx390yng>H+3*|GL-*W zhqW^PVcIsjKMvvlr>9Td{6EOHk^L&Om4yV2S>uv;W9x#II$Ugm-=BcL6@dv|(oORY zX7m_FEQ`+Ch_@gwICp#EKsW=&-ti&EPRU}DiodxpG8l}z?0>$@*Qfn^lwUA4vHp>T zn8Xuty_)qK^|cm#L>NdIiWn4-tCFP#ErT)SiO;BWj^5g|5=@2g>;78mCz@MVas?|7 zTw9y_YH6PE62ZarIw}?Se;E~U6>#}oDb;e5%H*HjJ*!+#%z=w@6J{Q%VSe+1aY$-A zYiu2F<=VJ^sE|Gv9({JrR4pe`8$PwHv2b13V1af%!1$s2UkY;kRS;<6g!xUC8O*#Q-fj;-J7t=$q+gn)jXnj( z1wxL)j~-PE{e9s9bfni~T8*~RgP&P!!_c?gcR8}vTUg>9en5>d&RK=wqPzDm#gp4$ zj01f?E#o{t{#5aQ|3r&h{ZwH5!#4lnpFjQM4u=2m&Px?_6-;NO@5vh4aaz$4;+Vfo zXzFr0t(35F%ut&_KV4xqqT+;eWs@}=fuc#Njz-9FE@W#<@0CnSrHbWCOXB6BNkoY5 zx5$>A@1ET6XYn+j+&CX^rNsROBZnuWN+;2(HE>lR0 zdt+vO8Q`bJK=B4C;yF_|RX7V=U2w9SiCA@8{v$N4F98y0ULq4>-vfwx=hNc^ke)jP z=JtUX3@51;5GL@pCPIo6e?R{P_1Z&Yh~!3;`{l=LI!TdT+GBjnhRsd0E4$?t(cF!z z4~#=v5NNe=^9uQHzBg*}*h}OJs4&Oz+O9l{@=ma&6>15fDnS3Lu zhNjlUH_tu4aG8~G#M(x%^W-&-9c^k#MVC8F+(@<=A-S%`Ub$W?Fc$Kt5+9$Idch*` z8DPZGrrDga&I@4J#R*`!JUMdw*O>xdJluM;2O(QyC6bm(|7=LXtOMpeK2{Oc%&@VGgIM}n=xPTsHZu*o|%=ydsHI*DGc2AD4b$rWMYr_F+cj(?lYu$Y(d0;`Gym zsVB+o4{0WaVAxWNLo&g-2maMO*qGgJH^Fz&7= z2fEolQG2QIcl}C3QYX&n7uJjBQw?>=S+N}$3TvDBB4GzLg zRLYKx^=)OTX4DgErJ$67t1~NTT)b{xDBJpm-PJp6oYIFy>k5yf4es3Dl0RBGlcl=6 zkeqZGj7n2lOVEiD7>~>izlNL*I0?~Dk3B&I=?k3@VF&JxNNflsY7~FfIS1h??ud;d z(DEysJz}!|k{hFP%wR_V1vv6eo}VD6bZprUiHm6Oc!Z({ZoD1T7?|r-)XyP$bG-Kk zs+K#Tcp+0iFn)Ojr~N=xynz_nO>QaMQGRLk!77)=oI))vu#!h&Wy>uG*Xlp#{1EDy z%3$r6jdxpHLNJIgSmO)!3NMHED&BdX_<))Ch(?8pE>b8Lyn%w;OM+3lR+y?QTQooRsb|E)Y+ibYPpR&p z6s+)b!X(VTwzS7+!HF5!N~m_e9HxfjR~m1(1NVhmD`i`y54ph*TuOHuB+7D#w|bn^rs6qM}j4>u88m-909 z8Qn378h$ehryt=81-d2(punML3ZG(*KwecJa-AGkfNPyvMS%^{9mNgCm4!IL&HC@J z^l77MMF&_St=`G-5)v585Jn?7Ln~EA!8Fe_82Ch>P0PpQ+VT)sB9MB@HR@Z3(I;CA zJo(00bBCDqE0P=Q-p@S%iEzyp(jhvEEnkvBeitFmh~)w7kJK)2IQLuSThcG;t;19m zA}y3r+ik(BUg}RFoeS0@+Aw!O=T#}{7vd=KmTSobahGQvS@-iPF`2(zEWZ|rcL;+h z*A_P95X#6hgKb=iO8R&>Lx(@?U7Hnbcz{}VWQ+Y_<#T}WigYMJ>43m!22#ZMp5gld zvjS`{o;AuM{G5Q_d%Q8HaIyEgX^dy2Nw)g^$op4#@1uRb@iKc^`0oDIN}!Mz`O)-4 zeusYO!vEkuT+-Cu{)g`VLl%DQ1^)|Es7&0Jo|i!!?smr5TtY%458>ez*n}wn6hK@k z`Jf#NB}A3*Xpcyjt>2`!1o+JMh!McM?KR%_f7^?f=04Td*%F0@2j|n!kd%~Ws5j%c1tuc1<14SI~GT{=5FRz6U0JD0S?LmuiOd&*a4Hl2GA3j*mk~0 zHG{zh;!{+DZUTEyhhE~-I~nx~s|gCSu*A?HC1m3($CYe+6H9wDyGls11or9(nytJ| zd*-n%2D@K`5fS*rJ)?+*sq?mMo6t0*6fGywY7RRNIp4Ub#|f4Kahsq^&@5tt_sEw0 z6$tBs!r=*u#H5mic33oSM;v_oggvkemK}+&k^{?7?z2fqgf*5IzCiS_fY*Gr3UPfh4gBdXY(XjrTV_9xzp6snGzFWJz6*U5Ae z>b#^$8`}Oa>Yx%)Z5Ua^{d@1j`9<3&2(qX3VKiS|pK-r78?u0jI73d-73h_vE*v9^nb#_S=Y|+zY*z1#s8FFs5YJ2SHfgyTzIL#sp<+tP{L67dQd6i78rY* zPo1dBFRd8bfj;rLUm!egc@bm@LV0>{3_0s5RelFi_9kbtHD7z!KV_t9cYA;Qp^bbc zltWd_-A&ujR6b=W(!+E`0+JwY$>sB{$|=DQjq@`FVnLG&nzyoVm#wvk&sDJ%kUz$< zsz`N9uTKBzKyxY92j4VNeFI0ST2*<$kTnW%H&05Zz(!w3IP3>SMCedaI4A zV!|4#j{auL*KY|)(UQMQZG@D-G_i}_&nIGbPs1fosoM8gw&|v0gvu#GWiJny6dkAA z-tutWs3nWft)s%3*w5>H2Uz2q{mj;TB{`%`((Z0bgJ@|&bigU0=wieD!l+jHeA2opi z+<@NBOcX&dBF*y`WU)wDjBvt|L{|-1lJPd|sI&$C8(Rp_U|c3sZXHuWY9QX6;iwQ@ zLl)3S<^&wxggq*BjIn5v)~&}bg&vOc?VbThy}Qj`JF9KRFi;(X#(;=Vy)XB6dBV3J zDevR#SQo(;_9_)=xm+BwUe=4x19DusZ;98PG=+T`ysxWBjg|D)oYj_G%rpHZl7LV) zX$v2yquc{&c9dXA4Uk6IXmP8L=$*(MyP&AihZ^D6zu3_R{e=R?eo&(G zgA&1i|9A5rl>F<&q)_1>d>FMGiksGIAa&&UH3jzB36t8@&K8KuOPGl~Sdzxq8MLok zG>?S8p?u(Vy!;k|@2}?>b17=?6)Ue>Yv6hw&-f2<^6QYo2k0O#M4vuP>vh?m3~FAs zWF|jlFeAtn3PM((0JAqP$ndl)Z#OhZ5y~7=^E}9~1p_iy!7Z70a`oMBSE#o}pjLJh zVTz*5IIgH$C%LtC9E*RfOV079G@4(p_z1lzvA&$?%4XRKRqv;AP-^Pnu?;u+((h8i zL2LgIFjx6Cw&tN3x_U7nKUtE$c!a$9$#6D#qZGn;&uoa&U&%^Lp(&%yiJeB8xx|}Y z`tgF8XP6d)@q^wa%SeIAAnL0Rk7uuKv@%S~4y(V+fD5CQP@ZZivy)%ess1v}K?`t@ zQuF)fi}JY6u72#6vftxICFm+nwzg$GCg1zMT?(U0_l)Pc5!=B4LxEJS4ns<{gO;!< zXgw`8Hc(F_hbG98bMbG9=a+QL9r8@r^6nI{s-;H15v2MGagO#T9zUH9Ae$D7YdLjA z+b+6rUT1u5x61&npD`pu?-5155E}FMJ^B~@Z|iSJ|IA;1n~6ymKz||ax)GgDo`@H! z=P1HkG53^qWlx#xF?6NhQERNoVoC3Pkt;yj{nM9isXV40D1&?jp+)C!d0N7Z~W~jmsBwN~D`fatRBJZO#*%k>!yjFS^0uKVbnUJd2Ryq$#3wPIxJfZVqJ{k&L&9 zXGCBQb4AEn#6de{voh66ZgSnUtK&f&3VPU`{pLb@%fxrO3nm!q)B}6PdXBGvSNwRb znYu@N!ldSa(*GSjg59@YnmN^50&QLU~Q;g};bg&FW1uN-D6+(tiSj13|*jaU7szS?JO%dg{la; zsYTbJ>S51)l`=Ja293O0qU*grE{>~Vl~KEju8(CD)=RK6c8wXv=Ry{0eQY>gXHbMs zf(9?Q^CXoZo16h3k5t4ol0WgU@(59J#$rXL#!T$oiR2;)m5l~P=ou9rBG zKW3L*?Z8_lpgc$u*MB}N{M3p2H4S>dtnu8Y?ig969?)uZXiMBkgy{rwyvHX{IwQ*1 zAaq*bEdCiNur{67aksM~O|G6rDQ9Zva~!a|*~U!cX7%1NuGu&KR{sIq?_r_$D%$FK zxv_K6f~%Io%g_V7`)TPMKhqWVq~k!XKec!HEiArL`92$v=|=Fy{>{a`u^4b%_X}@F zaX=)3VSRhobHA_OLU51xa|m;}5)1(E>KAu5Af;kUL_1Q|j#ePnvNgw%f9VT`kTto~ zH}bUvD8g--TZr)D%6`~)z-4bH@U}GFb+C$o1;du}!_&pT=wTNZRcmcOcPPeBVAB6U zApYkL{b%<4&!DbQ;Zh1g7M80S$3itpF5HI{9ABip!2*Jmd?dIe6pq(l?`GSuohd_}1NBcI-LaLWPNMI*u862C=;tK_$ z(n&p`Ly#LKfE1kWXOo8=oF9Zma{O61Y#!*hdweURwIrF`@}}l=L)N;UYbO*a0={5B zQUPPZEY(0o5Osk`nMW4tB5m+6q$f&l_QhIa+@Wd8uwM`_ByCMc5C*DD%?Pb~C@-qq zcUh(7rHYZwlq0;NNurHgAibV_8IBFj&GvdPGrx4aFyXuJ79qf40_xr5Z*&bu?vUHi zrL{iT&VA80Zh;VY{H%tC6_8BZ({o_1Zv)FXq{4b}9w7xB9s!AIEI+J~1?*I0z!gqC z3xG=tIMJp6tvi@N)02M3zh-%m@oA)pc$rU1H2dNhDf8U~Nl`etmlVKWe5;&7d?}X) z#txXgpFv;o;ZgP|?+G}GT#aCqPZCeLfh~{RR&(0C1`nBj>JD@+Yd*Zipb_W7Gf&dR z5V2ZWykWs2WOT2WZg=R5kzfX%oX!y=y@3yCsa3&v#Q~(KRS0=IQG@~}1gL_Hi9MPT zOb$ZvS{D{a8pi$b?0yjmst@Cz0w#;kwov4k0bZp8{{js0aEg`EA7HHgs5Ad#3jY5h z$|y+wcqmZ4jM^{z+5*F5kf?I-8xU8MX!ONG3S{RC{6wKbw}R+RQPww&oWsAMXvhap zt+d>3e}@taRsYzaJdD+4Db3PcR$O_GT)VSUS82Aly#Lhr7-D^DHL6>UFAa!(Z`tDH2S}%#z)&5j#_v zI%kw=H*yBO2=zB(wjZ=7X^wI{0z0=}w?GQ@HU*|v+fE|{v@1JogpFc!`~(7k&3Q|dsgmZW#r!!e8PcYLjUy34;4uRDf z9#U%h>|eU(4V1H2NwYq^1oLj0j2<77JiF#IyodH-sB`399Jg_m`T>J$i9NBqF_T2| zyC&(TTyrJmb{i;KT(J-dQ+S^>oT@Y3lhjgdc2vlbcOEcq*0q?A*6wQ_9vQ>{0LuDb zZRZ6M1wCSOOxa5#T1c;C9jdqIy%R@%1LB=aqoVR=;61$~LOOqq4|2q|NfP$om`cza zxN$MGnK9`qf0*4Mo_0+=CIO(it+Jy|&3OL}#D@u}0H~9Qi!g9G0v+R!Lxh||kCi%P z(<{KR{57SQLKrXLIm6Z6l& zc$4!0Kzl;r(d}r&AQ6n@8xKsH{QdVC#Q%mnNLtVTh4tKLwY8B;`=gfQktp{QX3*lp z`jUi_(Lx+oeZBQoN2=!c z*Zn<;PjN}Bi2kG?u(|4nb8Qp|G&Vaa0zF69U4C+aLaW{18t48hLP};2qUR{TriE(( z_nufef{Tz|-WBOp)YCQ zAo-a9Tr1n4nZc&V?(4X#(kb*jw}?4Yd6IXU`Uo~-tv&3WlZt7X=AE&j>pXna8_WF7 zu%l%hY6M+wzY%r-KGIFb{7Rh~U65B(_(#e9GL)8hnJqlywnCmU+XCwELaE~6}7dR^0< zmG6o(Pe~FJK>Sp-LmmQ_Y{Ny|<%<-BV3k!?K4k7SP4Ui}8v#G&m)pT5%^uHxV*AOf5Z3mFX_%v@} zNJoU0h@y`^L0CQPfmGf{+kDXi6rb#B zHBK+?u?~L}H9l@Q&SWpRuHhg?M142jRAWZ!52aHNiFbvJ8aIyf!pst`fjGf5-6-f= zwb!bz9W=``d@FkoH4BPMZw#@XZv2wK9l1@uAviWs!4QCw$(cAyCaF|bC^_yq$P%7Z zu{nCX$L?(D3Z0;9JzjM5)QOA}SWlpp#I+9B9jRNo7%=6RC*+7oc@0!e*%D|r3Xd&G zl(~xANHEg(s8pe8%^PLPo!Pq5z$A2(dTpf|bb^>)2{CN|a^v@|NwKqqt4y zZJw|xD>_7omTcgs+u=xRHk>B!XurguZl!#dFd1?Y8D;e#LZ6?H0EVS0ayB!QtN-g$ zcH%6hKcDnOkn3A`eE6n7uz(m=Q__Lq7zgQdsbNhgsPy3#m~(CooW9}SsSp8C3pFuJO|^k466PtsDJwZU4jVD^=Zf6c$sz zJx3=tMkj&d{`&C7jN}vI;f;uc?!x`X7yFG4w_mUx-5YG#Gg~Rqd!M6RXb^Pvi z%t2y}>Hezt%l@$N_n%u|v#*jgp3)OuAYCVJJ)n-Lh+21Y{5( z{EQ?{{yV5!#4u$K;;=zlSwb&nd8J2pr6J!ak^wTk~#7Pug_Ji~W zzIeweDy5|82Dy0Q5*14Ejdd$Dj$?r03lnnPl=5km%95RA6a~DGO6YZEuqdOgUaFQO zu4U~)q1@XvD5O}+Z-ug-R`dp$p%jSwk9xHvD07!%0Tc#7cqp%hs;f4&p-QVcZpkl( z`ElaX+Gb+m8b%|Bzs)6CF9b07oG6b5{^&0|4*JL1*mI&oIx`Bew_lWCMGHW+^3k^T zMzNXq(UD+64Ee8TSm5)lC^r`p9Ug|pAbz()b%^tO2IYYLF!PBtzZWsd% zvISKmColu+(}g)1pXXz_g*7c$hjGX{Ga7|Zq2>!uK?&*K9$hJ&Et&?ekLm>0lfgUI z4MCYovgLTSV>!|vG=YIL0FMldJtyfX3?Oyt8JihgBD<$+&SSv@nW0}+4f^>V=?Jex zISZFs+aFnEzB3pEbC_uWhcEv`H8VLSZ#J!#o;EbI?WSGIwwI5GE;R)DF@be11NTRj zkL(pD$XEpP#a>4CVoAC8AxU(M|H*%J8Pc*TD%d;?W4CO2VlbT3e26X=rIpJMW)||t zBtD;=S4a_foJ;IY*+jQH0n*l_#f+dqI!IR5z`tP>Si>@8Uo<S{B0)7%2v-7I!k$kBpHTmCx3?f$ z-V45|wQlS}4y_x{$ax0I*8%XXm3rf9hzemc%s^*5MWkUflo)UxE7I_{PCY`gk8D7? zq}n;5q%8X6nvMkAp|ztEy>0Vq?p3_-m<;NH90_JLIdb`iwJGs})O^2~OaVug9$s;( z1TZ#2rV}R?B2&11e18F2sxI5*ZBPkV_iN@8bnk)$Oa^XTk>TskAA@lF)Y$Wlk=8bD z^~8Br&7r7Oww1+Qove3QT|**)gcG2hqNcwNmx zdKav4mfpGzC$czs#!CmON)5DFpNkY2Zp|nDF;s7?)6KX+izo--brmr3100TkLCV3NKFgNP zzRDHL-TM{8UGWvFl$e9gDvqs1tm7e8r(%k}m`Y@=_?SSB!g#1F`AJPqV30|!=_t#h z(Fz>96BCh@xDW?bmtWDKMo`x_sQAIHQw8-0=%M6^dS$u~RhUPwsr4pG9c@snMx#!v zz4g;^nRb;#+41L~7pu1BqmOog{Kai+aTtfhd#kjHA~ZLN2kB_bi;KzHjR#|?NgMbq zDtE4{hNCD4;Yl8%E#gLcPNNlK;#P_4h`pCd8+gw2kPiuIy;x?#P+wJDc1lF@JeRB@ z$Q|W*vmy&|?Fno9LHPW%3srylO;$JUqKUMV+^Jr}>;^sS*5lp}0mQKrIH+7jfcj1_ zg+s$)`O(~+Z5M1?oCRX%$?t%xb;lIl73z~;%t!lwX8%D0z6e`q4aN9(@%@&dO|W@V z;++@g`9#rU`e;?9(L$G*XN(8Bx}*DJ_pXYD$X;RIbq8Rr%D=?B$lobn(>RSrmZ>`M z-l<&a!zIsh8VZC13ys|@+*k?NH}m`AtVbM^IEkd?ryM$Cw+$2q#>N(Yi)YDlurNR8 z>WtKfeX;c>G{i;QZ0iQAs5v{=VT)>lsdThblcv*gG3QgFQq=PcL_cL3UQ$N(Nxf4R z4mK|YaaoT7B+@rRIk94fCa+#z8pbv>GA{?k6IfD9Qd$Y`8?O7`P8u?l8Bd@O1+~5F zk3b}KkS^EVpdSt0anCSL5RrJwt8hsKk+@l)dZiqBrNB~tHz-%_@?V2tbD~Rua0hn; zWoW$_b;r;ONq=)Qf5hY79~#b-t;BQ{x$wsnqi}_51Z!v z?L4$6bsRH{)NG@|>9RUTPPU;ONhxDMcV4ew6>^FOq?dPAiRxB-ce;+K97R*jDvO87 z%8ORzfSUXc=Fjj9(@u|Z<>=g^{8`_qMa2JjSc)TIdA9;7Ovs|WIF^2?5?@bHmEE9n z?$-A4c@Mu-|KO#O;O7Z`a9q zxJ`0HDXm>7us3bPC>`CLNegu8cx_I)SX5V?5VP5TcLnIIvESG{2TtKQ!ND(1UekCl zc7Z~|Rf=E8iPbjA*?%a-$`REL@!^e6s)e9S6@+6`78Q&|uy3@IdM-hfL5b}12!>@7 zfi4+{dXzwG`c-9RA($`Q=dT2GyitLcY8XS@vZwkO3Ci+XqErPHx&*hRQ>k!PAe-D( zKu_wUU(Mob>8;nnjzNB<#*tzzfAQ<1dwkKY{0Grhe`2(zv-PHPL9cVv!zUYJW6qGB=2E|tUuu!j*P^h z6A5wz`(>$mvRL93>J%R=#xIxH;;J2358v*)8^Nzz=BoGRGwaZ{3P8dA#muN~;kYDc z>n7*>Wq6krKp{owp7p!m9-g#sJ3KjP8~sZMC@ntYOMBxNs?=;(gUT<86<6XlZGIJq zmjh$mh%uR~bHRQ7BgV^SsjIB;v!HL`s&hF=eEGq3m?O6obVrt*UTHzU@Z4X z-?+ybh4+k#yoVF~sH@?!)5R-q4Q|Rswd5kTiVN*bX#f!fWUUvZ%G_8Wh_-8~Krz1T{UZn5L6|icUfS5@Q;jk& zVuJ-%WbUU5U_BeB_uF?JDo7x^y#3+W2V|U%!@mnHH_HruYy(upytxuSII3PphBQALx?9`yvjWq z!{rDyhWNr%9n&I}DeE;wT&`j5^IrP1xa2A;y)KY>>7rzO`p2Zq`2~9mCr27&C9Y}$ zfx-Fm65aMd-EO3PxIP63dL05*oaG(80iFDGhV@zm4jY1XbsMVt3-+Lk$CYS|8+hS& z8-%Yo2Jc~sPn4sx_K6vo)bL^3@`#>GdT8enLM_X2n`ng{EjEy6QHHDJ@!K4W-u}5j z;R82L;^tjjS9s~0wa*aDf%rR1PNM34(^t5xCC6U85Qv z#9;JkXR1$G`yyCjQMyIG)@UwUJ-!4f);oc9t_(w1yln2mwLz7>DA6+c{VHy#uD;PW zN?W=wE0W_bC`8(N-?(lFJxtjI;7k!>)4VR^AiV>FUDtB2%X2l;BD&j^t*Qr5y0^;) zw?b0Lo~#FTBRnG3aNY;OfGPz$bxA(;DSs7~`8HJMf(s=V$pp@Z>o_eid+dOnJS&Ua za40~9C)`k?Zi>!KS8xnaf9n^g-+oHVESv4eYS(du>_~|A515P|J4yDM=;2 zM0UyQN$}xOR(jHhN`2J1+j$tsogdDId=a1G34kCCB(G4k&=$@;>O>I|B>>^{_48Sc zF7goM;qdlV<~?UOte=}I&Ji_tE;=J>U=Zsh&qu-Rdjs0a+UHRgr^ak6plCe6KMeF@ zJU>)>K~p3`ao6e%LWVNsOi6dIjRmGE6I-(kifp$A3{Sw{=m9-@#~)7C{Vyvh&i?kDsRp06ZX^m-c+W=jeJ^p~r` z&+tq(N2?f3FuG>)h|bl(t=@I?$kxS)Nd|=ilsIL(qm|b|;aqq@BJM+w07*Q$e{p1b zO-~@UruWqZ<2gtf-?x_M^b)WpXI+Vm9hQZ_$sO<6#&`h%{5IL4!UqK9F4uw1q`lGK z{0=2%_apif(a-9CV}ppmK!6k0&h0_%`)R_3$Lf)y<^B~YGbDr6N0;I?p&eL8ihQ+5`uJtvS zwQtSfbOCxj}B3QIBrNu;DxC)>e6{U)~!hCzoqNp zny3{~n|&&G;_;E;K01dODI8 zgce24dlcM~M_7Q@}Ut2iC8q15dzD=iGf1Qb}_RWK_mU~xGb!Gi?!VX_-6|Lq=cFf7%4eVe=NU9K=Wtel9tQbDhyk7@)G zaj0%HnuKM}X@kYq@wq8P8UR1P)|Y09o!s#I`tXB|@NbghgAV!lkM0-Gs6jjMIJD5~ zLTaM>2S^zW_=`bgY{)EZmpg5NLtngzEc@%fOLn^h?{04}l=FyNQF^+-l}ln;N$hmK zs2B#P%)WyHu$muQ{niPwIQuM9iJKo*_bCE-xZ`Z`Ay@{x264);+4~-3-OIP`T-_`# zcPeW@wg{)zN6*M}nuJ;(iPbyb|6*;C%?G9x{IRt_{!DECkKr)?_lU;ef7!wRXIhh~ z{OXLMjPxZGE}TT-R6%H#QB;~Xm}EFe9!XYu$?iDUVr#}hM9pkPMw>)@R}d$J6`8?0 zlQf6iR@+cvy2>IC8e=EIH=_Fr1?>&keJd>^B{lK96=5)r-aH_DJkfsL)$Vn@#gXs5 z^)|2l3$yQ#bdR)*R1ofOEmCKVLP9=hd%Cg0imbqfWFZuEnWf4A+bwIgp6Fm8DZ5NW z9#*z_|FNv%tp!F_|2^DKvo?fmnI~PCrHkyKxU54iYVWw-r`#WH1%;I6#AaySpFu+JAajI9B6z9S6suF{--a*iU!GEB`hCyV+7663v!t`g(2DAf^( zvqL8QNtR_6sWrH?nM7C`d^aC+_^@#|yt$va@g@GW)5eal`&80|=ud zy3H!oR{ftWnPfWzqfu6(PngIVY4=rTa-mUM)x;s0BB)^ecXT%Ht3tf}4*m0dr!KVu zHuSYNA8)lLcAv_i3|cY6Gmlf87vpW zgQK60L2h^GY9g%N=dM-xTG!K_Ac~xyX35Q)Ff>57LNZBXOgcjz2f@}X4z`BsMOa+#jN$U=Mv3JwNnzIQSVcM;*Z3^E zA{w3pwPu#}T&w5q>C*~S!>Ck;QfkE4_@~-}UTIWF({*R?NVbKF#Tt%?4oqa2m1%() zy5ShK6#7M)xe0fFu-=Hz<HZzOA9QOVm*w#3~(}3Db$((Bg$sXXoT3D=1ov zkfK!s{bCbgA!eie60>QMBl$du2R;Ll3Orz#P0szlxIga=FiAe;RxOO3j-ZZT+Q5*? z6Q|eE7B>era5Jggs7a`%P6Eqn0q!c6Z}Qx?#9q-qP&^E*n=zQ71Rd7O)>QQ;5D{>< z2$yN_=V^VeVH*_*rA`uoo|=OY-_oF8)MjR)Bm6AOLGqg_X~2FldHi{{#Wi`MrnVzD zalyDY`H#%&obRVPCEA+Q3Z{==JPNl2U5QKkReQteUVho+E$bNh{-J=04tckZ#4b={ z#YfY19!wIu2|?Mr#~!MdwAhG$=D?u3d+3Y#ql3UC%v@ma(Y->Q6+guK5nSZ@t8GPl zx0v*OK4X_58bPD7r_r&0b8Ke7bAga^g~lBc+6|!@rJbWB4|#ay?>4(A_g~*E1n;i@ zK}pYZg7p5CMF#s2%bg+NMygbkP)>)A8rmWDUoh6^L%h% zUUA?NX=0>Bf2xpSkG+4hsathn7-sQHVo1_lFx>~p=JvevkF4kt|1(jzakgQep^wom zfv;MAa8fkl6)X+?yXVr&KOyuO2y@d*%*(WiWs2?0ULdr`zIB!l;Q2S1<20 z7k5(g7f7pd_44zx-869ZHB4^e`7ds-q;y|P;N;>sldO2o=P!Jawe8~XL`#|I-*kidTo?f;>AJ5z^yPW zL_Yy?tCFf_94%n=(yi!hm6D8JwG0Jd^AsX>tTdbR>88;CQdLJ z+Iljw44H!snRV~hZ+`*L@|C{R2I#7>_C4}O(DEM*Z}R&T2-zmMU=mc?Isr*%;l2Z6E@GdQXQ zE6yFGUdVB+48dw^#eF9P@tRto9xXw7caarv>W81sy`xkBCuxLSS zJYB2+XzL$#8wSySDztc86VU-1jzEqUjNycoV#A3LHku%J`m6DjMA&sBA%70|xj?F> z$%deE3^iWo4K}dQJT1D^^_tdz*`(?FuPq%TL5j8}E2Sgk6A=q77Ds1ZK30w{YP>p& z#8Vq#UY6HzAXjm1xJI4Cl-el^%?p2>fy%Q1LhYK1u%WXGg+sMSOM7{D<9fHu zb+yr%#^ebn7uVIY#S~TK9&<jqK}aJc*IBTk3GesKj0%hEbwuH<+{l)@|rc5 z-GAQ-{>shxYk_GNTO?bgUxJQ-v*(hd_CtaB7b_}5`75XJCbf7RdWO2IB<%VdjUhYJ z7abavE%-q)IMZ(_rXmIk8F0$b2D^fJ^0L!SFQ5mNFGF1!vnRa4I-tx|iXn0K<@piu zn!I_Zc>>#8+J`5P%s$me=Di=Bw0FgqGs=|<>MNzw1bHV!z{tO=ts#3LXvR1i7b-bB z(+XTuNJdAmk#H8ahCAUo5Qv$Z{fbN`t@EL+^l`ZQC3gjy8wnWDjeoZ~-X)RmQva6+ zAGHTbjm(R?DsQ^~dbshIIZMyjaTi`&a1+4*v%>4I+w4}F5KMetKAu0j2ezypAqt?~ zIT!PzHOjTgtiStX=)^XLORSQ-T8qwJbKZV^5`a2_Gx?9e%J=f;XO4t{e|#d~(b1GJ z^$Gx@Zl~deLFp61-Us0Gwc!6HhMq<4J6Dn~itURCUOqntcF|)BJI97<8wc2{_enZy zpQYA?u{$78y*U+Vo3?EV&0iyA3X^e@^)cYW-}n9(1BqMq&0Wxs1(oS1R!Zdmh#os@ zGedoc|34|qg>mCjeSZ;yrfpDU|J?f7%CZ25%mj+lgz{;?5%t#KjMYM#a!k_dxKL=O zw%h=CknWQy=-0?1w6l62Uw>z^%}<=K-$VSu?AJn;lNsw#0&Zfci4WRjOh7A;3M6@8 z^LHs+(~mJ31E3#i4h&vKXpTNhdd9K~voy6W9!>;Z%1xc&r!$%{6E{rXI9`I4OqQNy zxJG*RRQSJ2I}>;)w>OSYhR9M~LZos{lo*6aQd!12G`6~;m}DQuPLfa|WlLRKT+1|B zveXroREliLTFIIgd*oJ1uD}18D_+jkpnH6Ltk3UzmiN5pJ?FgVd8qGL{!Dwzg4I zc39+X9C0Lx{^I$>^PQTBw{Rf3>3_1Om{>t(y9z0b^~)7bDnHXYu{`Eble#U_&d!&& zqO0muWxsKCv7awPsWYwfe3b6hW)i9BW@9*n&ud8*nVdYs9=}KKc5lSZ*Y`aF(3%ap zE0P%VUey^Lu(i4%-Ej2%ie^l4si4mG?ef)m+S?0RB6Dg+JSu{nl}^7YYktIO@2mXg zk6v{~eslFzn0gh)_}|ncga~)ueQfGhocpp+;sA$J2xw~&(AF9YwKW`wbJkP_az%>tbe^WB+J|Mg2}58P`%3hV|#z$|=ikYS{X?2i_aoWVRqrw4GpRmSYS!x-AdZqF1dN@&?yW(6tB{}(slgRUw^dojogkv5-xylMbrrR#(P?LBG6U_1d zQ-8r#_esbnGGsqz-4h|7i~gBpB{xT3sAEf?O&#b5@0H&NPIZ((W9#CKl(AZR>XME` zPb()$5P(&J=uEVS-MZpoOfkqk;1$&rj&6sb^2G1b7ka?Ij}Axx}kXn%#&Ka~=( zBEvbvGPh3#IS#_E#a-6As2n2Z8TwkqN*zO|#2W&)1eLqCc(ck-Ndj;4+eDMHIV!@E z2`}z$+Q+u8`;uvWxbY`D(P8UE-9Rw>pa4WEPe**>A*Ffc}-k zi2sj41}83Yj_aGWadB=UoS))DMxUQ;iFq7o#;?R<_pkho;(Z-2L8j8P^u^D%f+dPG;UpB}sTa&=$IoCtP3saye==&j8<*KzwMwDHF+b<+pKzqR{Y_P<(F0mwn zrcl;zL6KVauEe4gHDhPT>Z@l>wLeSVa>1q*r+G8fesLU+(e^7VMd_Za%hk|*$~GF3 zn(%p#^~OgrCASlWg73E2-_vMibv(SI?cLZI?rTqZtAZ%clOC0It!$JlW0yQ1n#S!g z*z@YiP5%vnB#(n^Cz#oLcZFs+q^eM3S-;B$08#&rD;RZ<<^bHMtZmD^iqw zuBB65e^pB8LmvG%aninJoT`EGDyKd=Wa&3AYvQlr4>f1xEy1lR(5T+zoBBF2uU+0g zDv*2a$^5ln%`9J`F_)uF_lEA&znh=2`?0e2I!uhX68b>eF0xOMaUf^1X~ue9sF|S;^NedDo+GnDO%C+Gy1zg=|O+5EmS8KfwBxOGp^YhWZl9LB+ zoWXCn6}9=cTl!D|ka`B=OG1C=u5GOp{kS!4e_KL!?fWQ3@Ge#H@5XwH z8|@}}^H&;Lh*`Eq-rHN*GBln$7*!&cCq~X4tGQ10-EhUmc2~V$442}#p4}EhN{}hO zt)h1`@j%<93zx6DSiUeHVsA)enh?3KU(twm7ct2hzoFi8Fhz4PBbR4oFYZ&Q$;dT> z!C3D0%&p~^eRAO~HLXDdSN+63B{Q}9X>L4NT6^*ZUtz>@ANBO)j_s3mRYP4t;v;y1 z1J$k76io@2(v=)lQ}ui_yf*ydMmBj?=0@)9wY8RMTQft)j}b1B_xu07p-@NTt1O1- zrP&glb2U2-`-Q`(;a+19I#@FcwNEcG3AfmuF+c=pxVoPID8#uB=m8}g~n(O(fV>{k-yrT z%?ghWQ)IKh$vXwJZ@YAD40G=ap`+1KK4p)Br_1Woavo@T^m<>PC&B#hU!|J&ey|k_ z4nD3pDDgS3(P11-Y$uQNhZVz5N6F>F!h6BZllEk!_MdK|&aPx|cXhY3a?=stT8Y=e zON`*J*XWAt)HGrxwZ*q+Vqa@ZR!L$}q20V!284MwiP%v31Gsxj)?B>8!)?>u^OApn zubibAoVP(51dG%rOn3B)1%o>rsY(~gcHxBV%zHNcGJAG5LXzusqp zf6xIB1mL$bi4w3Gd_OZ<=ql@JspAZdBy`p3fx$rYJ<-5uph=7HP0s?jFr8%~{M}+| zNTO>9R$pfs>diHr8rccBgeCIxUk5pYDmyHW0xgInO29$zSUV$u*HXpl8RB4To$Jl) z{=g^)d?NLZLQw)fbI!8X+h+vqVdLNM)J_c802p356&!dPP6 zCE7UwrwB-(Cm67|{rYWDP!Y8AfYQ_I;43A7XB{1Ynw2%tgXFFTJT;NX#G{D6V^}|d zVDJD7^jm?x;T-)4a6Qv{?DzgRb=^((gMaJ8lLIg#^ggES;cg28O4wNB&wi4wpM0>1vR)_@;4cOr@Ob#+|3e&Q7EJv(^^|?+hTO*&u!_h2Ss`y zx5A)}f$&VC1c<8AQN@#OY^LLn!S!0&Q*9~*T1_5YgpxCYw2a=t(UH`pO*9TnO)F@Z z{`~n3`;;u525tv@p!e>cBQ9@1N1Q-(w^ep?vvNE_t6@CZl1Ngs1HH`dhzAnP1TKgR z&x+=ipcT78VZ`UK6Yo4@10Zu1dFQ^1lLKX#%I7Y+9FjbP)?{2X?wBENh6hH0t!iov~!_g0%`C9z|%z*OpA9f0PuiVfdgO zf~Mpy6+QnL1HT-G5DZEdApC1jdVT`D&y5iJDway1HzLD3f(U2xlZ7~o-yeiq2;Q4Q zs9aAMpu!K)v!10Ec)Wr4NDwHhZq{nR)NJ^N3n_D#JihOkz~zHi5)l;c*?&PH>xu*& VCNKd3JGtOvEm(5t0lFyE{{i--k}m)N literal 0 HcmV?d00001 diff --git a/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.properties b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000000..6686a643d7d --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.0/apache-maven-3.9.0-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar diff --git a/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw new file mode 100755 index 00000000000..b7f064624f8 --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw @@ -0,0 +1,287 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.1.1 +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /usr/local/etc/mavenrc ] ; then + . /usr/local/etc/mavenrc + fi + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + JAVA_HOME="`/usr/libexec/java_home`"; export JAVA_HOME + else + JAVA_HOME="/Library/Java/Home"; export JAVA_HOME + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`\\unset -f command; \\command -v java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + printf '%s' "$(cd "$basedir"; pwd)" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname $0)") +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) wrapperUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $wrapperUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + QUIET="--quiet" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + elif command -v curl > /dev/null; then + QUIET="--silent" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + QUIET="" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L + fi + [ $? -eq 0 ] || rm -f "$wrapperJarPath" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaSource="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=`cygpath --path --windows "$javaSource"` + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaSource") + fi + if [ -e "$javaClass" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw.cmd b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw.cmd new file mode 100644 index 00000000000..474c9d6b74c --- /dev/null +++ b/java/ql/integration-tests/all-platforms/java/diagnostics/maven-http-repository/mvnw.cmd @@ -0,0 +1,187 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.1.1 +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%"=="on" pause + +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% + +cmd /C exit /B %ERROR_CODE% From 225ed1e220e88114a76d8dbabbd06d5f6697cd40 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 15 Mar 2023 11:10:43 +0100 Subject: [PATCH 063/143] Java: Autoformat. --- java/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql | 3 ++- java/ql/src/Security/CWE/CWE-190/ArithmeticTaintedLocal.ql | 4 +++- java/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql | 4 +++- .../src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql | 3 ++- .../Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql | 4 +++- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/java/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql b/java/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql index 99d9879d19e..c4294e92ef0 100644 --- a/java/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql +++ b/java/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql @@ -37,7 +37,8 @@ module RemoteUserInputOverflow = TaintTracking::Make; module Flow = - DataFlow::MergePathGraph; + DataFlow::MergePathGraph; import Flow::PathGraph diff --git a/java/ql/src/Security/CWE/CWE-190/ArithmeticTaintedLocal.ql b/java/ql/src/Security/CWE/CWE-190/ArithmeticTaintedLocal.ql index 5fae695bf56..9fb079ade70 100644 --- a/java/ql/src/Security/CWE/CWE-190/ArithmeticTaintedLocal.ql +++ b/java/ql/src/Security/CWE/CWE-190/ArithmeticTaintedLocal.ql @@ -39,7 +39,9 @@ module ArithmeticTaintedLocalUnderflowFlow = TaintTracking::Make; module Flow = - DataFlow::MergePathGraph; + DataFlow::MergePathGraph; import Flow::PathGraph diff --git a/java/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql b/java/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql index 636480f7400..718062a97c7 100644 --- a/java/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql +++ b/java/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql @@ -47,7 +47,9 @@ module ArithmeticUncontrolledUnderflowFlow = TaintTracking::Make; module Flow = - DataFlow::MergePathGraph; + DataFlow::MergePathGraph; import Flow::PathGraph diff --git a/java/ql/src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql b/java/ql/src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql index 72801f205aa..5a32334e691 100644 --- a/java/ql/src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql +++ b/java/ql/src/Security/CWE/CWE-190/ArithmeticWithExtremeValues.ql @@ -62,7 +62,8 @@ private module MinValueFlowConfig implements DataFlow::ConfigSig { module MinValueFlow = DataFlow::Make; module Flow = - DataFlow::MergePathGraph; + DataFlow::MergePathGraph; import Flow::PathGraph diff --git a/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql b/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql index 76998b40b50..6d99eba59c2 100644 --- a/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql +++ b/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql @@ -261,7 +261,9 @@ module InsecureMethodPathGraph implements DataFlow::PathGraphSig; + DataFlow::MergePathGraph; import Flow::PathGraph From 56288eb3d2ab69e9094427d8cfef258ce1173be6 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 16 Dec 2022 14:30:34 +0100 Subject: [PATCH 064/143] Java: Misc performance fixes --- java/ql/lib/semmle/code/java/ControlFlowGraph.qll | 2 ++ java/ql/lib/semmle/code/java/dataflow/SSA.qll | 2 ++ .../code/java/dataflow/internal/BaseSSA.qll | 1 + .../java/dataflow/internal/DataFlowImplCommon.qll | 15 ++++++++------- .../java/dataflow/internal/FlowSummaryImpl.qll | 1 + java/ql/lib/semmle/code/java/frameworks/JaxWS.qll | 2 ++ 6 files changed, 16 insertions(+), 7 deletions(-) diff --git a/java/ql/lib/semmle/code/java/ControlFlowGraph.qll b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll index 94464bd263f..f94658e1372 100644 --- a/java/ql/lib/semmle/code/java/ControlFlowGraph.qll +++ b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll @@ -365,6 +365,7 @@ private module ControlFlowGraphImpl { /** * Gets a non-overridable method that always throws an exception or calls `exit`. */ + pragma[assume_small_delta] private Method nonReturningMethod() { result instanceof MethodExit or @@ -381,6 +382,7 @@ private module ControlFlowGraphImpl { /** * Gets a virtual method that always throws an exception or calls `exit`. */ + pragma[assume_small_delta] private EffectivelyNonVirtualMethod likelyNonReturningMethod() { result.getReturnType() instanceof VoidType and not exists(ReturnStmt ret | ret.getEnclosingCallable() = result) and diff --git a/java/ql/lib/semmle/code/java/dataflow/SSA.qll b/java/ql/lib/semmle/code/java/dataflow/SSA.qll index 000d0275819..d4ff7ed0ac7 100644 --- a/java/ql/lib/semmle/code/java/dataflow/SSA.qll +++ b/java/ql/lib/semmle/code/java/dataflow/SSA.qll @@ -451,6 +451,7 @@ private module SsaImpl { * Holds if `f` is live in `b` at index `i`. The rank of `i` is `rankix` as * defined by `callDefUseRank`. */ + pragma[assume_small_delta] private predicate liveAtRank(TrackedField f, BasicBlock b, int rankix, int i) { callDefUseRank(f, b, rankix, i) and ( @@ -564,6 +565,7 @@ private module SsaImpl { } /** Holds if a phi node for `v` is needed at the beginning of basic block `b`. */ + pragma[assume_small_delta] cached predicate phiNode(TrackedVar v, BasicBlock b) { liveAtEntry(v, b) and 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 f44ed438596..6f53dbd02c1 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/BaseSSA.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/BaseSSA.qll @@ -151,6 +151,7 @@ private module SsaImpl { } /** Holds if a phi node for `v` is needed at the beginning of basic block `b`. */ + pragma[assume_small_delta] cached predicate phiNode(BaseSsaSourceVariable v, BasicBlock b) { liveAtEntry(v, b) and diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll index d09fdcfca3e..e6fce328326 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll @@ -140,10 +140,8 @@ private module LambdaFlow { } pragma[nomagic] - private TReturnPositionSimple viableReturnPosLambda( - DataFlowCall call, DataFlowCallOption lastCall, ReturnKind kind - ) { - result = TReturnPositionSimple0(viableCallableLambda(call, lastCall), kind) + private TReturnPositionSimple viableReturnPosLambda(DataFlowCall call, ReturnKind kind) { + result = TReturnPositionSimple0(viableCallableLambda(call, _), kind) } private predicate viableReturnPosOutNonLambda( @@ -155,11 +153,12 @@ private module LambdaFlow { ) } + pragma[nomagic] private predicate viableReturnPosOutLambda( - DataFlowCall call, DataFlowCallOption lastCall, TReturnPositionSimple pos, OutNode out + DataFlowCall call, TReturnPositionSimple pos, OutNode out ) { exists(ReturnKind kind | - pos = viableReturnPosLambda(call, lastCall, kind) and + pos = viableReturnPosLambda(call, kind) and out = getAnOutNode(call, kind) ) } @@ -188,6 +187,7 @@ private module LambdaFlow { else any() } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlow0( DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, @@ -274,6 +274,7 @@ private module LambdaFlow { ) } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlowOut( DataFlowCall lambdaCall, LambdaCallKind kind, TReturnPositionSimple pos, DataFlowType t, @@ -285,7 +286,7 @@ private module LambdaFlow { or // non-linear recursion revLambdaFlowOutLambdaCall(lambdaCall, kind, out, t, toJump, call, lastCall) and - viableReturnPosOutLambda(call, _, pos, out) + viableReturnPosOutLambda(call, pos, out) ) } 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 478328d90bf..6c718a66068 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/FlowSummaryImpl.qll @@ -109,6 +109,7 @@ module Public { } /** Gets the stack obtained by dropping the first `i` elements, if any. */ + pragma[assume_small_delta] SummaryComponentStack drop(int i) { i = 0 and result = this or diff --git a/java/ql/lib/semmle/code/java/frameworks/JaxWS.qll b/java/ql/lib/semmle/code/java/frameworks/JaxWS.qll index 54b41f28a08..5c20af2f457 100644 --- a/java/ql/lib/semmle/code/java/frameworks/JaxWS.qll +++ b/java/ql/lib/semmle/code/java/frameworks/JaxWS.qll @@ -53,6 +53,7 @@ private predicate hasPathAnnotation(Annotatable annotatable) { * A method which is annotated with one or more JaxRS resource type annotations e.g. `@GET`, `@POST` etc. */ class JaxRsResourceMethod extends Method { + pragma[assume_small_delta] JaxRsResourceMethod() { exists(AnnotationType a | a = this.getAnAnnotation().getType() and @@ -91,6 +92,7 @@ class JaxRsResourceMethod extends Method { * This class contains resource methods, which are executed in response to requests. */ class JaxRsResourceClass extends Class { + pragma[assume_small_delta] JaxRsResourceClass() { // A root resource class has a @Path annotation on the class. hasPathAnnotation(this) From 0d6dd7d25a0cfe1fa4a7755b5b52fa9352284037 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 15 Mar 2023 11:48:28 +0100 Subject: [PATCH 065/143] DataFlow: Sync. --- .../cpp/dataflow/internal/DataFlowImplCommon.qll | 15 ++++++++------- .../ir/dataflow/internal/DataFlowImplCommon.qll | 15 ++++++++------- .../dataflow/internal/DataFlowImplCommon.qll | 15 ++++++++------- .../csharp/dataflow/internal/FlowSummaryImpl.qll | 1 + .../go/dataflow/internal/DataFlowImplCommon.qll | 15 ++++++++------- .../go/dataflow/internal/FlowSummaryImpl.qll | 1 + .../dataflow/new/internal/DataFlowImplCommon.qll | 15 ++++++++------- .../dataflow/new/internal/FlowSummaryImpl.qll | 1 + .../ruby/dataflow/internal/DataFlowImplCommon.qll | 15 ++++++++------- .../ruby/dataflow/internal/FlowSummaryImpl.qll | 1 + .../dataflow/internal/DataFlowImplCommon.qll | 15 ++++++++------- .../swift/dataflow/internal/FlowSummaryImpl.qll | 1 + 12 files changed, 61 insertions(+), 49 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll index d09fdcfca3e..e6fce328326 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll @@ -140,10 +140,8 @@ private module LambdaFlow { } pragma[nomagic] - private TReturnPositionSimple viableReturnPosLambda( - DataFlowCall call, DataFlowCallOption lastCall, ReturnKind kind - ) { - result = TReturnPositionSimple0(viableCallableLambda(call, lastCall), kind) + private TReturnPositionSimple viableReturnPosLambda(DataFlowCall call, ReturnKind kind) { + result = TReturnPositionSimple0(viableCallableLambda(call, _), kind) } private predicate viableReturnPosOutNonLambda( @@ -155,11 +153,12 @@ private module LambdaFlow { ) } + pragma[nomagic] private predicate viableReturnPosOutLambda( - DataFlowCall call, DataFlowCallOption lastCall, TReturnPositionSimple pos, OutNode out + DataFlowCall call, TReturnPositionSimple pos, OutNode out ) { exists(ReturnKind kind | - pos = viableReturnPosLambda(call, lastCall, kind) and + pos = viableReturnPosLambda(call, kind) and out = getAnOutNode(call, kind) ) } @@ -188,6 +187,7 @@ private module LambdaFlow { else any() } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlow0( DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, @@ -274,6 +274,7 @@ private module LambdaFlow { ) } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlowOut( DataFlowCall lambdaCall, LambdaCallKind kind, TReturnPositionSimple pos, DataFlowType t, @@ -285,7 +286,7 @@ private module LambdaFlow { or // non-linear recursion revLambdaFlowOutLambdaCall(lambdaCall, kind, out, t, toJump, call, lastCall) and - viableReturnPosOutLambda(call, _, pos, out) + viableReturnPosOutLambda(call, pos, out) ) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll index d09fdcfca3e..e6fce328326 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll @@ -140,10 +140,8 @@ private module LambdaFlow { } pragma[nomagic] - private TReturnPositionSimple viableReturnPosLambda( - DataFlowCall call, DataFlowCallOption lastCall, ReturnKind kind - ) { - result = TReturnPositionSimple0(viableCallableLambda(call, lastCall), kind) + private TReturnPositionSimple viableReturnPosLambda(DataFlowCall call, ReturnKind kind) { + result = TReturnPositionSimple0(viableCallableLambda(call, _), kind) } private predicate viableReturnPosOutNonLambda( @@ -155,11 +153,12 @@ private module LambdaFlow { ) } + pragma[nomagic] private predicate viableReturnPosOutLambda( - DataFlowCall call, DataFlowCallOption lastCall, TReturnPositionSimple pos, OutNode out + DataFlowCall call, TReturnPositionSimple pos, OutNode out ) { exists(ReturnKind kind | - pos = viableReturnPosLambda(call, lastCall, kind) and + pos = viableReturnPosLambda(call, kind) and out = getAnOutNode(call, kind) ) } @@ -188,6 +187,7 @@ private module LambdaFlow { else any() } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlow0( DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, @@ -274,6 +274,7 @@ private module LambdaFlow { ) } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlowOut( DataFlowCall lambdaCall, LambdaCallKind kind, TReturnPositionSimple pos, DataFlowType t, @@ -285,7 +286,7 @@ private module LambdaFlow { or // non-linear recursion revLambdaFlowOutLambdaCall(lambdaCall, kind, out, t, toJump, call, lastCall) and - viableReturnPosOutLambda(call, _, pos, out) + viableReturnPosOutLambda(call, pos, out) ) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll index d09fdcfca3e..e6fce328326 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll @@ -140,10 +140,8 @@ private module LambdaFlow { } pragma[nomagic] - private TReturnPositionSimple viableReturnPosLambda( - DataFlowCall call, DataFlowCallOption lastCall, ReturnKind kind - ) { - result = TReturnPositionSimple0(viableCallableLambda(call, lastCall), kind) + private TReturnPositionSimple viableReturnPosLambda(DataFlowCall call, ReturnKind kind) { + result = TReturnPositionSimple0(viableCallableLambda(call, _), kind) } private predicate viableReturnPosOutNonLambda( @@ -155,11 +153,12 @@ private module LambdaFlow { ) } + pragma[nomagic] private predicate viableReturnPosOutLambda( - DataFlowCall call, DataFlowCallOption lastCall, TReturnPositionSimple pos, OutNode out + DataFlowCall call, TReturnPositionSimple pos, OutNode out ) { exists(ReturnKind kind | - pos = viableReturnPosLambda(call, lastCall, kind) and + pos = viableReturnPosLambda(call, kind) and out = getAnOutNode(call, kind) ) } @@ -188,6 +187,7 @@ private module LambdaFlow { else any() } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlow0( DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, @@ -274,6 +274,7 @@ private module LambdaFlow { ) } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlowOut( DataFlowCall lambdaCall, LambdaCallKind kind, TReturnPositionSimple pos, DataFlowType t, @@ -285,7 +286,7 @@ private module LambdaFlow { or // non-linear recursion revLambdaFlowOutLambdaCall(lambdaCall, kind, out, t, toJump, call, lastCall) and - viableReturnPosOutLambda(call, _, pos, out) + viableReturnPosOutLambda(call, pos, out) ) } 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 478328d90bf..6c718a66068 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/FlowSummaryImpl.qll @@ -109,6 +109,7 @@ module Public { } /** Gets the stack obtained by dropping the first `i` elements, if any. */ + pragma[assume_small_delta] SummaryComponentStack drop(int i) { i = 0 and result = this or diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplCommon.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplCommon.qll index d09fdcfca3e..e6fce328326 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplCommon.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplCommon.qll @@ -140,10 +140,8 @@ private module LambdaFlow { } pragma[nomagic] - private TReturnPositionSimple viableReturnPosLambda( - DataFlowCall call, DataFlowCallOption lastCall, ReturnKind kind - ) { - result = TReturnPositionSimple0(viableCallableLambda(call, lastCall), kind) + private TReturnPositionSimple viableReturnPosLambda(DataFlowCall call, ReturnKind kind) { + result = TReturnPositionSimple0(viableCallableLambda(call, _), kind) } private predicate viableReturnPosOutNonLambda( @@ -155,11 +153,12 @@ private module LambdaFlow { ) } + pragma[nomagic] private predicate viableReturnPosOutLambda( - DataFlowCall call, DataFlowCallOption lastCall, TReturnPositionSimple pos, OutNode out + DataFlowCall call, TReturnPositionSimple pos, OutNode out ) { exists(ReturnKind kind | - pos = viableReturnPosLambda(call, lastCall, kind) and + pos = viableReturnPosLambda(call, kind) and out = getAnOutNode(call, kind) ) } @@ -188,6 +187,7 @@ private module LambdaFlow { else any() } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlow0( DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, @@ -274,6 +274,7 @@ private module LambdaFlow { ) } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlowOut( DataFlowCall lambdaCall, LambdaCallKind kind, TReturnPositionSimple pos, DataFlowType t, @@ -285,7 +286,7 @@ private module LambdaFlow { or // non-linear recursion revLambdaFlowOutLambdaCall(lambdaCall, kind, out, t, toJump, call, lastCall) and - viableReturnPosOutLambda(call, _, pos, out) + viableReturnPosOutLambda(call, pos, out) ) } diff --git a/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll b/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll index 478328d90bf..6c718a66068 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/FlowSummaryImpl.qll @@ -109,6 +109,7 @@ module Public { } /** Gets the stack obtained by dropping the first `i` elements, if any. */ + pragma[assume_small_delta] SummaryComponentStack drop(int i) { i = 0 and result = this or diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplCommon.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplCommon.qll index d09fdcfca3e..e6fce328326 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplCommon.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplCommon.qll @@ -140,10 +140,8 @@ private module LambdaFlow { } pragma[nomagic] - private TReturnPositionSimple viableReturnPosLambda( - DataFlowCall call, DataFlowCallOption lastCall, ReturnKind kind - ) { - result = TReturnPositionSimple0(viableCallableLambda(call, lastCall), kind) + private TReturnPositionSimple viableReturnPosLambda(DataFlowCall call, ReturnKind kind) { + result = TReturnPositionSimple0(viableCallableLambda(call, _), kind) } private predicate viableReturnPosOutNonLambda( @@ -155,11 +153,12 @@ private module LambdaFlow { ) } + pragma[nomagic] private predicate viableReturnPosOutLambda( - DataFlowCall call, DataFlowCallOption lastCall, TReturnPositionSimple pos, OutNode out + DataFlowCall call, TReturnPositionSimple pos, OutNode out ) { exists(ReturnKind kind | - pos = viableReturnPosLambda(call, lastCall, kind) and + pos = viableReturnPosLambda(call, kind) and out = getAnOutNode(call, kind) ) } @@ -188,6 +187,7 @@ private module LambdaFlow { else any() } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlow0( DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, @@ -274,6 +274,7 @@ private module LambdaFlow { ) } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlowOut( DataFlowCall lambdaCall, LambdaCallKind kind, TReturnPositionSimple pos, DataFlowType t, @@ -285,7 +286,7 @@ private module LambdaFlow { or // non-linear recursion revLambdaFlowOutLambdaCall(lambdaCall, kind, out, t, toJump, call, lastCall) and - viableReturnPosOutLambda(call, _, pos, out) + viableReturnPosOutLambda(call, pos, out) ) } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll b/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll index 478328d90bf..6c718a66068 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/FlowSummaryImpl.qll @@ -109,6 +109,7 @@ module Public { } /** Gets the stack obtained by dropping the first `i` elements, if any. */ + pragma[assume_small_delta] SummaryComponentStack drop(int i) { i = 0 and result = this or diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplCommon.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplCommon.qll index d09fdcfca3e..e6fce328326 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplCommon.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplCommon.qll @@ -140,10 +140,8 @@ private module LambdaFlow { } pragma[nomagic] - private TReturnPositionSimple viableReturnPosLambda( - DataFlowCall call, DataFlowCallOption lastCall, ReturnKind kind - ) { - result = TReturnPositionSimple0(viableCallableLambda(call, lastCall), kind) + private TReturnPositionSimple viableReturnPosLambda(DataFlowCall call, ReturnKind kind) { + result = TReturnPositionSimple0(viableCallableLambda(call, _), kind) } private predicate viableReturnPosOutNonLambda( @@ -155,11 +153,12 @@ private module LambdaFlow { ) } + pragma[nomagic] private predicate viableReturnPosOutLambda( - DataFlowCall call, DataFlowCallOption lastCall, TReturnPositionSimple pos, OutNode out + DataFlowCall call, TReturnPositionSimple pos, OutNode out ) { exists(ReturnKind kind | - pos = viableReturnPosLambda(call, lastCall, kind) and + pos = viableReturnPosLambda(call, kind) and out = getAnOutNode(call, kind) ) } @@ -188,6 +187,7 @@ private module LambdaFlow { else any() } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlow0( DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, @@ -274,6 +274,7 @@ private module LambdaFlow { ) } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlowOut( DataFlowCall lambdaCall, LambdaCallKind kind, TReturnPositionSimple pos, DataFlowType t, @@ -285,7 +286,7 @@ private module LambdaFlow { or // non-linear recursion revLambdaFlowOutLambdaCall(lambdaCall, kind, out, t, toJump, call, lastCall) and - viableReturnPosOutLambda(call, _, pos, out) + viableReturnPosOutLambda(call, pos, out) ) } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll index 478328d90bf..6c718a66068 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/FlowSummaryImpl.qll @@ -109,6 +109,7 @@ module Public { } /** Gets the stack obtained by dropping the first `i` elements, if any. */ + pragma[assume_small_delta] SummaryComponentStack drop(int i) { i = 0 and result = this or diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImplCommon.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImplCommon.qll index d09fdcfca3e..e6fce328326 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImplCommon.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImplCommon.qll @@ -140,10 +140,8 @@ private module LambdaFlow { } pragma[nomagic] - private TReturnPositionSimple viableReturnPosLambda( - DataFlowCall call, DataFlowCallOption lastCall, ReturnKind kind - ) { - result = TReturnPositionSimple0(viableCallableLambda(call, lastCall), kind) + private TReturnPositionSimple viableReturnPosLambda(DataFlowCall call, ReturnKind kind) { + result = TReturnPositionSimple0(viableCallableLambda(call, _), kind) } private predicate viableReturnPosOutNonLambda( @@ -155,11 +153,12 @@ private module LambdaFlow { ) } + pragma[nomagic] private predicate viableReturnPosOutLambda( - DataFlowCall call, DataFlowCallOption lastCall, TReturnPositionSimple pos, OutNode out + DataFlowCall call, TReturnPositionSimple pos, OutNode out ) { exists(ReturnKind kind | - pos = viableReturnPosLambda(call, lastCall, kind) and + pos = viableReturnPosLambda(call, kind) and out = getAnOutNode(call, kind) ) } @@ -188,6 +187,7 @@ private module LambdaFlow { else any() } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlow0( DataFlowCall lambdaCall, LambdaCallKind kind, Node node, DataFlowType t, boolean toReturn, @@ -274,6 +274,7 @@ private module LambdaFlow { ) } + pragma[assume_small_delta] pragma[nomagic] predicate revLambdaFlowOut( DataFlowCall lambdaCall, LambdaCallKind kind, TReturnPositionSimple pos, DataFlowType t, @@ -285,7 +286,7 @@ private module LambdaFlow { or // non-linear recursion revLambdaFlowOutLambdaCall(lambdaCall, kind, out, t, toJump, call, lastCall) and - viableReturnPosOutLambda(call, _, pos, out) + viableReturnPosOutLambda(call, pos, out) ) } diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll b/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll index 478328d90bf..6c718a66068 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/FlowSummaryImpl.qll @@ -109,6 +109,7 @@ module Public { } /** Gets the stack obtained by dropping the first `i` elements, if any. */ + pragma[assume_small_delta] SummaryComponentStack drop(int i) { i = 0 and result = this or From 89d9d65755faeba01c3570417c4942b8626f95bd Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 21 Mar 2023 14:45:29 +0100 Subject: [PATCH 066/143] Java/C#: Remove useless disjuncts. --- .../dataflow/internal/rangeanalysis/SignAnalysisCommon.qll | 4 ---- .../dataflow/internal/rangeanalysis/SignAnalysisCommon.qll | 4 ---- 2 files changed, 8 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll index e44cd40d872..6f0067517f9 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll @@ -45,10 +45,6 @@ private Sign certainExprSign(Expr e) { private predicate unknownSign(Expr e) { not exists(certainExprSign(e)) and ( - exists(IntegerLiteral lit | lit = e and not exists(lit.getValue().toInt())) - or - exists(LongLiteral lit | lit = e and not exists(lit.getValue().toFloat())) - or exists(CastingExpr cast, Type fromtyp | cast = e and fromtyp = cast.getSourceType() and diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll index e44cd40d872..6f0067517f9 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/rangeanalysis/SignAnalysisCommon.qll @@ -45,10 +45,6 @@ private Sign certainExprSign(Expr e) { private predicate unknownSign(Expr e) { not exists(certainExprSign(e)) and ( - exists(IntegerLiteral lit | lit = e and not exists(lit.getValue().toInt())) - or - exists(LongLiteral lit | lit = e and not exists(lit.getValue().toFloat())) - or exists(CastingExpr cast, Type fromtyp | cast = e and fromtyp = cast.getSourceType() and From 34fe1a8f5e3ef8fbe564a370786e8ace3c7a06fc Mon Sep 17 00:00:00 2001 From: erik-krogh Date: Mon, 6 Feb 2023 16:14:24 +0100 Subject: [PATCH 067/143] use SSA in the GetLaterAccess module --- .../semmle/javascript/GlobalAccessPaths.qll | 31 ++++++++++++------- .../UnsafeCodeConstruction.expected | 8 +++++ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll b/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll index dc28e44ecdd..01ce360f3b5 100644 --- a/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll +++ b/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll @@ -270,6 +270,16 @@ module AccessPath { /** A module for computing an access to a variable that happens after a property has been written onto it */ private module GetLaterAccess { + /** + * Gets an reference to the SSA variable `variable`. + * Either the definition or a use of the SSA variable + */ + private VarRef getAVariableRef(SsaVariable variable) { + result = variable.getAUse() + or + result = variable.getDefinition().(SsaExplicitDefinition).getDef().getTarget() + } + /** * Gets an access to a variable that is written to in `write`, where the access is after the write. * @@ -286,7 +296,7 @@ module AccessPath { pragma[noopt] DataFlow::Node getLaterBaseAccess(DataFlow::PropWrite write) { exists( - ControlFlowNode writeNode, BindingPattern access, VarRef otherAccess, Variable variable, + ControlFlowNode writeNode, BindingPattern access, VarRef otherAccess, SsaVariable variable, StmtContainer container | access = getBaseVar(write) and @@ -323,24 +333,23 @@ module AccessPath { } /** Gets an access to `var` inside `container` where `usedInWrite` indicates whether the access is the base of a property write. */ - private VarRef getAnAccessInContainer(Variable var, StmtContainer container, boolean usedInWrite) { - result.getVariable() = var and + private VarRef getAnAccessInContainer( + SsaVariable var, StmtContainer container, boolean usedInWrite + ) { + result = getAVariableRef(var) and result.getContainer() = container and - var.isLocal() and if result = getBaseVar(_) then usedInWrite = true else usedInWrite = false } /** Gets a variable that is relevant for the computations in the `GetLaterAccess` module. */ - private Variable getARelevantVariable() { + private SsaVariable getARelevantVariable() { // The variable might be used where `getLaterBaseAccess()` is called. exists(DataFlow::Node node | exists(fromRhs(node, _)) and - node.asExpr().(VarAccess).getVariable() = result + node.asExpr() = getAVariableRef(result) ) and // There is a write that writes to the variable. - getBaseVar(_).getVariable() = result and - // It's local. - result.isLocal() and // we skip global variables, because that turns messy quick. + getBaseVar(_) = getAVariableRef(result) and // There is both a "write" and "read" in the same container of the variable. exists(StmtContainer container | exists(getAnAccessInContainer(result, container, true)) and // a "write", an access to the variable that is the base of a property reference. @@ -350,9 +359,9 @@ module AccessPath { /** Gets a basic-block that has a read of the variable that is written to by `write`, where the basicblock occurs after `start`. */ private ReachableBasicBlock getASuccessorBBThatReadsVar(DataFlow::PropWrite write) { - exists(VarAccess baseExpr, Variable var, ControlFlowNode writeNode | + exists(VarRef baseExpr, SsaVariable var, ControlFlowNode writeNode | baseExpr = getBaseVar(write) and - var = baseExpr.getVariable() and + getAVariableRef(var) = baseExpr and var = getARelevantVariable() and writeNode = write.getWriteNode() and writeNode.getBasicBlock().(ReachableBasicBlock).strictlyDominates(result) and 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 index 14733b4274d..725c600ecaa 100644 --- a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/UnsafeCodeConstruction.expected +++ b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/UnsafeCodeConstruction.expected @@ -42,8 +42,11 @@ nodes | lib/index.js:112:17:112:21 | taint | | lib/index.js:112:17:112:21 | taint | | lib/index.js:113:20:113:24 | taint | +| lib/index.js:115:38:115:42 | taint | | lib/index.js:121:34:121:38 | taint | | lib/index.js:129:32:129:36 | taint | +| lib/index.js:135:23:135:49 | this.op ... dOption | +| lib/index.js:135:23:135:49 | this.op ... dOption | | lib/index.js:136:23:136:49 | this.op ... dOption | | lib/index.js:136:23:136:49 | this.op ... dOption | | lib/index.js:137:23:137:49 | this.op ... dOption | @@ -94,12 +97,16 @@ edges | lib/index.js:98:30:98:34 | taint | lib/index.js:105:21:105:47 | this.op ... dOption | | lib/index.js:112:17:112:21 | taint | lib/index.js:113:20:113:24 | taint | | lib/index.js:112:17:112:21 | taint | lib/index.js:113:20:113:24 | taint | +| lib/index.js:112:17:112:21 | taint | lib/index.js:115:38:115:42 | taint | +| lib/index.js:112:17:112:21 | taint | lib/index.js:115:38:115:42 | taint | | lib/index.js:112:17:112:21 | taint | lib/index.js:121:34:121:38 | taint | | lib/index.js:112:17:112:21 | taint | lib/index.js:121:34:121:38 | taint | | lib/index.js:112:17:112:21 | taint | lib/index.js:129:32:129:36 | taint | | lib/index.js:112:17:112:21 | taint | lib/index.js:129:32:129:36 | taint | | lib/index.js:113:20:113:24 | taint | lib/index.js:138:23:138:32 | this.taint | | lib/index.js:113:20:113:24 | taint | lib/index.js:138:23:138:32 | this.taint | +| lib/index.js:115:38:115:42 | taint | lib/index.js:135:23:135:49 | this.op ... dOption | +| lib/index.js:115:38:115:42 | taint | lib/index.js:135:23:135:49 | this.op ... dOption | | lib/index.js:121:34:121:38 | taint | lib/index.js:136:23:136:49 | this.op ... dOption | | lib/index.js:121:34:121:38 | taint | lib/index.js:136:23:136:49 | this.op ... dOption | | lib/index.js:129:32:129:36 | taint | lib/index.js:137:23:137:49 | this.op ... dOption | @@ -114,6 +121,7 @@ edges | lib/index.js:104:21:104:47 | this.op ... dOption | lib/index.js:86:15:86:19 | taint | lib/index.js:104:21:104:47 | this.op ... dOption | This string concatenation which depends on $@ is later $@. | lib/index.js:86:15:86:19 | taint | library input | lib/index.js:104:10:104:67 | " var ... ing();" | interpreted as code | | lib/index.js:105:21:105:47 | this.op ... dOption | lib/index.js:86:15:86:19 | taint | lib/index.js:105:21:105:47 | this.op ... dOption | This string concatenation which depends on $@ is later $@. | lib/index.js:86:15:86:19 | taint | library input | lib/index.js:105:10:105:67 | " var ... ing();" | interpreted as code | | lib/index.js:106:21:106:30 | this.taint | lib/index.js:86:15:86:19 | taint | lib/index.js:106:21:106:30 | this.taint | This string concatenation which depends on $@ is later $@. | lib/index.js:86:15:86:19 | taint | library input | lib/index.js:106:10:106:50 | " var ... ing();" | interpreted as code | +| lib/index.js:135:23:135:49 | this.op ... dOption | lib/index.js:112:17:112:21 | taint | lib/index.js:135:23:135:49 | this.op ... dOption | This string concatenation which depends on $@ is later $@. | lib/index.js:112:17:112:21 | taint | library input | lib/index.js:135:12:135:69 | " var ... ing();" | interpreted as code | | lib/index.js:136:23:136:49 | this.op ... dOption | lib/index.js:112:17:112:21 | taint | lib/index.js:136:23:136:49 | this.op ... dOption | This string concatenation which depends on $@ is later $@. | lib/index.js:112:17:112:21 | taint | library input | lib/index.js:136:12:136:69 | " var ... ing();" | interpreted as code | | lib/index.js:137:23:137:49 | this.op ... dOption | lib/index.js:112:17:112:21 | taint | lib/index.js:137:23:137:49 | this.op ... dOption | This string concatenation which depends on $@ is later $@. | lib/index.js:112:17:112:21 | taint | library input | lib/index.js:137:12:137:69 | " var ... ing();" | interpreted as code | | lib/index.js:138:23:138:32 | this.taint | lib/index.js:112:17:112:21 | taint | lib/index.js:138:23:138:32 | this.taint | This string concatenation which depends on $@ is later $@. | lib/index.js:112:17:112:21 | taint | library input | lib/index.js:138:12:138:52 | " var ... ing();" | interpreted as code | From 070468ab6824245a820dde290fd21bb30da11020 Mon Sep 17 00:00:00 2001 From: erik-krogh Date: Mon, 20 Mar 2023 12:03:32 +0100 Subject: [PATCH 068/143] fix performance --- .../semmle/javascript/GlobalAccessPaths.qll | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll b/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll index 01ce360f3b5..8197ef276ec 100644 --- a/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll +++ b/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll @@ -275,9 +275,12 @@ module AccessPath { * Either the definition or a use of the SSA variable */ private VarRef getAVariableRef(SsaVariable variable) { - result = variable.getAUse() - or - result = variable.getDefinition().(SsaExplicitDefinition).getDef().getTarget() + ( + result = variable.getAUse() + or + result = variable.getDefinition().(SsaExplicitDefinition).getDef().getTarget() + ) and + variable = getARelevantVariableSimple() } /** @@ -341,13 +344,24 @@ module AccessPath { if result = getBaseVar(_) then usedInWrite = true else usedInWrite = false } - /** Gets a variable that is relevant for the computations in the `GetLaterAccess` module. */ - private SsaVariable getARelevantVariable() { + /** + * Gets a variable that is relevant for the computations in the `GetLaterAccess` module. + * This predicate restricts as much as it can, but without depending on `getAVariableRef`. + */ + pragma[inline] + private SsaVariable getARelevantVariableSimple() { // The variable might be used where `getLaterBaseAccess()` is called. exists(DataFlow::Node node | exists(fromRhs(node, _)) and - node.asExpr() = getAVariableRef(result) - ) and + node.asExpr() = result.getAUse() + ) + } + + /** + * Gets a variable that is relevant for the computations in the `GetLaterAccess` module. + * This predicate depends on `getAVariableRef`, which in turn depends on `getARelevantVariableSimple`. + */ + private SsaVariable getARelevantVariable() { // There is a write that writes to the variable. getBaseVar(_) = getAVariableRef(result) and // There is both a "write" and "read" in the same container of the variable. @@ -364,7 +378,7 @@ module AccessPath { getAVariableRef(var) = baseExpr and var = getARelevantVariable() and writeNode = write.getWriteNode() and - writeNode.getBasicBlock().(ReachableBasicBlock).strictlyDominates(result) and + result.getImmediateDominator+() = writeNode.getBasicBlock() and // manual magic. result = getAnAccessInContainer(getARelevantVariable(), _, false).getBasicBlock() ) From c023af7308931792cd2e871dbf80f570c5f28205 Mon Sep 17 00:00:00 2001 From: erik-krogh Date: Tue, 21 Mar 2023 11:43:25 +0100 Subject: [PATCH 069/143] manual recursion, and other join-order --- javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll b/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll index 8197ef276ec..bf17def1cfa 100644 --- a/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll +++ b/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll @@ -316,7 +316,7 @@ module AccessPath { i < j ) or - otherAccess.getBasicBlock() = getASuccessorBBThatReadsVar(write) // more manual magic - outlined into a helper predicate. + otherAccess.getBasicBlock() = getASuccessorBBThatReadsVar(write) ) } @@ -378,10 +378,10 @@ module AccessPath { getAVariableRef(var) = baseExpr and var = getARelevantVariable() and writeNode = write.getWriteNode() and - result.getImmediateDominator+() = writeNode.getBasicBlock() and - // manual magic. - result = getAnAccessInContainer(getARelevantVariable(), _, false).getBasicBlock() + result.getImmediateDominator() = writeNode.getBasicBlock() ) + or + result.getImmediateDominator() = getASuccessorBBThatReadsVar(write) // more manual magic - outlined into a helper predicate. } } From 29f78624661f3a22baa867f4caca0bfa89d75089 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 21 Mar 2023 14:56:10 +0000 Subject: [PATCH 070/143] Swift: Add a test for getFullName. --- .../abstractfunctiondecl.expected | 15 ++++++++------- .../abstractfunctiondecl/abstractfunctiondecl.ql | 4 ++++ .../abstractfunctiondecl.swift | 7 +++++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.expected b/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.expected index 649de8dd622..d8723c0068e 100644 --- a/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.expected +++ b/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.expected @@ -1,8 +1,9 @@ | abstractfunctiondecl.swift:2:1:2:15 | func1() | getName:func1(), hasName:func1() | -| abstractfunctiondecl.swift:5:2:5:16 | func2() | MethodDecl, getName:func2(), hasName:func2(), hasQualifiedName(2):Class1.func2(), hasQualifiedName(3):abstractfunctiondecl.Class1.func2() | -| abstractfunctiondecl.swift:8:3:8:17 | func3() | MethodDecl, getName:func3(), hasName:func3(), hasQualifiedName(2):Class1.Class2.func3(), hasQualifiedName(3):abstractfunctiondecl.Class1.Class2.func3() | -| abstractfunctiondecl.swift:13:2:13:13 | func4() | MethodDecl, getName:func4(), hasName:func4(), hasQualifiedName(2):Protocol1.func4(), hasQualifiedName(3):abstractfunctiondecl.Protocol1.func4() | -| abstractfunctiondecl.swift:17:2:17:16 | func4() | MethodDecl, getName:func4(), hasName:func4(), hasQualifiedName(2):Class3.func4(), hasQualifiedName(3):abstractfunctiondecl.Class3.func4() | -| abstractfunctiondecl.swift:21:2:21:16 | func5() | MethodDecl, getName:func5(), hasName:func5(), hasQualifiedName(2):Class3.func5(), hasQualifiedName(3):abstractfunctiondecl.Class3.func5() | -| abstractfunctiondecl.swift:25:2:25:16 | func6() | MethodDecl, getName:func6(), hasName:func6(), hasQualifiedName(2):Struct1.func6(), hasQualifiedName(3):abstractfunctiondecl.Struct1.func6() | -| abstractfunctiondecl.swift:31:2:31:16 | func7() | MethodDecl, getName:func7(), hasName:func7(), hasQualifiedName(2):Enum1.func7(), hasQualifiedName(3):abstractfunctiondecl.Enum1.func7() | +| abstractfunctiondecl.swift:5:2:5:16 | func2() | MethodDecl, getName:func2(), hasName:func2(), hasQualifiedName(2):Class1.func2(), hasQualifiedName(3):abstractfunctiondecl.Class1.func2(), memberOf:Class1 | +| abstractfunctiondecl.swift:8:3:8:17 | func3() | MethodDecl, getName:func3(), hasName:func3(), hasQualifiedName(2):Class1.Class2.func3(), hasQualifiedName(3):abstractfunctiondecl.Class1.Class2.func3(), memberOf:Class1.Class2 | +| abstractfunctiondecl.swift:13:2:13:13 | func4() | MethodDecl, getName:func4(), hasName:func4(), hasQualifiedName(2):Protocol1.func4(), hasQualifiedName(3):abstractfunctiondecl.Protocol1.func4(), memberOf:Protocol1 | +| abstractfunctiondecl.swift:17:2:17:16 | func4() | MethodDecl, getName:func4(), hasName:func4(), hasQualifiedName(2):Class3.func4(), hasQualifiedName(3):abstractfunctiondecl.Class3.func4(), memberOf:Class3 | +| abstractfunctiondecl.swift:21:2:21:16 | func5() | MethodDecl, getName:func5(), hasName:func5(), hasQualifiedName(2):Class3.func5(), hasQualifiedName(3):abstractfunctiondecl.Class3.func5(), memberOf:Class3 | +| abstractfunctiondecl.swift:25:2:25:16 | func6() | MethodDecl, getName:func6(), hasName:func6(), hasQualifiedName(2):Struct1.func6(), hasQualifiedName(3):abstractfunctiondecl.Struct1.func6(), memberOf:Struct1 | +| abstractfunctiondecl.swift:31:2:31:16 | func7() | MethodDecl, getName:func7(), hasName:func7(), hasQualifiedName(2):Enum1.func7(), hasQualifiedName(3):abstractfunctiondecl.Enum1.func7(), memberOf:Enum1 | +| abstractfunctiondecl.swift:37:3:37:17 | func8() | MethodDecl, getName:func8(), hasName:func8(), hasQualifiedName(2):Class4.func8(), hasQualifiedName(3):abstractfunctiondecl.Class4.func8(), memberOf:Class4 | diff --git a/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.ql b/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.ql index e3b3290890d..acd05cc4438 100644 --- a/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.ql +++ b/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.ql @@ -19,6 +19,10 @@ string describe(AbstractFunctionDecl f) { f.(MethodDecl).hasQualifiedName(a, b, c) and result = "hasQualifiedName(3):" + a + "." + b + "." + c ) + or + exists(Decl td | td.getAMember() = f | + result = "memberOf:" + td.asNominalTypeDecl().getFullName() + ) } from AbstractFunctionDecl f diff --git a/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.swift b/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.swift index 881fb93b5c2..3e0cb330708 100644 --- a/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.swift +++ b/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.swift @@ -30,3 +30,10 @@ enum Enum1 { case case2 func func7() {} } + +extension Class1 +{ + class Class4 { + func func8() {} + } +} From 91c324ea4fec1abd06057032b62b68a1e7e20bfe Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 21 Mar 2023 14:36:21 +0000 Subject: [PATCH 071/143] Swift: Fix for getFullName. --- swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll | 3 +++ .../decl/abstractfunctiondecl/abstractfunctiondecl.expected | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll b/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll index 6c2b446a422..8a49256078f 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll @@ -28,8 +28,11 @@ class TypeDecl extends Generated::TypeDecl { cached string getFullName() { not this.getEnclosingDecl() instanceof TypeDecl and + not this.getEnclosingDecl() instanceof ExtensionDecl and result = this.getName() or result = this.getEnclosingDecl().(TypeDecl).getFullName() + "." + this.getName() + or + result = this.getEnclosingDecl().(ExtensionDecl).getExtendedTypeDecl().getFullName() + "." + this.getName() } } diff --git a/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.expected b/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.expected index d8723c0068e..49d4c192730 100644 --- a/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.expected +++ b/swift/ql/test/library-tests/elements/decl/abstractfunctiondecl/abstractfunctiondecl.expected @@ -6,4 +6,4 @@ | abstractfunctiondecl.swift:21:2:21:16 | func5() | MethodDecl, getName:func5(), hasName:func5(), hasQualifiedName(2):Class3.func5(), hasQualifiedName(3):abstractfunctiondecl.Class3.func5(), memberOf:Class3 | | abstractfunctiondecl.swift:25:2:25:16 | func6() | MethodDecl, getName:func6(), hasName:func6(), hasQualifiedName(2):Struct1.func6(), hasQualifiedName(3):abstractfunctiondecl.Struct1.func6(), memberOf:Struct1 | | abstractfunctiondecl.swift:31:2:31:16 | func7() | MethodDecl, getName:func7(), hasName:func7(), hasQualifiedName(2):Enum1.func7(), hasQualifiedName(3):abstractfunctiondecl.Enum1.func7(), memberOf:Enum1 | -| abstractfunctiondecl.swift:37:3:37:17 | func8() | MethodDecl, getName:func8(), hasName:func8(), hasQualifiedName(2):Class4.func8(), hasQualifiedName(3):abstractfunctiondecl.Class4.func8(), memberOf:Class4 | +| abstractfunctiondecl.swift:37:3:37:17 | func8() | MethodDecl, getName:func8(), hasName:func8(), hasQualifiedName(2):Class1.Class4.func8(), hasQualifiedName(3):abstractfunctiondecl.Class1.Class4.func8(), memberOf:Class1.Class4 | From 12b75e7be12c961162f97683635b49474e2a1cd6 Mon Sep 17 00:00:00 2001 From: Alexandre Boulgakov Date: Tue, 21 Mar 2023 16:02:38 +0000 Subject: [PATCH 072/143] Swift: Cleanup: Remove some unused #includes. --- swift/extractor/main.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/swift/extractor/main.cpp b/swift/extractor/main.cpp index 8220f8a1164..bb4f1d775c2 100644 --- a/swift/extractor/main.cpp +++ b/swift/extractor/main.cpp @@ -1,5 +1,3 @@ -#include -#include #include #include #include @@ -18,7 +16,6 @@ #include "swift/extractor/invocation/SwiftInvocationExtractor.h" #include "swift/extractor/trap/TrapDomain.h" #include "swift/extractor/infra/file/Path.h" -#include using namespace std::string_literals; From 0408e9dc2dbdf09a39ae0b122e3ef98b9de3042d Mon Sep 17 00:00:00 2001 From: Ed Minnix Date: Tue, 21 Mar 2023 15:28:16 -0400 Subject: [PATCH 073/143] Fix formatting of TypeDecl.qll --- swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll b/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll index 8a49256078f..75189283435 100644 --- a/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll +++ b/swift/ql/lib/codeql/swift/elements/decl/TypeDecl.qll @@ -33,6 +33,8 @@ class TypeDecl extends Generated::TypeDecl { or result = this.getEnclosingDecl().(TypeDecl).getFullName() + "." + this.getName() or - result = this.getEnclosingDecl().(ExtensionDecl).getExtendedTypeDecl().getFullName() + "." + this.getName() + result = + this.getEnclosingDecl().(ExtensionDecl).getExtendedTypeDecl().getFullName() + "." + + this.getName() } } From 4fc5742a62a052878a87afa0f9fffa308187fd80 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Mar 2023 00:14:41 +0000 Subject: [PATCH 074/143] Add changed framework coverage reports --- java/documentation/library-coverage/coverage.csv | 10 ++++++---- java/documentation/library-coverage/coverage.rst | 8 ++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/java/documentation/library-coverage/coverage.csv b/java/documentation/library-coverage/coverage.csv index 84e5a0db8eb..c0dcc806c02 100644 --- a/java/documentation/library-coverage/coverage.csv +++ b/java/documentation/library-coverage/coverage.csv @@ -52,19 +52,20 @@ jakarta.ws.rs.core,2,,149,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,94,55 java.beans,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, java.io,42,,40,,17,,,,,,,,,,,,,,,3,,,,,,,,,,,,,22,,,,,,,,39,1 java.lang,16,,76,,,,,,,,,,,,8,,,,,3,,4,,,1,,,,,,,,,,,,,,,,53,23 -java.net,12,3,16,,,,,,,,,,,,,,,12,,,,,,,,,,,,,,,,,,,,,,3,16, -java.nio,20,,16,,15,,,,,,,,,,,,,,,3,,,,,,,,,,,,,2,,,,,,,,16, +java.net,12,3,17,,,,,,,,,,,,,,,12,,,,,,,,,,,,,,,,,,,,,,3,17, +java.nio,25,,29,,19,,,,,,,,,,,,,,,4,,,,,,,,,,,,,2,,,,,,,,29, java.sql,13,,2,,,,,,,,4,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,1,1 java.util,44,,465,,,,,,,,,,,,34,,,,,,,,5,2,,1,2,,,,,,,,,,,,,,38,427 javafx.scene.web,1,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,, javax.faces.context,2,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,7,, +javax.imageio.stream,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1, javax.jms,,9,57,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,57, javax.json,,,123,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,100,23 javax.management.remote,2,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,, -javax.naming,7,,,,,,,,,,,,6,1,,,,,,,,,,,,,,,,,,,,,,,,,,,, +javax.naming,7,,1,,,,,,,,,,6,1,,,,,,,,,,,,,,,,,,,,,,,,,,,1, javax.net.ssl,2,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,, javax.script,1,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,, -javax.servlet,4,21,2,,,,,3,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,21,2, +javax.servlet,5,21,2,,,,,3,1,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,21,2, javax.validation,1,1,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,, javax.ws.rs.client,1,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,, javax.ws.rs.container,,9,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,9,, @@ -108,6 +109,7 @@ org.apache.velocity.runtime,4,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4,,,,,,,,,,,, org.codehaus.cargo.container.installer,3,,,,2,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,, org.codehaus.groovy.control,1,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, org.dom4j,20,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,20,,,,,,,, +org.geogebra.web.full.main,1,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1,,,,,,,,,, org.hibernate,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,7,,,,,,,,,,,,, org.jboss.logging,324,,,,,,,,,,,,,,324,,,,,,,,,,,,,,,,,,,,,,,,,,, org.jdbi.v3.core,6,,,,,,,,,,6,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/java/documentation/library-coverage/coverage.rst b/java/documentation/library-coverage/coverage.rst index cc6fdb875ff..01b16e25a87 100644 --- a/java/documentation/library-coverage/coverage.rst +++ b/java/documentation/library-coverage/coverage.rst @@ -18,10 +18,10 @@ Java framework & library support `Google Guava `_,``com.google.common.*``,,730,39,,6,,,,, JBoss Logging,``org.jboss.logging``,,,324,,,,,,, `JSON-java `_,``org.json``,,236,,,,,,,, - Java Standard Library,``java.*``,3,616,147,32,,,9,,,12 - Java extensions,"``javax.*``, ``jakarta.*``",63,609,33,1,,4,,1,1,2 + Java Standard Library,``java.*``,3,630,152,36,,,9,,,12 + Java extensions,"``javax.*``, ``jakarta.*``",63,611,34,1,,4,,1,1,2 Kotlin Standard Library,``kotlin*``,,1835,12,10,,,,,,2 `Spring `_,``org.springframework.*``,29,480,101,,,,19,14,,29 - Others,"``cn.hutool.core.codec``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.fasterxml.jackson.core``, ``com.fasterxml.jackson.databind``, ``com.hubspot.jinjava``, ``com.mitchellbosecke.pebble``, ``com.opensymphony.xwork2.ognl``, ``com.rabbitmq.client``, ``com.thoughtworks.xstream``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``freemarker.cache``, ``freemarker.template``, ``groovy.lang``, ``groovy.util``, ``hudson.model``, ``hudson.os``, ``hudson.remoting``, ``hudson.util``, ``io.netty.bootstrap``, ``io.netty.channel``, ``io.netty.handler.codec.http``, ``io.netty.handler.ssl``, ``io.netty.handler.stream``, ``io.netty.resolver``, ``io.netty.util.internal``, ``javafx.scene.web``, ``jodd.json``, ``net.sf.saxon.s9api``, ``ognl``, ``okhttp3``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.logging``, ``org.apache.commons.ognl``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.log4j``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.apache.velocity.app``, ``org.apache.velocity.runtime``, ``org.codehaus.cargo.container.installer``, ``org.codehaus.groovy.control``, ``org.dom4j``, ``org.hibernate``, ``org.jdbi.v3.core``, ``org.jooq``, ``org.kohsuke.stapler``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.scijava.log``, ``org.slf4j``, ``org.thymeleaf``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``retrofit2``",60,314,327,12,,,18,18,,28 - Totals,,217,8491,1640,146,6,10,113,33,1,113 + Others,"``cn.hutool.core.codec``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.fasterxml.jackson.core``, ``com.fasterxml.jackson.databind``, ``com.hubspot.jinjava``, ``com.mitchellbosecke.pebble``, ``com.opensymphony.xwork2.ognl``, ``com.rabbitmq.client``, ``com.thoughtworks.xstream``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``freemarker.cache``, ``freemarker.template``, ``groovy.lang``, ``groovy.util``, ``hudson.model``, ``hudson.os``, ``hudson.remoting``, ``hudson.util``, ``io.netty.bootstrap``, ``io.netty.channel``, ``io.netty.handler.codec.http``, ``io.netty.handler.ssl``, ``io.netty.handler.stream``, ``io.netty.resolver``, ``io.netty.util.internal``, ``javafx.scene.web``, ``jodd.json``, ``net.sf.saxon.s9api``, ``ognl``, ``okhttp3``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.logging``, ``org.apache.commons.ognl``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.log4j``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.apache.velocity.app``, ``org.apache.velocity.runtime``, ``org.codehaus.cargo.container.installer``, ``org.codehaus.groovy.control``, ``org.dom4j``, ``org.geogebra.web.full.main``, ``org.hibernate``, ``org.jdbi.v3.core``, ``org.jooq``, ``org.kohsuke.stapler``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.scijava.log``, ``org.slf4j``, ``org.thymeleaf``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``retrofit2``",60,314,328,12,,,18,18,,28 + Totals,,217,8507,1647,150,6,10,113,33,1,113 From 6cb134898856d01c7631b1e5d3e18252ac303d6d Mon Sep 17 00:00:00 2001 From: Harry Maclean Date: Wed, 22 Mar 2023 15:02:36 +1300 Subject: [PATCH 075/143] Ruby: Try different workaround for Actions bug --- .github/workflows/ruby-build.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ruby-build.yml b/.github/workflows/ruby-build.yml index 1445d0c6589..f7314e5d4a5 100644 --- a/.github/workflows/ruby-build.yml +++ b/.github/workflows/ruby-build.yml @@ -262,29 +262,28 @@ jobs: - name: Fetch CodeQL uses: ./.github/actions/fetch-codeql - # Due to a bug in Actions, we can't use runner.temp here. + # Due to a bug in Actions, we can't use runner.temp in the run blocks here. # https://github.com/actions/runner/issues/2185 - - name: Ensure temp directory exists - run: mkdir -p /tmp - name: Download Ruby bundle uses: actions/download-artifact@v3 with: name: codeql-ruby-bundle - path: /tmp + path: ${{ runner.temp }} - name: Unzip Ruby bundle shell: bash run: unzip -q -d /tmp/ruby-bundle /tmp/codeql-ruby-bundle.zip + run: unzip -q -d "$RUNNER_TEMP"/ruby-bundle "$RUNNER_TEMP"/codeql-ruby-bundle.zip - name: Run QL test shell: bash run: | - codeql test run --search-path /tmp/ruby-bundle --additional-packs /tmp/ruby-bundle ruby/ql/test/library-tests/ast/constants/ + codeql test run --search-path "$RUNNER_TEMP"/ruby-bundle --additional-packs "$RUNNER_TEMP"/ruby-bundle ruby/ql/test/library-tests/ast/constants/ - name: Create database shell: bash run: | - codeql database create --search-path /tmp/ruby-bundle --language ruby --source-root ruby/ql/test/library-tests/ast/constants/ ../database + codeql database create --search-path "$RUNNER_TEMP"/ruby-bundle --language ruby --source-root ruby/ql/test/library-tests/ast/constants/ ../database - name: Analyze database shell: bash run: | - codeql database analyze --search-path /tmp/ruby-bundle --format=sarifv2.1.0 --output=out.sarif ../database ruby-code-scanning.qls + codeql database analyze --search-path "$RUNNER_TEMP"/ruby-bundle --format=sarifv2.1.0 --output=out.sarif ../database ruby-code-scanning.qls From b7600c6022f83e579f0372ba1e22808a080ddba4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Mar 2023 04:06:21 +0000 Subject: [PATCH 076/143] Bump regex from 1.7.1 to 1.7.2 in /ql Bumps [regex](https://github.com/rust-lang/regex) from 1.7.1 to 1.7.2. - [Release notes](https://github.com/rust-lang/regex/releases) - [Changelog](https://github.com/rust-lang/regex/blob/master/CHANGELOG.md) - [Commits](https://github.com/rust-lang/regex/compare/1.7.1...1.7.2) --- updated-dependencies: - dependency-name: regex dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- ql/Cargo.lock | Bin 22516 -> 22516 bytes ql/buramu/Cargo.toml | 2 +- ql/extractor/Cargo.toml | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ql/Cargo.lock b/ql/Cargo.lock index 08d54ab697a6dbee77aecea32f35fb61f382395c..f1428bd8beaef8845004c2df1c2df279e95c1e92 100644 GIT binary patch delta 163 zcmV~$u@S;B3;@8(640fh<|J9Rl?r;AtYAr250d~HB-~{VhT$#)@V~Faz7C%+yx#N0 ztYeYrjl@%j9GFGDajwMzOqe|bXEicQg&-QxMBTG$7UboAK5P%X4NDv6YhWQO?o|O~ n671{@gwU)JD62zETEN;w6``O)jVd|SN)*&_`HjcT)ARHPr@%2_ delta 167 zcmWm6%?-jZ3_xLJiuS~b0UXCpoD1U4ff<}155OdqI!KW^2SYFdQU@TtywlTnZ0^|H z`vcCe-}!kXQB_VPWz<{ATpL#53fUrN^xT5RUVA1isvaOSs6o&`meysS_LqM+C#QBN sjx|CkJ#=X_P)KOxAp@MCnvZ0qc5EatW@G4m@W_^{kgUJUw70Na|0dotr2qf` diff --git a/ql/buramu/Cargo.toml b/ql/buramu/Cargo.toml index c7e1918975d..b12e6d9a9c6 100644 --- a/ql/buramu/Cargo.toml +++ b/ql/buramu/Cargo.toml @@ -9,4 +9,4 @@ edition = "2018" lazy_static = "1.4.0" chrono = "0.4.24" rayon = "1.7.0" -regex = "1.7.1" +regex = "1.7.2" diff --git a/ql/extractor/Cargo.toml b/ql/extractor/Cargo.toml index 308953d1f8f..e7dc17f2feb 100644 --- a/ql/extractor/Cargo.toml +++ b/ql/extractor/Cargo.toml @@ -20,4 +20,4 @@ tracing = "0.1" tracing-subscriber = { version = "0.3.16", features = ["env-filter"] } rayon = "1.7.0" num_cpus = "1.14.0" -regex = "1.7.1" +regex = "1.7.2" From 46ef954d5cfbd815755d47fb469707000ddae7e4 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 21 Mar 2023 10:50:26 +0100 Subject: [PATCH 077/143] Java: Validate all accesspaths except for Field. --- .../semmle/code/java/dataflow/ExternalFlow.qll | 12 +++++++----- .../external-models/validatemodels.expected | 0 .../dataflow/external-models/validatemodels.ql | 15 +++++++++++++++ 3 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 java/ql/test/library-tests/dataflow/external-models/validatemodels.expected create mode 100644 java/ql/test/library-tests/dataflow/external-models/validatemodels.ql diff --git a/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll b/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll index a736928361c..39d5bd27311 100644 --- a/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll +++ b/java/ql/lib/semmle/code/java/dataflow/ExternalFlow.qll @@ -220,7 +220,7 @@ predicate modelCoverage(string package, int pkgs, string kind, string part, int /** Provides a query predicate to check the MaD models for validation errors. */ module ModelValidation { private string getInvalidModelInput() { - exists(string pred, string input, string part | + exists(string pred, AccessPath input, AccessPathToken part | sinkModel(_, _, _, _, _, _, input, _, _) and pred = "sink" or summaryModel(_, _, _, _, _, _, input, _, _, _) and pred = "summary" @@ -229,9 +229,10 @@ module ModelValidation { invalidSpecComponent(input, part) and not part = "" and not (part = "Argument" and pred = "sink") and - not parseArg(part, _) + not parseArg(part, _) and + not part.getName() = "Field" or - part = input.(AccessPath).getToken(0) and + part = input.getToken(0) and parseParam(part, _) or invalidIndexComponent(input, part) @@ -241,7 +242,7 @@ module ModelValidation { } private string getInvalidModelOutput() { - exists(string pred, string output, string part | + exists(string pred, AccessPath output, AccessPathToken part | sourceModel(_, _, _, _, _, _, output, _, _) and pred = "source" or summaryModel(_, _, _, _, _, _, _, output, _, _) and pred = "summary" @@ -249,7 +250,8 @@ module ModelValidation { ( invalidSpecComponent(output, part) and not part = "" and - not (part = ["Argument", "Parameter"] and pred = "source") + not (part = ["Argument", "Parameter"] and pred = "source") and + not part.getName() = "Field" or invalidIndexComponent(output, part) ) and diff --git a/java/ql/test/library-tests/dataflow/external-models/validatemodels.expected b/java/ql/test/library-tests/dataflow/external-models/validatemodels.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/java/ql/test/library-tests/dataflow/external-models/validatemodels.ql b/java/ql/test/library-tests/dataflow/external-models/validatemodels.ql new file mode 100644 index 00000000000..84312d3d4e4 --- /dev/null +++ b/java/ql/test/library-tests/dataflow/external-models/validatemodels.ql @@ -0,0 +1,15 @@ +import java +import semmle.code.java.dataflow.ExternalFlow +import semmle.code.java.dataflow.internal.AccessPathSyntax +import ModelValidation + +private predicate getRelevantAccessPath(string path) { + summaryModel(_, _, _, _, _, _, path, _, _, _) or + summaryModel(_, _, _, _, _, _, _, path, _, _) or + sinkModel(_, _, _, _, _, _, path, _, _) or + sourceModel(_, _, _, _, _, _, path, _, _) +} + +private class AccessPathsExternal extends AccessPath::Range { + AccessPathsExternal() { getRelevantAccessPath(this) } +} From 71d184e8c0a4c00fe4ac4bded02765347304a418 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 21 Mar 2023 11:08:33 +0100 Subject: [PATCH 078/143] C#: Validate all access paths except for Field and Property. --- .../semmle/code/csharp/dataflow/ExternalFlow.qll | 10 ++++++---- .../external-models/validatemodels.expected | 0 .../dataflow/external-models/validatemodels.ql | 15 +++++++++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 csharp/ql/test/library-tests/dataflow/external-models/validatemodels.expected create mode 100644 csharp/ql/test/library-tests/dataflow/external-models/validatemodels.ql diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll index 4067ba6e81c..2792c1d180c 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/ExternalFlow.qll @@ -160,7 +160,7 @@ predicate modelCoverage(string namespace, int namespaces, string kind, string pa /** Provides a query predicate to check the MaD models for validation errors. */ module ModelValidation { private string getInvalidModelInput() { - exists(string pred, AccessPath input, string part | + exists(string pred, AccessPath input, AccessPathToken part | sinkModel(_, _, _, _, _, _, input, _, _) and pred = "sink" or summaryModel(_, _, _, _, _, _, input, _, _, _) and pred = "summary" @@ -169,7 +169,8 @@ module ModelValidation { invalidSpecComponent(input, part) and not part = "" and not (part = "Argument" and pred = "sink") and - not parseArg(part, _) + not parseArg(part, _) and + not part.getName() = ["Field", "Property"] or part = input.getToken(_) and parseParam(part, _) @@ -181,7 +182,7 @@ module ModelValidation { } private string getInvalidModelOutput() { - exists(string pred, string output, string part | + exists(string pred, AccessPath output, AccessPathToken part | sourceModel(_, _, _, _, _, _, output, _, _) and pred = "source" or summaryModel(_, _, _, _, _, _, _, output, _, _) and pred = "summary" @@ -189,7 +190,8 @@ module ModelValidation { ( invalidSpecComponent(output, part) and not part = "" and - not (part = ["Argument", "Parameter"] and pred = "source") + not (part = ["Argument", "Parameter"] and pred = "source") and + not part.getName() = ["Field", "Property"] or invalidIndexComponent(output, part) ) and diff --git a/csharp/ql/test/library-tests/dataflow/external-models/validatemodels.expected b/csharp/ql/test/library-tests/dataflow/external-models/validatemodels.expected new file mode 100644 index 00000000000..e69de29bb2d diff --git a/csharp/ql/test/library-tests/dataflow/external-models/validatemodels.ql b/csharp/ql/test/library-tests/dataflow/external-models/validatemodels.ql new file mode 100644 index 00000000000..d9e073ab78e --- /dev/null +++ b/csharp/ql/test/library-tests/dataflow/external-models/validatemodels.ql @@ -0,0 +1,15 @@ +import csharp +import semmle.code.csharp.dataflow.ExternalFlow +import semmle.code.csharp.dataflow.internal.AccessPathSyntax +import ModelValidation + +private predicate getRelevantAccessPath(string path) { + summaryModel(_, _, _, _, _, _, path, _, _, _) or + summaryModel(_, _, _, _, _, _, _, path, _, _) or + sinkModel(_, _, _, _, _, _, path, _, _) or + sourceModel(_, _, _, _, _, _, path, _, _) +} + +private class AccessPathsExternal extends AccessPath::Range { + AccessPathsExternal() { getRelevantAccessPath(this) } +} From bdab57b9d3aafd6c2aeff4ada6c0d19c8cd2a1d7 Mon Sep 17 00:00:00 2001 From: Erik Krogh Kristensen Date: Wed, 22 Mar 2023 10:19:48 +0100 Subject: [PATCH 079/143] Update javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll Co-authored-by: Asger F --- javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll b/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll index bf17def1cfa..888f41e0a71 100644 --- a/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll +++ b/javascript/ql/lib/semmle/javascript/GlobalAccessPaths.qll @@ -381,7 +381,7 @@ module AccessPath { result.getImmediateDominator() = writeNode.getBasicBlock() ) or - result.getImmediateDominator() = getASuccessorBBThatReadsVar(write) // more manual magic - outlined into a helper predicate. + result.getImmediateDominator() = getASuccessorBBThatReadsVar(write) } } From 53d9e4d4eb40240ed4c1086678ccebd448ff1a9d Mon Sep 17 00:00:00 2001 From: erik-krogh Date: Wed, 22 Mar 2023 10:29:30 +0100 Subject: [PATCH 080/143] QL: regen TreeSitter.qll --- ql/ql/src/codeql_ql/ast/internal/TreeSitter.qll | 6 ------ 1 file changed, 6 deletions(-) diff --git a/ql/ql/src/codeql_ql/ast/internal/TreeSitter.qll b/ql/ql/src/codeql_ql/ast/internal/TreeSitter.qll index 1e7bfa71352..d15da37b4f2 100644 --- a/ql/ql/src/codeql_ql/ast/internal/TreeSitter.qll +++ b/ql/ql/src/codeql_ql/ast/internal/TreeSitter.qll @@ -1866,12 +1866,6 @@ module JSON { /** Gets the location of this element. */ final L::Location getLocation() { json_ast_node_info(this, _, _, result) } - predicate hasLocationInfo( - string filepath, int startline, int startcolumn, int endline, int endcolumn - ) { - this.getLocation().hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) - } - /** Gets the parent of this element. */ final AstNode getParent() { json_ast_node_info(this, result, _, _) } From 4bc6a0927d8079f00788d808a058119e2a9989d5 Mon Sep 17 00:00:00 2001 From: erik-krogh Date: Wed, 22 Mar 2023 10:45:50 +0100 Subject: [PATCH 081/143] fix queries that relied on the old TreeSitter.qll --- ql/ql/src/codeql_ql/StructuredLogs.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ql/ql/src/codeql_ql/StructuredLogs.qll b/ql/ql/src/codeql_ql/StructuredLogs.qll index f2e6939f7e6..60ea7e014ed 100644 --- a/ql/ql/src/codeql_ql/StructuredLogs.qll +++ b/ql/ql/src/codeql_ql/StructuredLogs.qll @@ -405,7 +405,7 @@ module KindPredicatesLog { or cand.(InLayer).getComputeRecursiveEvent() = recursive ) and - cand.hasLocationInfo(filepath, startline, _, _, _) + cand.getLocation().hasLocationInfo(filepath, startline, _, _, _) | cand order by filepath, startline ) From 5a3ddcfca69290abd6427b5fd7983fdd96eacf70 Mon Sep 17 00:00:00 2001 From: erik-krogh Date: Wed, 22 Mar 2023 10:53:39 +0100 Subject: [PATCH 082/143] QL: disable the consistency check --- ql/ql/src/queries/diagnostics/EmptyConsistencies.ql | 1 + 1 file changed, 1 insertion(+) diff --git a/ql/ql/src/queries/diagnostics/EmptyConsistencies.ql b/ql/ql/src/queries/diagnostics/EmptyConsistencies.ql index 5009e9370fb..85a65fbfdeb 100644 --- a/ql/ql/src/queries/diagnostics/EmptyConsistencies.ql +++ b/ql/ql/src/queries/diagnostics/EmptyConsistencies.ql @@ -58,6 +58,7 @@ where or ModConsistency::noResolve(node) and msg = "ModConsistency::noResolve" ) and + none() and // disabled for now not node.getLocation() .getFile() .getAbsolutePath() From b000b9b5c0d4a3172b70af69fe02a34432e155e8 Mon Sep 17 00:00:00 2001 From: Alex Ford Date: Wed, 22 Mar 2023 11:12:13 +0000 Subject: [PATCH 083/143] JS: add a missing space in alert message for js/weak-cryptographic-algorithm --- .../ql/src/Security/CWE-327/BrokenCryptoAlgorithm.ql | 2 +- .../Security/CWE-327/BrokenCryptoAlgorithm.expected | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/javascript/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.ql b/javascript/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.ql index 0f7e22b7f57..9826ebefe5f 100644 --- a/javascript/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.ql +++ b/javascript/ql/src/Security/CWE-327/BrokenCryptoAlgorithm.ql @@ -21,4 +21,4 @@ where cfg.hasFlowPath(source, sink) and not source.getNode() instanceof CleartextPasswordExpr // flagged by js/insufficient-password-hash select sink.getNode(), source, sink, "A broken or weak cryptographic algorithm depends on $@.", - source.getNode(), "sensitive data from" + source.getNode().(Source).describe() + source.getNode(), "sensitive data from " + source.getNode().(Source).describe() diff --git a/javascript/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.expected b/javascript/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.expected index ce03e114f4e..1938b020355 100644 --- a/javascript/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.expected +++ b/javascript/ql/test/query-tests/Security/CWE-327/BrokenCryptoAlgorithm.expected @@ -26,8 +26,8 @@ edges | tst.js:19:17:19:24 | password | tst.js:19:17:19:24 | password | | tst.js:22:21:22:30 | secretText | tst.js:22:21:22:30 | secretText | #select -| tst.js:11:17:11:26 | secretText | tst.js:3:18:3:24 | trusted | tst.js:11:17:11:26 | secretText | A broken or weak cryptographic algorithm depends on $@. | tst.js:3:18:3:24 | trusted | sensitive data froman access to trusted | -| tst.js:11:17:11:26 | secretText | tst.js:11:17:11:26 | secretText | tst.js:11:17:11:26 | secretText | A broken or weak cryptographic algorithm depends on $@. | tst.js:11:17:11:26 | secretText | sensitive data froman access to secretText | -| tst.js:17:17:17:25 | o.trusted | tst.js:17:17:17:25 | o.trusted | tst.js:17:17:17:25 | o.trusted | A broken or weak cryptographic algorithm depends on $@. | tst.js:17:17:17:25 | o.trusted | sensitive data froman access to trusted | -| tst.js:22:21:22:30 | secretText | tst.js:3:18:3:24 | trusted | tst.js:22:21:22:30 | secretText | A broken or weak cryptographic algorithm depends on $@. | tst.js:3:18:3:24 | trusted | sensitive data froman access to trusted | -| tst.js:22:21:22:30 | secretText | tst.js:22:21:22:30 | secretText | tst.js:22:21:22:30 | secretText | A broken or weak cryptographic algorithm depends on $@. | tst.js:22:21:22:30 | secretText | sensitive data froman access to secretText | +| tst.js:11:17:11:26 | secretText | tst.js:3:18:3:24 | trusted | tst.js:11:17:11:26 | secretText | A broken or weak cryptographic algorithm depends on $@. | tst.js:3:18:3:24 | trusted | sensitive data from an access to trusted | +| tst.js:11:17:11:26 | secretText | tst.js:11:17:11:26 | secretText | tst.js:11:17:11:26 | secretText | A broken or weak cryptographic algorithm depends on $@. | tst.js:11:17:11:26 | secretText | sensitive data from an access to secretText | +| tst.js:17:17:17:25 | o.trusted | tst.js:17:17:17:25 | o.trusted | tst.js:17:17:17:25 | o.trusted | A broken or weak cryptographic algorithm depends on $@. | tst.js:17:17:17:25 | o.trusted | sensitive data from an access to trusted | +| tst.js:22:21:22:30 | secretText | tst.js:3:18:3:24 | trusted | tst.js:22:21:22:30 | secretText | A broken or weak cryptographic algorithm depends on $@. | tst.js:3:18:3:24 | trusted | sensitive data from an access to trusted | +| tst.js:22:21:22:30 | secretText | tst.js:22:21:22:30 | secretText | tst.js:22:21:22:30 | secretText | A broken or weak cryptographic algorithm depends on $@. | tst.js:22:21:22:30 | secretText | sensitive data from an access to secretText | From bed5eeb3723c41ef1d9845a80176a1736d5e91b8 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Wed, 22 Mar 2023 12:30:15 +0100 Subject: [PATCH 084/143] Apply suggestions from code review --- .github/workflows/ruby-build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ruby-build.yml b/.github/workflows/ruby-build.yml index f7314e5d4a5..da064fce148 100644 --- a/.github/workflows/ruby-build.yml +++ b/.github/workflows/ruby-build.yml @@ -272,7 +272,6 @@ jobs: path: ${{ runner.temp }} - name: Unzip Ruby bundle shell: bash - run: unzip -q -d /tmp/ruby-bundle /tmp/codeql-ruby-bundle.zip run: unzip -q -d "$RUNNER_TEMP"/ruby-bundle "$RUNNER_TEMP"/codeql-ruby-bundle.zip - name: Run QL test From ea626a03b64d41a5c9dee070d1c57b8e5c3fd5b3 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Mon, 20 Mar 2023 16:45:03 -0400 Subject: [PATCH 085/143] Java: add nativeSQL as summary model --- java/ql/lib/ext/java.sql.model.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/java/ql/lib/ext/java.sql.model.yml b/java/ql/lib/ext/java.sql.model.yml index e5516043989..2d4d9ee4321 100644 --- a/java/ql/lib/ext/java.sql.model.yml +++ b/java/ql/lib/ext/java.sql.model.yml @@ -3,6 +3,7 @@ extensions: pack: codeql/java-all extensible: sinkModel data: + # - ["java.sql", "Connection", True, "nativeSQL", "", "", "Argument[0]", "sql", "manual"] - ["java.sql", "Connection", True, "prepareCall", "", "", "Argument[0]", "sql", "manual"] - ["java.sql", "Connection", True, "prepareStatement", "", "", "Argument[0]", "sql", "manual"] - ["java.sql", "DatabaseMetaData", True, "getColumns", "(String,String,String,String)", "", "Argument[2]", "sql", "ai-generated"] @@ -20,6 +21,7 @@ extensions: pack: codeql/java-all extensible: summaryModel data: + - ["java.sql", "Connection", True, "nativeSQL", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.sql", "PreparedStatement", True, "setString", "(int,String)", "", "Argument[1]", "Argument[this]", "value", "manual"] - ["java.sql", "ResultSet", True, "getString", "(String)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - addsTo: From 974f4bc371a31b2a1d4876cff6e3374b72f00442 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Mon, 6 Feb 2023 16:20:07 -0500 Subject: [PATCH 086/143] Java: remove nativeSql sink --- java/ql/lib/ext/java.sql.model.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/java/ql/lib/ext/java.sql.model.yml b/java/ql/lib/ext/java.sql.model.yml index 2d4d9ee4321..bdc13f7da24 100644 --- a/java/ql/lib/ext/java.sql.model.yml +++ b/java/ql/lib/ext/java.sql.model.yml @@ -3,7 +3,6 @@ extensions: pack: codeql/java-all extensible: sinkModel data: - # - ["java.sql", "Connection", True, "nativeSQL", "", "", "Argument[0]", "sql", "manual"] - ["java.sql", "Connection", True, "prepareCall", "", "", "Argument[0]", "sql", "manual"] - ["java.sql", "Connection", True, "prepareStatement", "", "", "Argument[0]", "sql", "manual"] - ["java.sql", "DatabaseMetaData", True, "getColumns", "(String,String,String,String)", "", "Argument[2]", "sql", "ai-generated"] From 82daf50ed46fad7c59ad6e29697565f766cb71d4 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Mon, 20 Mar 2023 16:45:48 -0400 Subject: [PATCH 087/143] Java: add signature --- java/ql/lib/ext/java.sql.model.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/ql/lib/ext/java.sql.model.yml b/java/ql/lib/ext/java.sql.model.yml index bdc13f7da24..def9f5d1863 100644 --- a/java/ql/lib/ext/java.sql.model.yml +++ b/java/ql/lib/ext/java.sql.model.yml @@ -20,7 +20,7 @@ extensions: pack: codeql/java-all extensible: summaryModel data: - - ["java.sql", "Connection", True, "nativeSQL", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["java.sql", "Connection", True, "nativeSQL", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.sql", "PreparedStatement", True, "setString", "(int,String)", "", "Argument[1]", "Argument[this]", "value", "manual"] - ["java.sql", "ResultSet", True, "getString", "(String)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - addsTo: From 5f8d6c3c07f7b3f79cea831ea1ccc855f45b24ba Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Mon, 20 Mar 2023 16:39:49 -0400 Subject: [PATCH 088/143] Java: add change note --- java/ql/lib/change-notes/2023-03-20-nativesql-summary.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 java/ql/lib/change-notes/2023-03-20-nativesql-summary.md diff --git a/java/ql/lib/change-notes/2023-03-20-nativesql-summary.md b/java/ql/lib/change-notes/2023-03-20-nativesql-summary.md new file mode 100644 index 00000000000..8d350f77bd3 --- /dev/null +++ b/java/ql/lib/change-notes/2023-03-20-nativesql-summary.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added a summary model for the `nativeSQL` method of the `java.sql.Connection` interface. From 3f40e3863fc959908495daf0c57389c6b4429b6e Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Wed, 22 Mar 2023 10:51:36 -0400 Subject: [PATCH 089/143] Add yml files to change note check --- .github/workflows/check-change-note.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/check-change-note.yml b/.github/workflows/check-change-note.yml index e951b17b89b..aa255d4cf5a 100644 --- a/.github/workflows/check-change-note.yml +++ b/.github/workflows/check-change-note.yml @@ -8,6 +8,7 @@ on: - "*/ql/src/**/*.qll" - "*/ql/lib/**/*.ql" - "*/ql/lib/**/*.qll" + - "*/ql/lib/**/*.yml" - "!**/experimental/**" - "!ql/**" - "!swift/**" From 59f2c7518653a813f7fab3c992533ba047633933 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 22 Mar 2023 14:53:37 +0000 Subject: [PATCH 090/143] C++: bool -> int conversions are safe conversions. --- .../semmle/code/cpp/semantic/SemanticType.qll | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticType.qll b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticType.qll index ce3f4ed90b4..b86db02702c 100644 --- a/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticType.qll +++ b/cpp/ql/lib/experimental/semmle/code/cpp/semantic/SemanticType.qll @@ -250,16 +250,26 @@ SemType getSemanticType(Specific::Type type) { Specific::unknownType(type) and result = TSemUnknownType() } +private class SemNumericOrBooleanType extends SemSizedType { + SemNumericOrBooleanType() { + this instanceof SemNumericType + or + this instanceof SemBooleanType + } +} + /** * Holds if the conversion from `fromType` to `toType` can never overflow or underflow. */ -predicate conversionCannotOverflow(SemNumericType fromType, SemNumericType toType) { +predicate conversionCannotOverflow(SemNumericOrBooleanType fromType, SemNumericOrBooleanType toType) { // Identity cast fromType = toType or // Treat any cast to an FP type as safe. It can lose precision, but not overflow. toType instanceof SemFloatingPointType and fromType = any(SemNumericType n) or + fromType instanceof SemBooleanType and toType instanceof SemIntegerType + or exists(SemIntegerType fromInteger, SemIntegerType toInteger, int fromSize, int toSize | fromInteger = fromType and toInteger = toType and From cbe5243c89efaf23764ec128a0381037b1273681 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 22 Mar 2023 16:20:45 +0000 Subject: [PATCH 091/143] Swift: Accept test regressions. :( --- .../Security/CWE-259/ConstantPassword.expected | 6 ------ .../Security/CWE-760/ConstantSalt.expected | 6 ------ .../CWE-916/InsufficientHashIterations.expected | 13 ------------- 3 files changed, 25 deletions(-) diff --git a/swift/ql/test/query-tests/Security/CWE-259/ConstantPassword.expected b/swift/ql/test/query-tests/Security/CWE-259/ConstantPassword.expected index 91539ad285b..262f02eeb8b 100644 --- a/swift/ql/test/query-tests/Security/CWE-259/ConstantPassword.expected +++ b/swift/ql/test/query-tests/Security/CWE-259/ConstantPassword.expected @@ -18,8 +18,6 @@ edges | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:107:61:107:61 | myConstPassword | | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:108:97:108:97 | myConstPassword | | test.swift:43:39:43:134 | [...] : | test.swift:51:30:51:30 | constantPassword | -| test.swift:43:39:43:134 | [...] : | test.swift:56:40:56:40 | constantPassword | -| test.swift:43:39:43:134 | [...] : | test.swift:62:40:62:40 | constantPassword | | test.swift:43:39:43:134 | [...] : | test.swift:67:34:67:34 | constantPassword | nodes | rncryptor.swift:69:24:69:24 | abc123 : | semmle.label | abc123 : | @@ -43,8 +41,6 @@ nodes | rncryptor.swift:108:97:108:97 | myConstPassword | semmle.label | myConstPassword | | test.swift:43:39:43:134 | [...] : | semmle.label | [...] : | | test.swift:51:30:51:30 | constantPassword | semmle.label | constantPassword | -| test.swift:56:40:56:40 | constantPassword | semmle.label | constantPassword | -| test.swift:62:40:62:40 | constantPassword | semmle.label | constantPassword | | test.swift:67:34:67:34 | constantPassword | semmle.label | constantPassword | subpaths #select @@ -67,6 +63,4 @@ subpaths | rncryptor.swift:107:61:107:61 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:107:61:107:61 | myConstPassword | The value 'abc123' is used as a constant password. | | rncryptor.swift:108:97:108:97 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:108:97:108:97 | myConstPassword | The value 'abc123' is used as a constant password. | | test.swift:51:30:51:30 | constantPassword | test.swift:43:39:43:134 | [...] : | test.swift:51:30:51:30 | constantPassword | The value '[...]' is used as a constant password. | -| test.swift:56:40:56:40 | constantPassword | test.swift:43:39:43:134 | [...] : | test.swift:56:40:56:40 | constantPassword | The value '[...]' is used as a constant password. | -| test.swift:62:40:62:40 | constantPassword | test.swift:43:39:43:134 | [...] : | test.swift:62:40:62:40 | constantPassword | The value '[...]' is used as a constant password. | | test.swift:67:34:67:34 | constantPassword | test.swift:43:39:43:134 | [...] : | test.swift:67:34:67:34 | constantPassword | The value '[...]' is used as a constant password. | diff --git a/swift/ql/test/query-tests/Security/CWE-760/ConstantSalt.expected b/swift/ql/test/query-tests/Security/CWE-760/ConstantSalt.expected index 633e73c44e5..def58418e9e 100644 --- a/swift/ql/test/query-tests/Security/CWE-760/ConstantSalt.expected +++ b/swift/ql/test/query-tests/Security/CWE-760/ConstantSalt.expected @@ -15,8 +15,6 @@ edges | rncryptor.swift:60:29:60:29 | 0 : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | | rncryptor.swift:60:29:60:29 | 0 : | rncryptor.swift:60:24:60:30 | call to Data.init(_:) : | | test.swift:43:35:43:130 | [...] : | test.swift:51:49:51:49 | constantSalt | -| test.swift:43:35:43:130 | [...] : | test.swift:56:59:56:59 | constantSalt | -| test.swift:43:35:43:130 | [...] : | test.swift:62:59:62:59 | constantSalt | | test.swift:43:35:43:130 | [...] : | test.swift:67:53:67:53 | constantSalt | nodes | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | semmle.label | [summary] to write: return (return) in Data.init(_:) : | @@ -37,8 +35,6 @@ nodes | rncryptor.swift:79:160:79:160 | myConstantSalt2 | semmle.label | myConstantSalt2 | | test.swift:43:35:43:130 | [...] : | semmle.label | [...] : | | test.swift:51:49:51:49 | constantSalt | semmle.label | constantSalt | -| test.swift:56:59:56:59 | constantSalt | semmle.label | constantSalt | -| test.swift:62:59:62:59 | constantSalt | semmle.label | constantSalt | | test.swift:67:53:67:53 | constantSalt | semmle.label | constantSalt | subpaths | rncryptor.swift:59:29:59:29 | abcdef123456 : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | rncryptor.swift:59:24:59:43 | call to Data.init(_:) : | @@ -55,6 +51,4 @@ subpaths | rncryptor.swift:78:135:78:135 | myConstantSalt1 | rncryptor.swift:59:29:59:29 | abcdef123456 : | rncryptor.swift:78:135:78:135 | myConstantSalt1 | The value 'abcdef123456' is used as a constant salt, which is insecure for hashing passwords. | | rncryptor.swift:79:160:79:160 | myConstantSalt2 | rncryptor.swift:60:29:60:29 | 0 : | rncryptor.swift:79:160:79:160 | myConstantSalt2 | The value '0' is used as a constant salt, which is insecure for hashing passwords. | | test.swift:51:49:51:49 | constantSalt | test.swift:43:35:43:130 | [...] : | test.swift:51:49:51:49 | constantSalt | The value '[...]' is used as a constant salt, which is insecure for hashing passwords. | -| test.swift:56:59:56:59 | constantSalt | test.swift:43:35:43:130 | [...] : | test.swift:56:59:56:59 | constantSalt | The value '[...]' is used as a constant salt, which is insecure for hashing passwords. | -| test.swift:62:59:62:59 | constantSalt | test.swift:43:35:43:130 | [...] : | test.swift:62:59:62:59 | constantSalt | The value '[...]' is used as a constant salt, which is insecure for hashing passwords. | | test.swift:67:53:67:53 | constantSalt | test.swift:43:35:43:130 | [...] : | test.swift:67:53:67:53 | constantSalt | The value '[...]' is used as a constant salt, which is insecure for hashing passwords. | diff --git a/swift/ql/test/query-tests/Security/CWE-916/InsufficientHashIterations.expected b/swift/ql/test/query-tests/Security/CWE-916/InsufficientHashIterations.expected index 0e46106d3f2..e217064d1df 100644 --- a/swift/ql/test/query-tests/Security/CWE-916/InsufficientHashIterations.expected +++ b/swift/ql/test/query-tests/Security/CWE-916/InsufficientHashIterations.expected @@ -1,17 +1,4 @@ edges -| test.swift:20:45:20:45 | 99999 : | test.swift:33:22:33:43 | call to getLowIterationCount() : | -| test.swift:33:22:33:43 | call to getLowIterationCount() : | test.swift:37:84:37:84 | lowIterations | -| test.swift:33:22:33:43 | call to getLowIterationCount() : | test.swift:44:84:44:84 | lowIterations | nodes -| test.swift:20:45:20:45 | 99999 : | semmle.label | 99999 : | -| test.swift:33:22:33:43 | call to getLowIterationCount() : | semmle.label | call to getLowIterationCount() : | -| test.swift:37:84:37:84 | lowIterations | semmle.label | lowIterations | -| test.swift:38:84:38:84 | 80000 | semmle.label | 80000 | -| test.swift:44:84:44:84 | lowIterations | semmle.label | lowIterations | -| test.swift:45:84:45:84 | 80000 | semmle.label | 80000 | subpaths #select -| test.swift:37:84:37:84 | lowIterations | test.swift:20:45:20:45 | 99999 : | test.swift:37:84:37:84 | lowIterations | The value '99999' is an insufficient number of iterations for secure password hashing. | -| test.swift:38:84:38:84 | 80000 | test.swift:38:84:38:84 | 80000 | test.swift:38:84:38:84 | 80000 | The value '80000' is an insufficient number of iterations for secure password hashing. | -| test.swift:44:84:44:84 | lowIterations | test.swift:20:45:20:45 | 99999 : | test.swift:44:84:44:84 | lowIterations | The value '99999' is an insufficient number of iterations for secure password hashing. | -| test.swift:45:84:45:84 | 80000 | test.swift:45:84:45:84 | 80000 | test.swift:45:84:45:84 | 80000 | The value '80000' is an insufficient number of iterations for secure password hashing. | \ No newline at end of file From a4e9d38abb71f4e37720d1d1da82147e10effae1 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 22 Mar 2023 16:44:29 +0000 Subject: [PATCH 092/143] Swift: Fix the test regression. --- .../queries/Security/CWE-259/ConstantPassword.ql | 4 ++-- .../ql/src/queries/Security/CWE-760/ConstantSalt.ql | 4 ++-- .../Security/CWE-916/InsufficientHashIterations.ql | 2 +- .../Security/CWE-259/ConstantPassword.expected | 6 ++++++ .../Security/CWE-760/ConstantSalt.expected | 6 ++++++ .../CWE-916/InsufficientHashIterations.expected | 13 +++++++++++++ 6 files changed, 30 insertions(+), 5 deletions(-) diff --git a/swift/ql/src/queries/Security/CWE-259/ConstantPassword.ql b/swift/ql/src/queries/Security/CWE-259/ConstantPassword.ql index d7fd2e187de..48e53f50ab0 100644 --- a/swift/ql/src/queries/Security/CWE-259/ConstantPassword.ql +++ b/swift/ql/src/queries/Security/CWE-259/ConstantPassword.ql @@ -33,7 +33,7 @@ class ConstantPasswordSink extends Expr { ConstantPasswordSink() { // `password` arg in `init` is a sink exists(ClassOrStructDecl c, ConstructorDecl f, CallExpr call | - c.getFullName() = ["HKDF", "PBKDF1", "PBKDF2", "Scrypt"] and + c.getName() = ["HKDF", "PBKDF1", "PBKDF2", "Scrypt"] and c.getAMember() = f and call.getStaticTarget() = f and call.getArgumentWithLabel("password").getExpr() = this @@ -41,7 +41,7 @@ class ConstantPasswordSink extends Expr { or // RNCryptor (labelled arguments) exists(ClassOrStructDecl c, MethodDecl f, CallExpr call | - c.getFullName() = ["RNCryptor", "RNEncryptor", "RNDecryptor"] and + c.getName() = ["RNCryptor", "RNEncryptor", "RNDecryptor"] and c.getAMember() = f and call.getStaticTarget() = f and call.getArgumentWithLabel(["password", "withPassword", "forPassword"]).getExpr() = this diff --git a/swift/ql/src/queries/Security/CWE-760/ConstantSalt.ql b/swift/ql/src/queries/Security/CWE-760/ConstantSalt.ql index 71f379a77ad..e510acffe3a 100644 --- a/swift/ql/src/queries/Security/CWE-760/ConstantSalt.ql +++ b/swift/ql/src/queries/Security/CWE-760/ConstantSalt.ql @@ -34,7 +34,7 @@ class ConstantSaltSink extends Expr { ConstantSaltSink() { // `salt` arg in `init` is a sink exists(ClassOrStructDecl c, ConstructorDecl f, CallExpr call | - c.getFullName() = ["HKDF", "PBKDF1", "PBKDF2", "Scrypt"] and + c.getName() = ["HKDF", "PBKDF1", "PBKDF2", "Scrypt"] and c.getAMember() = f and call.getStaticTarget() = f and call.getArgumentWithLabel("salt").getExpr() = this @@ -42,7 +42,7 @@ class ConstantSaltSink extends Expr { or // RNCryptor exists(ClassOrStructDecl c, MethodDecl f, CallExpr call | - c.getFullName() = ["RNCryptor", "RNEncryptor", "RNDecryptor"] and + c.getName() = ["RNCryptor", "RNEncryptor", "RNDecryptor"] and c.getAMember() = f and call.getStaticTarget() = f and call.getArgumentWithLabel(["salt", "encryptionSalt", "hmacSalt", "HMACSalt"]).getExpr() = this diff --git a/swift/ql/src/queries/Security/CWE-916/InsufficientHashIterations.ql b/swift/ql/src/queries/Security/CWE-916/InsufficientHashIterations.ql index d8cb049ea50..310b038d3f3 100644 --- a/swift/ql/src/queries/Security/CWE-916/InsufficientHashIterations.ql +++ b/swift/ql/src/queries/Security/CWE-916/InsufficientHashIterations.ql @@ -34,7 +34,7 @@ class InsufficientHashIterationsSink extends Expr { InsufficientHashIterationsSink() { // `iterations` arg in `init` is a sink exists(ClassOrStructDecl c, ConstructorDecl f, CallExpr call | - c.getFullName() = ["PBKDF1", "PBKDF2"] and + c.getName() = ["PBKDF1", "PBKDF2"] and c.getAMember() = f and call.getStaticTarget() = f and call.getArgumentWithLabel("iterations").getExpr() = this diff --git a/swift/ql/test/query-tests/Security/CWE-259/ConstantPassword.expected b/swift/ql/test/query-tests/Security/CWE-259/ConstantPassword.expected index 262f02eeb8b..91539ad285b 100644 --- a/swift/ql/test/query-tests/Security/CWE-259/ConstantPassword.expected +++ b/swift/ql/test/query-tests/Security/CWE-259/ConstantPassword.expected @@ -18,6 +18,8 @@ edges | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:107:61:107:61 | myConstPassword | | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:108:97:108:97 | myConstPassword | | test.swift:43:39:43:134 | [...] : | test.swift:51:30:51:30 | constantPassword | +| test.swift:43:39:43:134 | [...] : | test.swift:56:40:56:40 | constantPassword | +| test.swift:43:39:43:134 | [...] : | test.swift:62:40:62:40 | constantPassword | | test.swift:43:39:43:134 | [...] : | test.swift:67:34:67:34 | constantPassword | nodes | rncryptor.swift:69:24:69:24 | abc123 : | semmle.label | abc123 : | @@ -41,6 +43,8 @@ nodes | rncryptor.swift:108:97:108:97 | myConstPassword | semmle.label | myConstPassword | | test.swift:43:39:43:134 | [...] : | semmle.label | [...] : | | test.swift:51:30:51:30 | constantPassword | semmle.label | constantPassword | +| test.swift:56:40:56:40 | constantPassword | semmle.label | constantPassword | +| test.swift:62:40:62:40 | constantPassword | semmle.label | constantPassword | | test.swift:67:34:67:34 | constantPassword | semmle.label | constantPassword | subpaths #select @@ -63,4 +67,6 @@ subpaths | rncryptor.swift:107:61:107:61 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:107:61:107:61 | myConstPassword | The value 'abc123' is used as a constant password. | | rncryptor.swift:108:97:108:97 | myConstPassword | rncryptor.swift:69:24:69:24 | abc123 : | rncryptor.swift:108:97:108:97 | myConstPassword | The value 'abc123' is used as a constant password. | | test.swift:51:30:51:30 | constantPassword | test.swift:43:39:43:134 | [...] : | test.swift:51:30:51:30 | constantPassword | The value '[...]' is used as a constant password. | +| test.swift:56:40:56:40 | constantPassword | test.swift:43:39:43:134 | [...] : | test.swift:56:40:56:40 | constantPassword | The value '[...]' is used as a constant password. | +| test.swift:62:40:62:40 | constantPassword | test.swift:43:39:43:134 | [...] : | test.swift:62:40:62:40 | constantPassword | The value '[...]' is used as a constant password. | | test.swift:67:34:67:34 | constantPassword | test.swift:43:39:43:134 | [...] : | test.swift:67:34:67:34 | constantPassword | The value '[...]' is used as a constant password. | diff --git a/swift/ql/test/query-tests/Security/CWE-760/ConstantSalt.expected b/swift/ql/test/query-tests/Security/CWE-760/ConstantSalt.expected index def58418e9e..633e73c44e5 100644 --- a/swift/ql/test/query-tests/Security/CWE-760/ConstantSalt.expected +++ b/swift/ql/test/query-tests/Security/CWE-760/ConstantSalt.expected @@ -15,6 +15,8 @@ edges | rncryptor.swift:60:29:60:29 | 0 : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | | rncryptor.swift:60:29:60:29 | 0 : | rncryptor.swift:60:24:60:30 | call to Data.init(_:) : | | test.swift:43:35:43:130 | [...] : | test.swift:51:49:51:49 | constantSalt | +| test.swift:43:35:43:130 | [...] : | test.swift:56:59:56:59 | constantSalt | +| test.swift:43:35:43:130 | [...] : | test.swift:62:59:62:59 | constantSalt | | test.swift:43:35:43:130 | [...] : | test.swift:67:53:67:53 | constantSalt | nodes | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | semmle.label | [summary] to write: return (return) in Data.init(_:) : | @@ -35,6 +37,8 @@ nodes | rncryptor.swift:79:160:79:160 | myConstantSalt2 | semmle.label | myConstantSalt2 | | test.swift:43:35:43:130 | [...] : | semmle.label | [...] : | | test.swift:51:49:51:49 | constantSalt | semmle.label | constantSalt | +| test.swift:56:59:56:59 | constantSalt | semmle.label | constantSalt | +| test.swift:62:59:62:59 | constantSalt | semmle.label | constantSalt | | test.swift:67:53:67:53 | constantSalt | semmle.label | constantSalt | subpaths | rncryptor.swift:59:29:59:29 | abcdef123456 : | rncryptor.swift:5:5:5:29 | [summary param] 0 in Data.init(_:) : | file://:0:0:0:0 | [summary] to write: return (return) in Data.init(_:) : | rncryptor.swift:59:24:59:43 | call to Data.init(_:) : | @@ -51,4 +55,6 @@ subpaths | rncryptor.swift:78:135:78:135 | myConstantSalt1 | rncryptor.swift:59:29:59:29 | abcdef123456 : | rncryptor.swift:78:135:78:135 | myConstantSalt1 | The value 'abcdef123456' is used as a constant salt, which is insecure for hashing passwords. | | rncryptor.swift:79:160:79:160 | myConstantSalt2 | rncryptor.swift:60:29:60:29 | 0 : | rncryptor.swift:79:160:79:160 | myConstantSalt2 | The value '0' is used as a constant salt, which is insecure for hashing passwords. | | test.swift:51:49:51:49 | constantSalt | test.swift:43:35:43:130 | [...] : | test.swift:51:49:51:49 | constantSalt | The value '[...]' is used as a constant salt, which is insecure for hashing passwords. | +| test.swift:56:59:56:59 | constantSalt | test.swift:43:35:43:130 | [...] : | test.swift:56:59:56:59 | constantSalt | The value '[...]' is used as a constant salt, which is insecure for hashing passwords. | +| test.swift:62:59:62:59 | constantSalt | test.swift:43:35:43:130 | [...] : | test.swift:62:59:62:59 | constantSalt | The value '[...]' is used as a constant salt, which is insecure for hashing passwords. | | test.swift:67:53:67:53 | constantSalt | test.swift:43:35:43:130 | [...] : | test.swift:67:53:67:53 | constantSalt | The value '[...]' is used as a constant salt, which is insecure for hashing passwords. | diff --git a/swift/ql/test/query-tests/Security/CWE-916/InsufficientHashIterations.expected b/swift/ql/test/query-tests/Security/CWE-916/InsufficientHashIterations.expected index e217064d1df..8f432710dc0 100644 --- a/swift/ql/test/query-tests/Security/CWE-916/InsufficientHashIterations.expected +++ b/swift/ql/test/query-tests/Security/CWE-916/InsufficientHashIterations.expected @@ -1,4 +1,17 @@ edges +| test.swift:20:45:20:45 | 99999 : | test.swift:33:22:33:43 | call to getLowIterationCount() : | +| test.swift:33:22:33:43 | call to getLowIterationCount() : | test.swift:37:84:37:84 | lowIterations | +| test.swift:33:22:33:43 | call to getLowIterationCount() : | test.swift:44:84:44:84 | lowIterations | nodes +| test.swift:20:45:20:45 | 99999 : | semmle.label | 99999 : | +| test.swift:33:22:33:43 | call to getLowIterationCount() : | semmle.label | call to getLowIterationCount() : | +| test.swift:37:84:37:84 | lowIterations | semmle.label | lowIterations | +| test.swift:38:84:38:84 | 80000 | semmle.label | 80000 | +| test.swift:44:84:44:84 | lowIterations | semmle.label | lowIterations | +| test.swift:45:84:45:84 | 80000 | semmle.label | 80000 | subpaths #select +| test.swift:37:84:37:84 | lowIterations | test.swift:20:45:20:45 | 99999 : | test.swift:37:84:37:84 | lowIterations | The value '99999' is an insufficient number of iterations for secure password hashing. | +| test.swift:38:84:38:84 | 80000 | test.swift:38:84:38:84 | 80000 | test.swift:38:84:38:84 | 80000 | The value '80000' is an insufficient number of iterations for secure password hashing. | +| test.swift:44:84:44:84 | lowIterations | test.swift:20:45:20:45 | 99999 : | test.swift:44:84:44:84 | lowIterations | The value '99999' is an insufficient number of iterations for secure password hashing. | +| test.swift:45:84:45:84 | 80000 | test.swift:45:84:45:84 | 80000 | test.swift:45:84:45:84 | 80000 | The value '80000' is an insufficient number of iterations for secure password hashing. | From 271e41c6ddea204886775a142116af0f624af017 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 23 Mar 2023 00:16:48 +0000 Subject: [PATCH 093/143] Add changed framework coverage reports --- java/documentation/library-coverage/coverage.csv | 2 +- java/documentation/library-coverage/coverage.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/java/documentation/library-coverage/coverage.csv b/java/documentation/library-coverage/coverage.csv index c0dcc806c02..680b2440aab 100644 --- a/java/documentation/library-coverage/coverage.csv +++ b/java/documentation/library-coverage/coverage.csv @@ -54,7 +54,7 @@ java.io,42,,40,,17,,,,,,,,,,,,,,,3,,,,,,,,,,,,,22,,,,,,,,39,1 java.lang,16,,76,,,,,,,,,,,,8,,,,,3,,4,,,1,,,,,,,,,,,,,,,,53,23 java.net,12,3,17,,,,,,,,,,,,,,,12,,,,,,,,,,,,,,,,,,,,,,3,17, java.nio,25,,29,,19,,,,,,,,,,,,,,,4,,,,,,,,,,,,,2,,,,,,,,29, -java.sql,13,,2,,,,,,,,4,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,1,1 +java.sql,13,,3,,,,,,,,4,,,,,,,,,,,,,,,,,,9,,,,,,,,,,,,2,1 java.util,44,,465,,,,,,,,,,,,34,,,,,,,,5,2,,1,2,,,,,,,,,,,,,,38,427 javafx.scene.web,1,,,,,,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,,,,, javax.faces.context,2,7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,7,, diff --git a/java/documentation/library-coverage/coverage.rst b/java/documentation/library-coverage/coverage.rst index 01b16e25a87..e2a186f1967 100644 --- a/java/documentation/library-coverage/coverage.rst +++ b/java/documentation/library-coverage/coverage.rst @@ -18,10 +18,10 @@ Java framework & library support `Google Guava `_,``com.google.common.*``,,730,39,,6,,,,, JBoss Logging,``org.jboss.logging``,,,324,,,,,,, `JSON-java `_,``org.json``,,236,,,,,,,, - Java Standard Library,``java.*``,3,630,152,36,,,9,,,12 + Java Standard Library,``java.*``,3,631,152,36,,,9,,,12 Java extensions,"``javax.*``, ``jakarta.*``",63,611,34,1,,4,,1,1,2 Kotlin Standard Library,``kotlin*``,,1835,12,10,,,,,,2 `Spring `_,``org.springframework.*``,29,480,101,,,,19,14,,29 Others,"``cn.hutool.core.codec``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.fasterxml.jackson.core``, ``com.fasterxml.jackson.databind``, ``com.hubspot.jinjava``, ``com.mitchellbosecke.pebble``, ``com.opensymphony.xwork2.ognl``, ``com.rabbitmq.client``, ``com.thoughtworks.xstream``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``freemarker.cache``, ``freemarker.template``, ``groovy.lang``, ``groovy.util``, ``hudson.model``, ``hudson.os``, ``hudson.remoting``, ``hudson.util``, ``io.netty.bootstrap``, ``io.netty.channel``, ``io.netty.handler.codec.http``, ``io.netty.handler.ssl``, ``io.netty.handler.stream``, ``io.netty.resolver``, ``io.netty.util.internal``, ``javafx.scene.web``, ``jodd.json``, ``net.sf.saxon.s9api``, ``ognl``, ``okhttp3``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.logging``, ``org.apache.commons.ognl``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.log4j``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.apache.velocity.app``, ``org.apache.velocity.runtime``, ``org.codehaus.cargo.container.installer``, ``org.codehaus.groovy.control``, ``org.dom4j``, ``org.geogebra.web.full.main``, ``org.hibernate``, ``org.jdbi.v3.core``, ``org.jooq``, ``org.kohsuke.stapler``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.scijava.log``, ``org.slf4j``, ``org.thymeleaf``, ``org.xml.sax``, ``org.xmlpull.v1``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``retrofit2``",60,314,328,12,,,18,18,,28 - Totals,,217,8507,1647,150,6,10,113,33,1,113 + Totals,,217,8508,1647,150,6,10,113,33,1,113 From ce6be1f6365cbd9aed71ebbb3fae37d4cfc0dab1 Mon Sep 17 00:00:00 2001 From: Kasper Svendsen Date: Thu, 23 Mar 2023 08:32:16 +0100 Subject: [PATCH 094/143] Dataflow: Instantiate stage 1 access paths with proper unit type --- .../lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll | 6 +----- .../semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll | 6 +----- .../semmle/code/csharp/dataflow/internal/DataFlowImpl.qll | 6 +----- go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll | 6 +----- .../lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll | 6 +----- .../semmle/python/dataflow/new/internal/DataFlowImpl.qll | 6 +----- ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll | 6 +----- .../ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll | 6 +----- 8 files changed, 8 insertions(+), 40 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll index c47b0308855..9fee0c11fff 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll @@ -445,11 +445,7 @@ module Impl { } private module Stage1 implements StageSig { - class Ap extends int { - // workaround for bad functionality-induced joins (happens when using `Unit`) - pragma[nomagic] - Ap() { this in [0 .. 1] and this < 1 } - } + class Ap = Unit; private class Cc = boolean; diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll index c47b0308855..9fee0c11fff 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll @@ -445,11 +445,7 @@ module Impl { } private module Stage1 implements StageSig { - class Ap extends int { - // workaround for bad functionality-induced joins (happens when using `Unit`) - pragma[nomagic] - Ap() { this in [0 .. 1] and this < 1 } - } + class Ap = Unit; private class Cc = boolean; diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll index c47b0308855..9fee0c11fff 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll @@ -445,11 +445,7 @@ module Impl { } private module Stage1 implements StageSig { - class Ap extends int { - // workaround for bad functionality-induced joins (happens when using `Unit`) - pragma[nomagic] - Ap() { this in [0 .. 1] and this < 1 } - } + class Ap = Unit; private class Cc = boolean; diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll index c47b0308855..9fee0c11fff 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll @@ -445,11 +445,7 @@ module Impl { } private module Stage1 implements StageSig { - class Ap extends int { - // workaround for bad functionality-induced joins (happens when using `Unit`) - pragma[nomagic] - Ap() { this in [0 .. 1] and this < 1 } - } + class Ap = Unit; private class Cc = boolean; diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll index c47b0308855..9fee0c11fff 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll @@ -445,11 +445,7 @@ module Impl { } private module Stage1 implements StageSig { - class Ap extends int { - // workaround for bad functionality-induced joins (happens when using `Unit`) - pragma[nomagic] - Ap() { this in [0 .. 1] and this < 1 } - } + class Ap = Unit; private class Cc = boolean; diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll index c47b0308855..9fee0c11fff 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll @@ -445,11 +445,7 @@ module Impl { } private module Stage1 implements StageSig { - class Ap extends int { - // workaround for bad functionality-induced joins (happens when using `Unit`) - pragma[nomagic] - Ap() { this in [0 .. 1] and this < 1 } - } + class Ap = Unit; private class Cc = boolean; diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll index c47b0308855..9fee0c11fff 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll @@ -445,11 +445,7 @@ module Impl { } private module Stage1 implements StageSig { - class Ap extends int { - // workaround for bad functionality-induced joins (happens when using `Unit`) - pragma[nomagic] - Ap() { this in [0 .. 1] and this < 1 } - } + class Ap = Unit; private class Cc = boolean; diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll index c47b0308855..9fee0c11fff 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll @@ -445,11 +445,7 @@ module Impl { } private module Stage1 implements StageSig { - class Ap extends int { - // workaround for bad functionality-induced joins (happens when using `Unit`) - pragma[nomagic] - Ap() { this in [0 .. 1] and this < 1 } - } + class Ap = Unit; private class Cc = boolean; From eed8c72ce6c7ba5c7818e7f018a0a6f18e23ea38 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 15 Mar 2023 11:56:55 +0100 Subject: [PATCH 095/143] Java: Refactor the model generator configurations to use the new API. --- .../utils/modelgenerator/CaptureSinkModels.ql | 4 - .../modelgenerator/CaptureSourceModels.ql | 4 - .../modelgenerator/internal/CaptureModels.qll | 122 ++++++++++-------- .../internal/CaptureModelsSpecific.qll | 26 ++-- .../internal/CaptureSummaryFlow.qll | 4 - 5 files changed, 77 insertions(+), 83 deletions(-) diff --git a/java/ql/src/utils/modelgenerator/CaptureSinkModels.ql b/java/ql/src/utils/modelgenerator/CaptureSinkModels.ql index 8d273ba77f8..4bc621ad6bb 100644 --- a/java/ql/src/utils/modelgenerator/CaptureSinkModels.ql +++ b/java/ql/src/utils/modelgenerator/CaptureSinkModels.ql @@ -8,10 +8,6 @@ import internal.CaptureModels -class Activate extends ActiveConfiguration { - override predicate activateToSinkConfig() { any() } -} - from DataFlowTargetApi api, string sink where sink = captureSink(api) select sink order by sink diff --git a/java/ql/src/utils/modelgenerator/CaptureSourceModels.ql b/java/ql/src/utils/modelgenerator/CaptureSourceModels.ql index f4fc9982797..51e6f68e62c 100644 --- a/java/ql/src/utils/modelgenerator/CaptureSourceModels.ql +++ b/java/ql/src/utils/modelgenerator/CaptureSourceModels.ql @@ -8,10 +8,6 @@ import internal.CaptureModels -class Activate extends ActiveConfiguration { - override predicate activateFromSourceConfig() { any() } -} - from DataFlowTargetApi api, string source where source = captureSource(api) select source order by source diff --git a/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll b/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll index 893c62191b3..7dbdc5bee52 100644 --- a/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll +++ b/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll @@ -5,14 +5,6 @@ private import CaptureModelsSpecific -class ActiveConfiguration extends Unit { - predicate activateThroughFlowConfig() { none() } - - predicate activateFromSourceConfig() { none() } - - predicate activateToSinkConfig() { none() } -} - class DataFlowTargetApi extends TargetApiSpecific { DataFlowTargetApi() { isRelevantForDataFlowModels(this) } } @@ -46,6 +38,20 @@ private predicate isRelevantContent(DataFlow::Content c) { DataFlowPrivate::containerContent(c) } +/** + * Gets the MaD string representation of the parameter node `p`. + */ +string parameterNodeAsInput(DataFlow::ParameterNode p) { + result = parameterAccess(p.asParameter()) + or + result = qualifierString() and p instanceof InstanceParameterNode +} + +/** + * Gets the MaD input string representation of `source`. + */ +string asInputArgument(DataFlow::Node source) { result = asInputArgumentSpecific(source) } + /** * Gets the summary model for `api` with `input`, `output` and `kind`. */ @@ -111,61 +117,70 @@ string captureQualifierFlow(TargetApiSpecific api) { private int accessPathLimit() { result = 2 } +private newtype TTaintState = + TTaintRead(int n) { n in [0 .. accessPathLimit()] } or + TTaintStore(int n) { n in [1 .. accessPathLimit()] } + +abstract private class TaintState extends TTaintState { + abstract string toString(); +} + /** * A FlowState representing a tainted read. */ -private class TaintRead extends DataFlow::FlowState { +private class TaintRead extends TaintState, TTaintRead { private int step; - TaintRead() { this = "TaintRead(" + step + ")" and step in [0 .. accessPathLimit()] } + TaintRead() { this = TTaintRead(step) } /** * Gets the flow state step number. */ int getStep() { result = step } + + override string toString() { result = "TaintRead(" + step + ")" } } /** * A FlowState representing a tainted write. */ -private class TaintStore extends DataFlow::FlowState { +private class TaintStore extends TaintState, TTaintStore { private int step; - TaintStore() { this = "TaintStore(" + step + ")" and step in [1 .. accessPathLimit()] } + TaintStore() { this = TTaintStore(step) } /** * Gets the flow state step number. */ int getStep() { result = step } + + override string toString() { result = "TaintStore(" + step + ")" } } /** - * A TaintTracking Configuration used for tracking flow through APIs. + * A data-flow configuration for tracking flow through APIs. * The sources are the parameters of an API and the sinks are the return values (excluding `this`) and parameters. * * This can be used to generate Flow summaries for APIs from parameter to return. */ -private class ThroughFlowConfig extends TaintTracking::Configuration { - ThroughFlowConfig() { - this = "ThroughFlowConfig" and any(ActiveConfiguration ac).activateThroughFlowConfig() - } +module ThroughFlowConfig implements DataFlow::StateConfigSig { + class FlowState = TaintState; - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { + predicate isSource(DataFlow::Node source, FlowState state) { source instanceof DataFlow::ParameterNode and source.getEnclosingCallable() instanceof DataFlowTargetApi and state.(TaintRead).getStep() = 0 } - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { + predicate isSink(DataFlow::Node sink, FlowState state) { sink instanceof DataFlowImplCommon::ReturnNodeExt and not isOwnInstanceAccessNode(sink) and not exists(captureQualifierFlow(sink.asExpr().getEnclosingCallable())) and (state instanceof TaintRead or state instanceof TaintStore) } - override predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 + predicate isAdditionalFlowStep( + DataFlow::Node node1, FlowState state1, DataFlow::Node node2, FlowState state2 ) { exists(DataFlowImplCommon::TypedContent tc | DataFlowImplCommon::store(node1, tc, node2, _) and @@ -184,24 +199,28 @@ private class ThroughFlowConfig extends TaintTracking::Configuration { ) } - override predicate isSanitizer(DataFlow::Node n) { + predicate isBarrier(DataFlow::Node n) { exists(Type t | t = n.getType() and not isRelevantType(t)) } - override DataFlow::FlowFeature getAFeature() { + predicate isBarrier(DataFlow::Node node, FlowState state) { none() } + + DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureEqualSourceSinkCallContext } } +private module ThroughFlow = TaintTracking::MakeWithState; + /** * Gets the summary model(s) of `api`, if there is flow from parameters to return value or parameter. */ string captureThroughFlow(DataFlowTargetApi api) { exists( - ThroughFlowConfig config, DataFlow::ParameterNode p, - DataFlowImplCommon::ReturnNodeExt returnNodeExt, string input, string output + DataFlow::ParameterNode p, DataFlowImplCommon::ReturnNodeExt returnNodeExt, string input, + string output | - config.hasFlow(p, returnNodeExt) and + ThroughFlow::hasFlow(p, returnNodeExt) and returnNodeExt.getEnclosingCallable() = api and input = parameterNodeAsInput(p) and output = returnNodeAsOutput(returnNodeExt) and @@ -211,41 +230,37 @@ string captureThroughFlow(DataFlowTargetApi api) { } /** - * A TaintTracking Configuration used for tracking flow through APIs. + * A dataflow configuration used for finding new sources. * The sources are the already known existing sources and the sinks are the API return nodes. * * This can be used to generate Source summaries for an API, if the API expose an already known source * via its return (then the API itself becomes a source). */ -private class FromSourceConfiguration extends TaintTracking::Configuration { - FromSourceConfiguration() { - this = "FromSourceConfiguration" and any(ActiveConfiguration ac).activateFromSourceConfig() - } +module FromSourceConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { ExternalFlow::sourceNode(source, _) } - override predicate isSource(DataFlow::Node source) { ExternalFlow::sourceNode(source, _) } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(DataFlowTargetApi c | sink instanceof DataFlowImplCommon::ReturnNodeExt and sink.getEnclosingCallable() = c ) } - override DataFlow::FlowFeature getAFeature() { - result instanceof DataFlow::FeatureHasSinkCallContext - } + DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSinkCallContext } - override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { isRelevantTaintStep(node1, node2) } } +private module FromSource = TaintTracking::Make; + /** * Gets the source model(s) of `api`, if there is flow from an existing known source to the return of `api`. */ string captureSource(DataFlowTargetApi api) { - exists(DataFlow::Node source, DataFlow::Node sink, FromSourceConfiguration config, string kind | - config.hasFlow(source, sink) and + exists(DataFlow::Node source, DataFlow::Node sink, string kind | + FromSource::hasFlow(source, sink) and ExternalFlow::sourceNode(source, kind) and api = sink.getEnclosingCallable() and isRelevantSourceKind(kind) and @@ -254,35 +269,30 @@ string captureSource(DataFlowTargetApi api) { } /** - * A TaintTracking Configuration used for tracking flow through APIs. + * A dataflow configuration used for finding new sinks. * The sources are the parameters of the API and the fields of the enclosing type. * * This can be used to generate Sink summaries for APIs, if the API propagates a parameter (or enclosing type field) * into an existing known sink (then the API itself becomes a sink). */ -private class PropagateToSinkConfiguration extends TaintTracking::Configuration { - PropagateToSinkConfiguration() { - this = "parameters or fields flowing into sinks" and - any(ActiveConfiguration ac).activateToSinkConfig() - } +module PropagateToSinkConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { apiSource(source) } - override predicate isSource(DataFlow::Node source) { apiSource(source) } + predicate isSink(DataFlow::Node sink) { ExternalFlow::sinkNode(sink, _) } - override predicate isSink(DataFlow::Node sink) { ExternalFlow::sinkNode(sink, _) } + predicate isBarrier(DataFlow::Node node) { sinkModelSanitizer(node) } - override predicate isSanitizer(DataFlow::Node node) { sinkModelSanitizer(node) } - - override DataFlow::FlowFeature getAFeature() { - result instanceof DataFlow::FeatureHasSourceCallContext - } + DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSourceCallContext } } +private module PropagateToSink = TaintTracking::Make; + /** * Gets the sink model(s) of `api`, if there is flow from a parameter to an existing known sink. */ string captureSink(DataFlowTargetApi api) { - exists(DataFlow::Node src, DataFlow::Node sink, PropagateToSinkConfiguration config, string kind | - config.hasFlow(src, sink) and + exists(DataFlow::Node src, DataFlow::Node sink, string kind | + PropagateToSink::hasFlow(src, sink) and ExternalFlow::sinkNode(sink, kind) and api = src.getEnclosingCallable() and isRelevantSinkKind(kind) and diff --git a/java/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll b/java/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll index bce229d10a6..e22fc06df6e 100644 --- a/java/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll +++ b/java/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll @@ -130,7 +130,7 @@ private predicate partialModel(TargetApiSpecific api, string type, string name, } /** - * Computes the first 6 columns for CSV rows. + * Computes the first 6 columns for MaD rows. */ string asPartialModel(TargetApiSpecific api) { exists(string type, string name, string parameters | @@ -145,7 +145,7 @@ string asPartialModel(TargetApiSpecific api) { } /** - * Computes the first 4 columns for neutral CSV rows. + * Computes the first 4 columns for neutral MaD rows. */ string asPartialNeutralModel(TargetApiSpecific api) { exists(string type, string name, string parameters | @@ -187,11 +187,14 @@ predicate isRelevantType(J::Type t) { } /** - * Gets the CSV string representation of the qualifier. + * Gets the MaD string representation of the qualifier. */ string qualifierString() { result = "Argument[this]" } -private string parameterAccess(J::Parameter p) { +/** + * Gets the MaD string representation of the parameter `p`. + */ +string parameterAccess(J::Parameter p) { if p.getType() instanceof J::Array and not isPrimitiveTypeUsedForBulkData(p.getType().(J::Array).getElementType()) @@ -202,17 +205,10 @@ private string parameterAccess(J::Parameter p) { else result = "Argument[" + p.getPosition() + "]" } -/** - * Gets the CSV string representation of the parameter node `p`. - */ -string parameterNodeAsInput(DataFlow::ParameterNode p) { - result = parameterAccess(p.asParameter()) - or - result = qualifierString() and p instanceof DataFlow::InstanceParameterNode -} +class InstanceParameterNode = DataFlow::InstanceParameterNode; /** - * Gets the CSV string represention of the the return node `node`. + * Gets the MaD string represention of the the return node `node`. */ string returnNodeAsOutput(DataFlowImplCommon::ReturnNodeExt node) { if node.getKind() instanceof DataFlowImplCommon::ValueReturnKind @@ -268,9 +264,9 @@ predicate apiSource(DataFlow::Node source) { } /** - * Gets the CSV input string representation of `source`. + * Gets the MaD input string representation of `source`. */ -string asInputArgument(DataFlow::Node source) { +string asInputArgumentSpecific(DataFlow::Node source) { exists(int pos | source.(DataFlow::ParameterNode).isParameterOf(_, pos) and result = "Argument[" + pos + "]" diff --git a/java/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll b/java/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll index b859fef0ebb..65a892262f5 100644 --- a/java/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll +++ b/java/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll @@ -1,9 +1,5 @@ private import CaptureModels -private class Activate extends ActiveConfiguration { - override predicate activateThroughFlowConfig() { any() } -} - /** * Capture fluent APIs that return `this`. * Example of a fluent API: From d0732a765b651918dbe165a8e6e724e26f9f3723 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 23 Mar 2023 09:52:42 +0100 Subject: [PATCH 096/143] C#: Sync files. --- .../modelgenerator/internal/CaptureModels.qll | 122 ++++++++++-------- 1 file changed, 66 insertions(+), 56 deletions(-) diff --git a/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll b/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll index 893c62191b3..7dbdc5bee52 100644 --- a/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll +++ b/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll @@ -5,14 +5,6 @@ private import CaptureModelsSpecific -class ActiveConfiguration extends Unit { - predicate activateThroughFlowConfig() { none() } - - predicate activateFromSourceConfig() { none() } - - predicate activateToSinkConfig() { none() } -} - class DataFlowTargetApi extends TargetApiSpecific { DataFlowTargetApi() { isRelevantForDataFlowModels(this) } } @@ -46,6 +38,20 @@ private predicate isRelevantContent(DataFlow::Content c) { DataFlowPrivate::containerContent(c) } +/** + * Gets the MaD string representation of the parameter node `p`. + */ +string parameterNodeAsInput(DataFlow::ParameterNode p) { + result = parameterAccess(p.asParameter()) + or + result = qualifierString() and p instanceof InstanceParameterNode +} + +/** + * Gets the MaD input string representation of `source`. + */ +string asInputArgument(DataFlow::Node source) { result = asInputArgumentSpecific(source) } + /** * Gets the summary model for `api` with `input`, `output` and `kind`. */ @@ -111,61 +117,70 @@ string captureQualifierFlow(TargetApiSpecific api) { private int accessPathLimit() { result = 2 } +private newtype TTaintState = + TTaintRead(int n) { n in [0 .. accessPathLimit()] } or + TTaintStore(int n) { n in [1 .. accessPathLimit()] } + +abstract private class TaintState extends TTaintState { + abstract string toString(); +} + /** * A FlowState representing a tainted read. */ -private class TaintRead extends DataFlow::FlowState { +private class TaintRead extends TaintState, TTaintRead { private int step; - TaintRead() { this = "TaintRead(" + step + ")" and step in [0 .. accessPathLimit()] } + TaintRead() { this = TTaintRead(step) } /** * Gets the flow state step number. */ int getStep() { result = step } + + override string toString() { result = "TaintRead(" + step + ")" } } /** * A FlowState representing a tainted write. */ -private class TaintStore extends DataFlow::FlowState { +private class TaintStore extends TaintState, TTaintStore { private int step; - TaintStore() { this = "TaintStore(" + step + ")" and step in [1 .. accessPathLimit()] } + TaintStore() { this = TTaintStore(step) } /** * Gets the flow state step number. */ int getStep() { result = step } + + override string toString() { result = "TaintStore(" + step + ")" } } /** - * A TaintTracking Configuration used for tracking flow through APIs. + * A data-flow configuration for tracking flow through APIs. * The sources are the parameters of an API and the sinks are the return values (excluding `this`) and parameters. * * This can be used to generate Flow summaries for APIs from parameter to return. */ -private class ThroughFlowConfig extends TaintTracking::Configuration { - ThroughFlowConfig() { - this = "ThroughFlowConfig" and any(ActiveConfiguration ac).activateThroughFlowConfig() - } +module ThroughFlowConfig implements DataFlow::StateConfigSig { + class FlowState = TaintState; - override predicate isSource(DataFlow::Node source, DataFlow::FlowState state) { + predicate isSource(DataFlow::Node source, FlowState state) { source instanceof DataFlow::ParameterNode and source.getEnclosingCallable() instanceof DataFlowTargetApi and state.(TaintRead).getStep() = 0 } - override predicate isSink(DataFlow::Node sink, DataFlow::FlowState state) { + predicate isSink(DataFlow::Node sink, FlowState state) { sink instanceof DataFlowImplCommon::ReturnNodeExt and not isOwnInstanceAccessNode(sink) and not exists(captureQualifierFlow(sink.asExpr().getEnclosingCallable())) and (state instanceof TaintRead or state instanceof TaintStore) } - override predicate isAdditionalTaintStep( - DataFlow::Node node1, DataFlow::FlowState state1, DataFlow::Node node2, - DataFlow::FlowState state2 + predicate isAdditionalFlowStep( + DataFlow::Node node1, FlowState state1, DataFlow::Node node2, FlowState state2 ) { exists(DataFlowImplCommon::TypedContent tc | DataFlowImplCommon::store(node1, tc, node2, _) and @@ -184,24 +199,28 @@ private class ThroughFlowConfig extends TaintTracking::Configuration { ) } - override predicate isSanitizer(DataFlow::Node n) { + predicate isBarrier(DataFlow::Node n) { exists(Type t | t = n.getType() and not isRelevantType(t)) } - override DataFlow::FlowFeature getAFeature() { + predicate isBarrier(DataFlow::Node node, FlowState state) { none() } + + DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureEqualSourceSinkCallContext } } +private module ThroughFlow = TaintTracking::MakeWithState; + /** * Gets the summary model(s) of `api`, if there is flow from parameters to return value or parameter. */ string captureThroughFlow(DataFlowTargetApi api) { exists( - ThroughFlowConfig config, DataFlow::ParameterNode p, - DataFlowImplCommon::ReturnNodeExt returnNodeExt, string input, string output + DataFlow::ParameterNode p, DataFlowImplCommon::ReturnNodeExt returnNodeExt, string input, + string output | - config.hasFlow(p, returnNodeExt) and + ThroughFlow::hasFlow(p, returnNodeExt) and returnNodeExt.getEnclosingCallable() = api and input = parameterNodeAsInput(p) and output = returnNodeAsOutput(returnNodeExt) and @@ -211,41 +230,37 @@ string captureThroughFlow(DataFlowTargetApi api) { } /** - * A TaintTracking Configuration used for tracking flow through APIs. + * A dataflow configuration used for finding new sources. * The sources are the already known existing sources and the sinks are the API return nodes. * * This can be used to generate Source summaries for an API, if the API expose an already known source * via its return (then the API itself becomes a source). */ -private class FromSourceConfiguration extends TaintTracking::Configuration { - FromSourceConfiguration() { - this = "FromSourceConfiguration" and any(ActiveConfiguration ac).activateFromSourceConfig() - } +module FromSourceConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { ExternalFlow::sourceNode(source, _) } - override predicate isSource(DataFlow::Node source) { ExternalFlow::sourceNode(source, _) } - - override predicate isSink(DataFlow::Node sink) { + predicate isSink(DataFlow::Node sink) { exists(DataFlowTargetApi c | sink instanceof DataFlowImplCommon::ReturnNodeExt and sink.getEnclosingCallable() = c ) } - override DataFlow::FlowFeature getAFeature() { - result instanceof DataFlow::FeatureHasSinkCallContext - } + DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSinkCallContext } - override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { isRelevantTaintStep(node1, node2) } } +private module FromSource = TaintTracking::Make; + /** * Gets the source model(s) of `api`, if there is flow from an existing known source to the return of `api`. */ string captureSource(DataFlowTargetApi api) { - exists(DataFlow::Node source, DataFlow::Node sink, FromSourceConfiguration config, string kind | - config.hasFlow(source, sink) and + exists(DataFlow::Node source, DataFlow::Node sink, string kind | + FromSource::hasFlow(source, sink) and ExternalFlow::sourceNode(source, kind) and api = sink.getEnclosingCallable() and isRelevantSourceKind(kind) and @@ -254,35 +269,30 @@ string captureSource(DataFlowTargetApi api) { } /** - * A TaintTracking Configuration used for tracking flow through APIs. + * A dataflow configuration used for finding new sinks. * The sources are the parameters of the API and the fields of the enclosing type. * * This can be used to generate Sink summaries for APIs, if the API propagates a parameter (or enclosing type field) * into an existing known sink (then the API itself becomes a sink). */ -private class PropagateToSinkConfiguration extends TaintTracking::Configuration { - PropagateToSinkConfiguration() { - this = "parameters or fields flowing into sinks" and - any(ActiveConfiguration ac).activateToSinkConfig() - } +module PropagateToSinkConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { apiSource(source) } - override predicate isSource(DataFlow::Node source) { apiSource(source) } + predicate isSink(DataFlow::Node sink) { ExternalFlow::sinkNode(sink, _) } - override predicate isSink(DataFlow::Node sink) { ExternalFlow::sinkNode(sink, _) } + predicate isBarrier(DataFlow::Node node) { sinkModelSanitizer(node) } - override predicate isSanitizer(DataFlow::Node node) { sinkModelSanitizer(node) } - - override DataFlow::FlowFeature getAFeature() { - result instanceof DataFlow::FeatureHasSourceCallContext - } + DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSourceCallContext } } +private module PropagateToSink = TaintTracking::Make; + /** * Gets the sink model(s) of `api`, if there is flow from a parameter to an existing known sink. */ string captureSink(DataFlowTargetApi api) { - exists(DataFlow::Node src, DataFlow::Node sink, PropagateToSinkConfiguration config, string kind | - config.hasFlow(src, sink) and + exists(DataFlow::Node src, DataFlow::Node sink, string kind | + PropagateToSink::hasFlow(src, sink) and ExternalFlow::sinkNode(sink, kind) and api = src.getEnclosingCallable() and isRelevantSinkKind(kind) and From b17a71674a45e001f5cceba2105bac2f10dd8fa3 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Mar 2023 12:24:48 +0100 Subject: [PATCH 097/143] C#: Refactor the model generator configurations to use the new API. --- .../utils/modelgenerator/CaptureSinkModels.ql | 4 ---- .../utils/modelgenerator/CaptureSourceModels.ql | 4 ---- .../internal/CaptureModelsSpecific.qll | 17 +++++------------ .../internal/CaptureSummaryFlow.qll | 4 ---- 4 files changed, 5 insertions(+), 24 deletions(-) diff --git a/csharp/ql/src/utils/modelgenerator/CaptureSinkModels.ql b/csharp/ql/src/utils/modelgenerator/CaptureSinkModels.ql index bba5081c223..d00f49904a5 100644 --- a/csharp/ql/src/utils/modelgenerator/CaptureSinkModels.ql +++ b/csharp/ql/src/utils/modelgenerator/CaptureSinkModels.ql @@ -8,10 +8,6 @@ import internal.CaptureModels -class Activate extends ActiveConfiguration { - override predicate activateToSinkConfig() { any() } -} - from DataFlowTargetApi api, string sink where sink = captureSink(api) select sink order by sink diff --git a/csharp/ql/src/utils/modelgenerator/CaptureSourceModels.ql b/csharp/ql/src/utils/modelgenerator/CaptureSourceModels.ql index f504a291d7e..a4dc734d178 100644 --- a/csharp/ql/src/utils/modelgenerator/CaptureSourceModels.ql +++ b/csharp/ql/src/utils/modelgenerator/CaptureSourceModels.ql @@ -8,10 +8,6 @@ import internal.CaptureModels -class Activate extends ActiveConfiguration { - override predicate activateFromSourceConfig() { any() } -} - from DataFlowTargetApi api, string source where source = captureSource(api) select source order by source diff --git a/csharp/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll b/csharp/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll index 1fc7636ca65..8d019508abd 100644 --- a/csharp/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll +++ b/csharp/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll @@ -110,7 +110,7 @@ predicate isRelevantType(CS::Type t) { } /** - * Gets the CSV string representation of the qualifier. + * Gets the MaD string representation of the qualifier. */ string qualifierString() { result = "Argument[this]" } @@ -120,14 +120,7 @@ string parameterAccess(CS::Parameter p) { else result = "Argument[" + p.getPosition() + "]" } -/** - * Gets the CSV string representation of the parameter node `p`. - */ -string parameterNodeAsInput(DataFlow::ParameterNode p) { - result = parameterAccess(p.asParameter()) - or - result = qualifierString() and p instanceof DataFlowPrivate::InstanceParameterNode -} +class InstanceParameterNode = DataFlowPrivate::InstanceParameterNode; pragma[nomagic] private CS::Parameter getParameter(DataFlowImplCommon::ReturnNodeExt node, ParameterPosition pos) { @@ -135,7 +128,7 @@ private CS::Parameter getParameter(DataFlowImplCommon::ReturnNodeExt node, Param } /** - * Gets the CSV string representation of the the return node `node`. + * Gets the MaD string representation of the the return node `node`. */ string returnNodeAsOutput(DataFlowImplCommon::ReturnNodeExt node) { if node.getKind() instanceof DataFlowImplCommon::ValueReturnKind @@ -188,9 +181,9 @@ predicate apiSource(DataFlow::Node source) { } /** - * Gets the CSV input string representation of `source`. + * Gets the MaD input string representation of `source`. */ -string asInputArgument(DataFlow::Node source) { +string asInputArgumentSpecific(DataFlow::Node source) { exists(int pos | pos = source.(DataFlow::ParameterNode).getParameter().getPosition() and result = "Argument[" + pos + "]" diff --git a/csharp/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll b/csharp/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll index 1ed6b9a4850..2b3ce63249c 100644 --- a/csharp/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll +++ b/csharp/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll @@ -1,9 +1,5 @@ private import CaptureModels -private class Activate extends ActiveConfiguration { - override predicate activateThroughFlowConfig() { any() } -} - /** * Capture fluent APIs that return `this`. * Example of a fluent API: From d258a1c72854eb9f7ccdd7f1e4ee185b589dce7b Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Mar 2023 14:08:17 +0100 Subject: [PATCH 098/143] C#/Java: Some light re-factoring. --- .../src/utils/modelgenerator/CaptureDiscardedSummaryModels.ql | 2 +- csharp/ql/src/utils/modelgenerator/CaptureNeutralModels.ql | 2 +- csharp/ql/src/utils/modelgenerator/CaptureSummaryModels.ql | 2 +- .../src/utils/modelgenerator/internal/CaptureModelsSpecific.qll | 1 - .../{CaptureSummaryFlow.qll => CaptureSummaryFlowQuery.qll} | 0 java/ql/src/utils/modelgenerator/CaptureNeutralModels.ql | 2 +- java/ql/src/utils/modelgenerator/CaptureSummaryModels.ql | 2 +- .../src/utils/modelgenerator/internal/CaptureModelsSpecific.qll | 1 - .../{CaptureSummaryFlow.qll => CaptureSummaryFlowQuery.qll} | 0 9 files changed, 5 insertions(+), 7 deletions(-) rename csharp/ql/src/utils/modelgenerator/internal/{CaptureSummaryFlow.qll => CaptureSummaryFlowQuery.qll} (100%) rename java/ql/src/utils/modelgenerator/internal/{CaptureSummaryFlow.qll => CaptureSummaryFlowQuery.qll} (100%) diff --git a/csharp/ql/src/utils/modelgenerator/CaptureDiscardedSummaryModels.ql b/csharp/ql/src/utils/modelgenerator/CaptureDiscardedSummaryModels.ql index 3a2a3454900..dd9648ce2d4 100644 --- a/csharp/ql/src/utils/modelgenerator/CaptureDiscardedSummaryModels.ql +++ b/csharp/ql/src/utils/modelgenerator/CaptureDiscardedSummaryModels.ql @@ -6,7 +6,7 @@ import semmle.code.csharp.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl import internal.CaptureModels -import internal.CaptureSummaryFlow +import internal.CaptureSummaryFlowQuery from DataFlowTargetApi api, string flow where diff --git a/csharp/ql/src/utils/modelgenerator/CaptureNeutralModels.ql b/csharp/ql/src/utils/modelgenerator/CaptureNeutralModels.ql index 933df8c765a..e4424c54ad5 100644 --- a/csharp/ql/src/utils/modelgenerator/CaptureNeutralModels.ql +++ b/csharp/ql/src/utils/modelgenerator/CaptureNeutralModels.ql @@ -8,7 +8,7 @@ import semmle.code.csharp.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl import internal.CaptureModels -import internal.CaptureSummaryFlow +import internal.CaptureSummaryFlowQuery from DataFlowTargetApi api, string noflow where diff --git a/csharp/ql/src/utils/modelgenerator/CaptureSummaryModels.ql b/csharp/ql/src/utils/modelgenerator/CaptureSummaryModels.ql index 641c260adf8..920c5b57a74 100644 --- a/csharp/ql/src/utils/modelgenerator/CaptureSummaryModels.ql +++ b/csharp/ql/src/utils/modelgenerator/CaptureSummaryModels.ql @@ -8,7 +8,7 @@ import semmle.code.csharp.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl import internal.CaptureModels -import internal.CaptureSummaryFlow +import internal.CaptureSummaryFlowQuery from DataFlowTargetApi api, string flow where flow = captureFlow(api) and not api.(FlowSummaryImpl::Public::SummarizedCallable).isManual() diff --git a/csharp/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll b/csharp/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll index 8d019508abd..0414de03016 100644 --- a/csharp/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll +++ b/csharp/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll @@ -7,7 +7,6 @@ private import dotnet private import semmle.code.csharp.commons.Util as Util private import semmle.code.csharp.commons.Collections as Collections private import semmle.code.csharp.dataflow.internal.DataFlowDispatch -private import semmle.code.csharp.frameworks.System as System private import semmle.code.csharp.frameworks.system.linq.Expressions import semmle.code.csharp.dataflow.ExternalFlow as ExternalFlow import semmle.code.csharp.dataflow.internal.DataFlowImplCommon as DataFlowImplCommon diff --git a/csharp/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll b/csharp/ql/src/utils/modelgenerator/internal/CaptureSummaryFlowQuery.qll similarity index 100% rename from csharp/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll rename to csharp/ql/src/utils/modelgenerator/internal/CaptureSummaryFlowQuery.qll diff --git a/java/ql/src/utils/modelgenerator/CaptureNeutralModels.ql b/java/ql/src/utils/modelgenerator/CaptureNeutralModels.ql index 1f0c9fa5427..06fc24a054c 100644 --- a/java/ql/src/utils/modelgenerator/CaptureNeutralModels.ql +++ b/java/ql/src/utils/modelgenerator/CaptureNeutralModels.ql @@ -7,7 +7,7 @@ */ import internal.CaptureModels -import internal.CaptureSummaryFlow +import internal.CaptureSummaryFlowQuery from DataFlowTargetApi api, string noflow where noflow = captureNoFlow(api) diff --git a/java/ql/src/utils/modelgenerator/CaptureSummaryModels.ql b/java/ql/src/utils/modelgenerator/CaptureSummaryModels.ql index 33d07d5f2c1..607ddbe4fb6 100644 --- a/java/ql/src/utils/modelgenerator/CaptureSummaryModels.ql +++ b/java/ql/src/utils/modelgenerator/CaptureSummaryModels.ql @@ -7,7 +7,7 @@ */ import internal.CaptureModels -import internal.CaptureSummaryFlow +import internal.CaptureSummaryFlowQuery from DataFlowTargetApi api, string flow where flow = captureFlow(api) diff --git a/java/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll b/java/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll index e22fc06df6e..8823a8977d5 100644 --- a/java/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll +++ b/java/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll @@ -3,7 +3,6 @@ */ private import java as J -private import semmle.code.java.dataflow.internal.DataFlowNodes private import semmle.code.java.dataflow.internal.DataFlowPrivate private import semmle.code.java.dataflow.internal.ContainerFlow as ContainerFlow private import semmle.code.java.dataflow.DataFlow as Df diff --git a/java/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll b/java/ql/src/utils/modelgenerator/internal/CaptureSummaryFlowQuery.qll similarity index 100% rename from java/ql/src/utils/modelgenerator/internal/CaptureSummaryFlow.qll rename to java/ql/src/utils/modelgenerator/internal/CaptureSummaryFlowQuery.qll From cfa5af969e6b6378a96af11facb6d05fafe825ab Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 23 Mar 2023 11:07:19 +0100 Subject: [PATCH 099/143] Dataflow: Rename Make to Global and remove has* prefix. --- .../code/java/dataflow/internal/DataFlow.qll | 34 ++++++++++++------- .../java/dataflow/internal/DataFlowImpl.qll | 28 ++++++++++----- .../java/dataflow/internal/DataFlowImpl1.qll | 4 +-- .../internal/tainttracking1/TaintTracking.qll | 14 ++++++-- 4 files changed, 56 insertions(+), 24 deletions(-) diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll index 617362ab4f0..82714ed1af6 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll @@ -2,7 +2,7 @@ * Provides an implementation of global (interprocedural) data flow. This file * re-exports the local (intraprocedural) data flow analysis from * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed - * through the `Make` and `MakeWithState` modules. + * through the `Global` and `GlobalWithState` modules. */ private import DataFlowImplCommon @@ -73,10 +73,10 @@ signature module ConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -166,10 +166,10 @@ signature module StateConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -182,7 +182,7 @@ signature module StateConfigSig { } /** - * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * Gets the exploration limit for `partialFlow` and `partialFlowRev` * measured in approximate number of interprocedural steps. */ signature int explorationLimitSig(); @@ -203,28 +203,28 @@ signature module DataFlowSig { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink); + predicate flowPath(PathNode source, PathNode sink); /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink); + predicate flow(Node source, Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink); + predicate flowTo(Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink); + predicate flowToExpr(DataFlowExpr sink); } /** * Constructs a standard data flow computation. */ -module Make implements DataFlowSig { +module Global implements DataFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -233,10 +233,15 @@ module Make implements DataFlowSig { import Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlowSig { + import Global +} + /** * Constructs a data flow computation using flow state. */ -module MakeWithState implements DataFlowSig { +module GlobalWithState implements DataFlowSig { private module C implements FullStateConfigSig { import Config } @@ -244,6 +249,11 @@ module MakeWithState implements DataFlowSig { import Impl } +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlowSig { + import GlobalWithState +} + signature class PathNodeSig { /** Gets a textual representation of this element. */ string toString(); diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll index c47b0308855..d18ef5acd6e 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll @@ -91,10 +91,10 @@ signature module FullStateConfigSig { */ FlowFeature getAFeature(); - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ predicate sourceGrouping(Node source, string sourceGroup); - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ predicate sinkGrouping(Node sink, string sinkGroup); /** @@ -3633,7 +3633,7 @@ module Impl { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink) { + predicate flowPath(PathNode source, PathNode sink) { exists(PathNodeImpl flowsource, PathNodeImpl flowsink | source = flowsource and sink = flowsink | @@ -3643,6 +3643,9 @@ module Impl { ) } + /** DEPRECATED: Use `flowPath` instead. */ + deprecated predicate hasFlowPath = flowPath/2; + private predicate flowsTo(PathNodeImpl flowsource, PathNodeSink flowsink, Node source, Node sink) { flowsource.isSource() and flowsource.getNodeEx().asNode() = source and @@ -3653,17 +3656,26 @@ module Impl { /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink) { flowsTo(_, _, source, sink) } + predicate flow(Node source, Node sink) { flowsTo(_, _, source, sink) } + + /** DEPRECATED: Use `flow` instead. */ + deprecated predicate hasFlow = flow/2; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + predicate flowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + + /** DEPRECATED: Use `flowTo` instead. */ + deprecated predicate hasFlowTo = flowTo/1; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink) { hasFlowTo(exprNode(sink)) } + predicate flowToExpr(DataFlowExpr sink) { flowTo(exprNode(sink)) } + + /** DEPRECATED: Use `flowToExpr` instead. */ + deprecated predicate hasFlowToExpr = flowToExpr/1; private predicate finalStats( boolean fwd, int nodes, int fields, int conscand, int states, int tuples @@ -4574,7 +4586,7 @@ module Impl { * * To use this in a `path-problem` query, import the module `PartialPathGraph`. */ - predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + predicate partialFlow(PartialPathNode source, PartialPathNode node, int dist) { partialFlow(source, node) and dist = node.getSourceDistance() } @@ -4594,7 +4606,7 @@ module Impl { * Note that reverse flow has slightly lower precision than the corresponding * forward flow, as reverse flow disregards type pruning among other features. */ - predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + predicate partialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { revPartialFlow(node, sink) and dist = node.getSinkDistance() } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl1.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl1.qll index e6bdc74cceb..8415c022111 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl1.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl1.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTracking.qll b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTracking.qll index 7f96fe5e6fb..192a52f44e3 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTracking.qll @@ -35,7 +35,7 @@ private module AddTaintDefaults imp /** * Constructs a standard taint tracking computation. */ -module Make implements DataFlow::DataFlowSig { +module Global implements DataFlow::DataFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -48,10 +48,15 @@ module Make implements DataFlow::DataFlowSig { import DataFlowInternal::Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlow::DataFlowSig { + import Global +} + /** * Constructs a taint tracking computation using flow state. */ -module MakeWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::DataFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -62,3 +67,8 @@ module MakeWithState implements DataFlow::DataF import DataFlowInternal::Impl } + +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlow::DataFlowSig { + import GlobalWithState +} From 2761aa73ca33d7f71906ed42197e9be08f711daf Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 23 Mar 2023 11:08:19 +0100 Subject: [PATCH 100/143] Dataflow: Sync. --- .../code/cpp/dataflow/internal/DataFlow.qll | 34 ++++++++++++------- .../cpp/dataflow/internal/DataFlowImpl.qll | 28 ++++++++++----- .../cpp/dataflow/internal/DataFlowImpl1.qll | 4 +-- .../cpp/dataflow/internal/DataFlowImpl2.qll | 4 +-- .../cpp/dataflow/internal/DataFlowImpl3.qll | 4 +-- .../cpp/dataflow/internal/DataFlowImpl4.qll | 4 +-- .../dataflow/internal/DataFlowImplLocal.qll | 4 +-- .../internal/tainttracking1/TaintTracking.qll | 14 ++++++-- .../cpp/ir/dataflow/internal/DataFlow.qll | 34 ++++++++++++------- .../cpp/ir/dataflow/internal/DataFlowImpl.qll | 28 ++++++++++----- .../ir/dataflow/internal/DataFlowImpl1.qll | 4 +-- .../ir/dataflow/internal/DataFlowImpl2.qll | 4 +-- .../ir/dataflow/internal/DataFlowImpl3.qll | 4 +-- .../ir/dataflow/internal/DataFlowImpl4.qll | 4 +-- .../internal/tainttracking1/TaintTracking.qll | 14 ++++++-- .../csharp/dataflow/internal/DataFlow.qll | 34 ++++++++++++------- .../csharp/dataflow/internal/DataFlowImpl.qll | 28 ++++++++++----- .../dataflow/internal/DataFlowImpl1.qll | 4 +-- .../dataflow/internal/DataFlowImpl2.qll | 4 +-- .../dataflow/internal/DataFlowImpl3.qll | 4 +-- .../dataflow/internal/DataFlowImpl4.qll | 4 +-- .../dataflow/internal/DataFlowImpl5.qll | 4 +-- .../DataFlowImplForContentDataFlow.qll | 4 +-- .../internal/tainttracking1/TaintTracking.qll | 14 ++++++-- .../semmle/go/dataflow/internal/DataFlow.qll | 34 ++++++++++++------- .../go/dataflow/internal/DataFlowImpl.qll | 28 ++++++++++----- .../go/dataflow/internal/DataFlowImpl1.qll | 4 +-- .../go/dataflow/internal/DataFlowImpl2.qll | 4 +-- .../DataFlowImplForStringsNewReplacer.qll | 4 +-- .../internal/tainttracking1/TaintTracking.qll | 14 ++++++-- .../java/dataflow/internal/DataFlowImpl2.qll | 4 +-- .../java/dataflow/internal/DataFlowImpl3.qll | 4 +-- .../java/dataflow/internal/DataFlowImpl4.qll | 4 +-- .../java/dataflow/internal/DataFlowImpl5.qll | 4 +-- .../java/dataflow/internal/DataFlowImpl6.qll | 4 +-- .../python/dataflow/new/internal/DataFlow.qll | 34 ++++++++++++------- .../dataflow/new/internal/DataFlowImpl.qll | 28 ++++++++++----- .../dataflow/new/internal/DataFlowImpl1.qll | 4 +-- .../dataflow/new/internal/DataFlowImpl2.qll | 4 +-- .../dataflow/new/internal/DataFlowImpl3.qll | 4 +-- .../dataflow/new/internal/DataFlowImpl4.qll | 4 +-- .../new/internal/DataFlowImplForRegExp.qll | 4 +-- .../internal/tainttracking1/TaintTracking.qll | 14 ++++++-- .../ruby/dataflow/internal/DataFlow.qll | 34 ++++++++++++------- .../ruby/dataflow/internal/DataFlowImpl.qll | 28 ++++++++++----- .../ruby/dataflow/internal/DataFlowImpl1.qll | 4 +-- .../ruby/dataflow/internal/DataFlowImpl2.qll | 4 +-- .../DataFlowImplForHttpClientLibraries.qll | 4 +-- .../internal/DataFlowImplForPathname.qll | 4 +-- .../internal/tainttracking1/TaintTracking.qll | 14 ++++++-- .../swift/dataflow/internal/DataFlow.qll | 34 ++++++++++++------- .../swift/dataflow/internal/DataFlowImpl.qll | 28 ++++++++++----- .../swift/dataflow/internal/DataFlowImpl1.qll | 4 +-- .../internal/tainttracking1/TaintTracking.qll | 14 ++++++-- 54 files changed, 444 insertions(+), 220 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll index 617362ab4f0..82714ed1af6 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll @@ -2,7 +2,7 @@ * Provides an implementation of global (interprocedural) data flow. This file * re-exports the local (intraprocedural) data flow analysis from * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed - * through the `Make` and `MakeWithState` modules. + * through the `Global` and `GlobalWithState` modules. */ private import DataFlowImplCommon @@ -73,10 +73,10 @@ signature module ConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -166,10 +166,10 @@ signature module StateConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -182,7 +182,7 @@ signature module StateConfigSig { } /** - * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * Gets the exploration limit for `partialFlow` and `partialFlowRev` * measured in approximate number of interprocedural steps. */ signature int explorationLimitSig(); @@ -203,28 +203,28 @@ signature module DataFlowSig { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink); + predicate flowPath(PathNode source, PathNode sink); /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink); + predicate flow(Node source, Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink); + predicate flowTo(Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink); + predicate flowToExpr(DataFlowExpr sink); } /** * Constructs a standard data flow computation. */ -module Make implements DataFlowSig { +module Global implements DataFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -233,10 +233,15 @@ module Make implements DataFlowSig { import Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlowSig { + import Global +} + /** * Constructs a data flow computation using flow state. */ -module MakeWithState implements DataFlowSig { +module GlobalWithState implements DataFlowSig { private module C implements FullStateConfigSig { import Config } @@ -244,6 +249,11 @@ module MakeWithState implements DataFlowSig { import Impl } +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlowSig { + import GlobalWithState +} + signature class PathNodeSig { /** Gets a textual representation of this element. */ string toString(); diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll index c47b0308855..d18ef5acd6e 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll @@ -91,10 +91,10 @@ signature module FullStateConfigSig { */ FlowFeature getAFeature(); - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ predicate sourceGrouping(Node source, string sourceGroup); - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ predicate sinkGrouping(Node sink, string sinkGroup); /** @@ -3633,7 +3633,7 @@ module Impl { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink) { + predicate flowPath(PathNode source, PathNode sink) { exists(PathNodeImpl flowsource, PathNodeImpl flowsink | source = flowsource and sink = flowsink | @@ -3643,6 +3643,9 @@ module Impl { ) } + /** DEPRECATED: Use `flowPath` instead. */ + deprecated predicate hasFlowPath = flowPath/2; + private predicate flowsTo(PathNodeImpl flowsource, PathNodeSink flowsink, Node source, Node sink) { flowsource.isSource() and flowsource.getNodeEx().asNode() = source and @@ -3653,17 +3656,26 @@ module Impl { /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink) { flowsTo(_, _, source, sink) } + predicate flow(Node source, Node sink) { flowsTo(_, _, source, sink) } + + /** DEPRECATED: Use `flow` instead. */ + deprecated predicate hasFlow = flow/2; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + predicate flowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + + /** DEPRECATED: Use `flowTo` instead. */ + deprecated predicate hasFlowTo = flowTo/1; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink) { hasFlowTo(exprNode(sink)) } + predicate flowToExpr(DataFlowExpr sink) { flowTo(exprNode(sink)) } + + /** DEPRECATED: Use `flowToExpr` instead. */ + deprecated predicate hasFlowToExpr = flowToExpr/1; private predicate finalStats( boolean fwd, int nodes, int fields, int conscand, int states, int tuples @@ -4574,7 +4586,7 @@ module Impl { * * To use this in a `path-problem` query, import the module `PartialPathGraph`. */ - predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + predicate partialFlow(PartialPathNode source, PartialPathNode node, int dist) { partialFlow(source, node) and dist = node.getSourceDistance() } @@ -4594,7 +4606,7 @@ module Impl { * Note that reverse flow has slightly lower precision than the corresponding * forward flow, as reverse flow disregards type pruning among other features. */ - predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + predicate partialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { revPartialFlow(node, sink) and dist = node.getSinkDistance() } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl1.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl1.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl1.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl1.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTracking.qll index 7f96fe5e6fb..192a52f44e3 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTracking.qll @@ -35,7 +35,7 @@ private module AddTaintDefaults imp /** * Constructs a standard taint tracking computation. */ -module Make implements DataFlow::DataFlowSig { +module Global implements DataFlow::DataFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -48,10 +48,15 @@ module Make implements DataFlow::DataFlowSig { import DataFlowInternal::Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlow::DataFlowSig { + import Global +} + /** * Constructs a taint tracking computation using flow state. */ -module MakeWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::DataFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -62,3 +67,8 @@ module MakeWithState implements DataFlow::DataF import DataFlowInternal::Impl } + +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlow::DataFlowSig { + import GlobalWithState +} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll index 617362ab4f0..82714ed1af6 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll @@ -2,7 +2,7 @@ * Provides an implementation of global (interprocedural) data flow. This file * re-exports the local (intraprocedural) data flow analysis from * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed - * through the `Make` and `MakeWithState` modules. + * through the `Global` and `GlobalWithState` modules. */ private import DataFlowImplCommon @@ -73,10 +73,10 @@ signature module ConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -166,10 +166,10 @@ signature module StateConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -182,7 +182,7 @@ signature module StateConfigSig { } /** - * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * Gets the exploration limit for `partialFlow` and `partialFlowRev` * measured in approximate number of interprocedural steps. */ signature int explorationLimitSig(); @@ -203,28 +203,28 @@ signature module DataFlowSig { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink); + predicate flowPath(PathNode source, PathNode sink); /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink); + predicate flow(Node source, Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink); + predicate flowTo(Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink); + predicate flowToExpr(DataFlowExpr sink); } /** * Constructs a standard data flow computation. */ -module Make implements DataFlowSig { +module Global implements DataFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -233,10 +233,15 @@ module Make implements DataFlowSig { import Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlowSig { + import Global +} + /** * Constructs a data flow computation using flow state. */ -module MakeWithState implements DataFlowSig { +module GlobalWithState implements DataFlowSig { private module C implements FullStateConfigSig { import Config } @@ -244,6 +249,11 @@ module MakeWithState implements DataFlowSig { import Impl } +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlowSig { + import GlobalWithState +} + signature class PathNodeSig { /** Gets a textual representation of this element. */ string toString(); diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll index c47b0308855..d18ef5acd6e 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll @@ -91,10 +91,10 @@ signature module FullStateConfigSig { */ FlowFeature getAFeature(); - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ predicate sourceGrouping(Node source, string sourceGroup); - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ predicate sinkGrouping(Node sink, string sinkGroup); /** @@ -3633,7 +3633,7 @@ module Impl { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink) { + predicate flowPath(PathNode source, PathNode sink) { exists(PathNodeImpl flowsource, PathNodeImpl flowsink | source = flowsource and sink = flowsink | @@ -3643,6 +3643,9 @@ module Impl { ) } + /** DEPRECATED: Use `flowPath` instead. */ + deprecated predicate hasFlowPath = flowPath/2; + private predicate flowsTo(PathNodeImpl flowsource, PathNodeSink flowsink, Node source, Node sink) { flowsource.isSource() and flowsource.getNodeEx().asNode() = source and @@ -3653,17 +3656,26 @@ module Impl { /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink) { flowsTo(_, _, source, sink) } + predicate flow(Node source, Node sink) { flowsTo(_, _, source, sink) } + + /** DEPRECATED: Use `flow` instead. */ + deprecated predicate hasFlow = flow/2; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + predicate flowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + + /** DEPRECATED: Use `flowTo` instead. */ + deprecated predicate hasFlowTo = flowTo/1; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink) { hasFlowTo(exprNode(sink)) } + predicate flowToExpr(DataFlowExpr sink) { flowTo(exprNode(sink)) } + + /** DEPRECATED: Use `flowToExpr` instead. */ + deprecated predicate hasFlowToExpr = flowToExpr/1; private predicate finalStats( boolean fwd, int nodes, int fields, int conscand, int states, int tuples @@ -4574,7 +4586,7 @@ module Impl { * * To use this in a `path-problem` query, import the module `PartialPathGraph`. */ - predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + predicate partialFlow(PartialPathNode source, PartialPathNode node, int dist) { partialFlow(source, node) and dist = node.getSourceDistance() } @@ -4594,7 +4606,7 @@ module Impl { * Note that reverse flow has slightly lower precision than the corresponding * forward flow, as reverse flow disregards type pruning among other features. */ - predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + predicate partialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { revPartialFlow(node, sink) and dist = node.getSinkDistance() } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl1.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl1.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl1.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl1.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll index e6bdc74cceb..8415c022111 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTracking.qll index 7f96fe5e6fb..192a52f44e3 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTracking.qll @@ -35,7 +35,7 @@ private module AddTaintDefaults imp /** * Constructs a standard taint tracking computation. */ -module Make implements DataFlow::DataFlowSig { +module Global implements DataFlow::DataFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -48,10 +48,15 @@ module Make implements DataFlow::DataFlowSig { import DataFlowInternal::Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlow::DataFlowSig { + import Global +} + /** * Constructs a taint tracking computation using flow state. */ -module MakeWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::DataFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -62,3 +67,8 @@ module MakeWithState implements DataFlow::DataF import DataFlowInternal::Impl } + +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlow::DataFlowSig { + import GlobalWithState +} diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll index 617362ab4f0..82714ed1af6 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll @@ -2,7 +2,7 @@ * Provides an implementation of global (interprocedural) data flow. This file * re-exports the local (intraprocedural) data flow analysis from * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed - * through the `Make` and `MakeWithState` modules. + * through the `Global` and `GlobalWithState` modules. */ private import DataFlowImplCommon @@ -73,10 +73,10 @@ signature module ConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -166,10 +166,10 @@ signature module StateConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -182,7 +182,7 @@ signature module StateConfigSig { } /** - * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * Gets the exploration limit for `partialFlow` and `partialFlowRev` * measured in approximate number of interprocedural steps. */ signature int explorationLimitSig(); @@ -203,28 +203,28 @@ signature module DataFlowSig { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink); + predicate flowPath(PathNode source, PathNode sink); /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink); + predicate flow(Node source, Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink); + predicate flowTo(Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink); + predicate flowToExpr(DataFlowExpr sink); } /** * Constructs a standard data flow computation. */ -module Make implements DataFlowSig { +module Global implements DataFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -233,10 +233,15 @@ module Make implements DataFlowSig { import Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlowSig { + import Global +} + /** * Constructs a data flow computation using flow state. */ -module MakeWithState implements DataFlowSig { +module GlobalWithState implements DataFlowSig { private module C implements FullStateConfigSig { import Config } @@ -244,6 +249,11 @@ module MakeWithState implements DataFlowSig { import Impl } +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlowSig { + import GlobalWithState +} + signature class PathNodeSig { /** Gets a textual representation of this element. */ string toString(); diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll index c47b0308855..d18ef5acd6e 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll @@ -91,10 +91,10 @@ signature module FullStateConfigSig { */ FlowFeature getAFeature(); - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ predicate sourceGrouping(Node source, string sourceGroup); - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ predicate sinkGrouping(Node sink, string sinkGroup); /** @@ -3633,7 +3633,7 @@ module Impl { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink) { + predicate flowPath(PathNode source, PathNode sink) { exists(PathNodeImpl flowsource, PathNodeImpl flowsink | source = flowsource and sink = flowsink | @@ -3643,6 +3643,9 @@ module Impl { ) } + /** DEPRECATED: Use `flowPath` instead. */ + deprecated predicate hasFlowPath = flowPath/2; + private predicate flowsTo(PathNodeImpl flowsource, PathNodeSink flowsink, Node source, Node sink) { flowsource.isSource() and flowsource.getNodeEx().asNode() = source and @@ -3653,17 +3656,26 @@ module Impl { /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink) { flowsTo(_, _, source, sink) } + predicate flow(Node source, Node sink) { flowsTo(_, _, source, sink) } + + /** DEPRECATED: Use `flow` instead. */ + deprecated predicate hasFlow = flow/2; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + predicate flowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + + /** DEPRECATED: Use `flowTo` instead. */ + deprecated predicate hasFlowTo = flowTo/1; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink) { hasFlowTo(exprNode(sink)) } + predicate flowToExpr(DataFlowExpr sink) { flowTo(exprNode(sink)) } + + /** DEPRECATED: Use `flowToExpr` instead. */ + deprecated predicate hasFlowToExpr = flowToExpr/1; private predicate finalStats( boolean fwd, int nodes, int fields, int conscand, int states, int tuples @@ -4574,7 +4586,7 @@ module Impl { * * To use this in a `path-problem` query, import the module `PartialPathGraph`. */ - predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + predicate partialFlow(PartialPathNode source, PartialPathNode node, int dist) { partialFlow(source, node) and dist = node.getSourceDistance() } @@ -4594,7 +4606,7 @@ module Impl { * Note that reverse flow has slightly lower precision than the corresponding * forward flow, as reverse flow disregards type pruning among other features. */ - predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + predicate partialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { revPartialFlow(node, sink) and dist = node.getSinkDistance() } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl1.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl1.qll index e6bdc74cceb..8415c022111 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl1.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl1.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll index e6bdc74cceb..8415c022111 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll index e6bdc74cceb..8415c022111 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll index e6bdc74cceb..8415c022111 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll index e6bdc74cceb..8415c022111 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplForContentDataFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplForContentDataFlow.qll index e6bdc74cceb..8415c022111 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplForContentDataFlow.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplForContentDataFlow.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTracking.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTracking.qll index 7f96fe5e6fb..192a52f44e3 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTracking.qll @@ -35,7 +35,7 @@ private module AddTaintDefaults imp /** * Constructs a standard taint tracking computation. */ -module Make implements DataFlow::DataFlowSig { +module Global implements DataFlow::DataFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -48,10 +48,15 @@ module Make implements DataFlow::DataFlowSig { import DataFlowInternal::Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlow::DataFlowSig { + import Global +} + /** * Constructs a taint tracking computation using flow state. */ -module MakeWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::DataFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -62,3 +67,8 @@ module MakeWithState implements DataFlow::DataF import DataFlowInternal::Impl } + +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlow::DataFlowSig { + import GlobalWithState +} diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll index 617362ab4f0..82714ed1af6 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll @@ -2,7 +2,7 @@ * Provides an implementation of global (interprocedural) data flow. This file * re-exports the local (intraprocedural) data flow analysis from * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed - * through the `Make` and `MakeWithState` modules. + * through the `Global` and `GlobalWithState` modules. */ private import DataFlowImplCommon @@ -73,10 +73,10 @@ signature module ConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -166,10 +166,10 @@ signature module StateConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -182,7 +182,7 @@ signature module StateConfigSig { } /** - * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * Gets the exploration limit for `partialFlow` and `partialFlowRev` * measured in approximate number of interprocedural steps. */ signature int explorationLimitSig(); @@ -203,28 +203,28 @@ signature module DataFlowSig { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink); + predicate flowPath(PathNode source, PathNode sink); /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink); + predicate flow(Node source, Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink); + predicate flowTo(Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink); + predicate flowToExpr(DataFlowExpr sink); } /** * Constructs a standard data flow computation. */ -module Make implements DataFlowSig { +module Global implements DataFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -233,10 +233,15 @@ module Make implements DataFlowSig { import Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlowSig { + import Global +} + /** * Constructs a data flow computation using flow state. */ -module MakeWithState implements DataFlowSig { +module GlobalWithState implements DataFlowSig { private module C implements FullStateConfigSig { import Config } @@ -244,6 +249,11 @@ module MakeWithState implements DataFlowSig { import Impl } +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlowSig { + import GlobalWithState +} + signature class PathNodeSig { /** Gets a textual representation of this element. */ string toString(); diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll index c47b0308855..d18ef5acd6e 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl.qll @@ -91,10 +91,10 @@ signature module FullStateConfigSig { */ FlowFeature getAFeature(); - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ predicate sourceGrouping(Node source, string sourceGroup); - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ predicate sinkGrouping(Node sink, string sinkGroup); /** @@ -3633,7 +3633,7 @@ module Impl { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink) { + predicate flowPath(PathNode source, PathNode sink) { exists(PathNodeImpl flowsource, PathNodeImpl flowsink | source = flowsource and sink = flowsink | @@ -3643,6 +3643,9 @@ module Impl { ) } + /** DEPRECATED: Use `flowPath` instead. */ + deprecated predicate hasFlowPath = flowPath/2; + private predicate flowsTo(PathNodeImpl flowsource, PathNodeSink flowsink, Node source, Node sink) { flowsource.isSource() and flowsource.getNodeEx().asNode() = source and @@ -3653,17 +3656,26 @@ module Impl { /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink) { flowsTo(_, _, source, sink) } + predicate flow(Node source, Node sink) { flowsTo(_, _, source, sink) } + + /** DEPRECATED: Use `flow` instead. */ + deprecated predicate hasFlow = flow/2; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + predicate flowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + + /** DEPRECATED: Use `flowTo` instead. */ + deprecated predicate hasFlowTo = flowTo/1; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink) { hasFlowTo(exprNode(sink)) } + predicate flowToExpr(DataFlowExpr sink) { flowTo(exprNode(sink)) } + + /** DEPRECATED: Use `flowToExpr` instead. */ + deprecated predicate hasFlowToExpr = flowToExpr/1; private predicate finalStats( boolean fwd, int nodes, int fields, int conscand, int states, int tuples @@ -4574,7 +4586,7 @@ module Impl { * * To use this in a `path-problem` query, import the module `PartialPathGraph`. */ - predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + predicate partialFlow(PartialPathNode source, PartialPathNode node, int dist) { partialFlow(source, node) and dist = node.getSourceDistance() } @@ -4594,7 +4606,7 @@ module Impl { * Note that reverse flow has slightly lower precision than the corresponding * forward flow, as reverse flow disregards type pruning among other features. */ - predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + predicate partialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { revPartialFlow(node, sink) and dist = node.getSinkDistance() } diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl1.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl1.qll index e6bdc74cceb..8415c022111 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl1.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl1.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll index e6bdc74cceb..8415c022111 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImpl2.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplForStringsNewReplacer.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplForStringsNewReplacer.qll index e6bdc74cceb..8415c022111 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplForStringsNewReplacer.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlowImplForStringsNewReplacer.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTracking.qll b/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTracking.qll index 7f96fe5e6fb..192a52f44e3 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTracking.qll @@ -35,7 +35,7 @@ private module AddTaintDefaults imp /** * Constructs a standard taint tracking computation. */ -module Make implements DataFlow::DataFlowSig { +module Global implements DataFlow::DataFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -48,10 +48,15 @@ module Make implements DataFlow::DataFlowSig { import DataFlowInternal::Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlow::DataFlowSig { + import Global +} + /** * Constructs a taint tracking computation using flow state. */ -module MakeWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::DataFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -62,3 +67,8 @@ module MakeWithState implements DataFlow::DataF import DataFlowInternal::Impl } + +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlow::DataFlowSig { + import GlobalWithState +} diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll index e6bdc74cceb..8415c022111 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll index e6bdc74cceb..8415c022111 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll index e6bdc74cceb..8415c022111 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl4.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll index e6bdc74cceb..8415c022111 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl5.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll index e6bdc74cceb..8415c022111 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl6.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll index 617362ab4f0..82714ed1af6 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll @@ -2,7 +2,7 @@ * Provides an implementation of global (interprocedural) data flow. This file * re-exports the local (intraprocedural) data flow analysis from * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed - * through the `Make` and `MakeWithState` modules. + * through the `Global` and `GlobalWithState` modules. */ private import DataFlowImplCommon @@ -73,10 +73,10 @@ signature module ConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -166,10 +166,10 @@ signature module StateConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -182,7 +182,7 @@ signature module StateConfigSig { } /** - * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * Gets the exploration limit for `partialFlow` and `partialFlowRev` * measured in approximate number of interprocedural steps. */ signature int explorationLimitSig(); @@ -203,28 +203,28 @@ signature module DataFlowSig { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink); + predicate flowPath(PathNode source, PathNode sink); /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink); + predicate flow(Node source, Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink); + predicate flowTo(Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink); + predicate flowToExpr(DataFlowExpr sink); } /** * Constructs a standard data flow computation. */ -module Make implements DataFlowSig { +module Global implements DataFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -233,10 +233,15 @@ module Make implements DataFlowSig { import Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlowSig { + import Global +} + /** * Constructs a data flow computation using flow state. */ -module MakeWithState implements DataFlowSig { +module GlobalWithState implements DataFlowSig { private module C implements FullStateConfigSig { import Config } @@ -244,6 +249,11 @@ module MakeWithState implements DataFlowSig { import Impl } +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlowSig { + import GlobalWithState +} + signature class PathNodeSig { /** Gets a textual representation of this element. */ string toString(); diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll index c47b0308855..d18ef5acd6e 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl.qll @@ -91,10 +91,10 @@ signature module FullStateConfigSig { */ FlowFeature getAFeature(); - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ predicate sourceGrouping(Node source, string sourceGroup); - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ predicate sinkGrouping(Node sink, string sinkGroup); /** @@ -3633,7 +3633,7 @@ module Impl { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink) { + predicate flowPath(PathNode source, PathNode sink) { exists(PathNodeImpl flowsource, PathNodeImpl flowsink | source = flowsource and sink = flowsink | @@ -3643,6 +3643,9 @@ module Impl { ) } + /** DEPRECATED: Use `flowPath` instead. */ + deprecated predicate hasFlowPath = flowPath/2; + private predicate flowsTo(PathNodeImpl flowsource, PathNodeSink flowsink, Node source, Node sink) { flowsource.isSource() and flowsource.getNodeEx().asNode() = source and @@ -3653,17 +3656,26 @@ module Impl { /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink) { flowsTo(_, _, source, sink) } + predicate flow(Node source, Node sink) { flowsTo(_, _, source, sink) } + + /** DEPRECATED: Use `flow` instead. */ + deprecated predicate hasFlow = flow/2; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + predicate flowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + + /** DEPRECATED: Use `flowTo` instead. */ + deprecated predicate hasFlowTo = flowTo/1; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink) { hasFlowTo(exprNode(sink)) } + predicate flowToExpr(DataFlowExpr sink) { flowTo(exprNode(sink)) } + + /** DEPRECATED: Use `flowToExpr` instead. */ + deprecated predicate hasFlowToExpr = flowToExpr/1; private predicate finalStats( boolean fwd, int nodes, int fields, int conscand, int states, int tuples @@ -4574,7 +4586,7 @@ module Impl { * * To use this in a `path-problem` query, import the module `PartialPathGraph`. */ - predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + predicate partialFlow(PartialPathNode source, PartialPathNode node, int dist) { partialFlow(source, node) and dist = node.getSourceDistance() } @@ -4594,7 +4606,7 @@ module Impl { * Note that reverse flow has slightly lower precision than the corresponding * forward flow, as reverse flow disregards type pruning among other features. */ - predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + predicate partialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { revPartialFlow(node, sink) and dist = node.getSinkDistance() } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl1.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl1.qll index e6bdc74cceb..8415c022111 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl1.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl1.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl2.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl2.qll index e6bdc74cceb..8415c022111 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl2.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl2.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl3.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl3.qll index e6bdc74cceb..8415c022111 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl3.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl3.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl4.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl4.qll index e6bdc74cceb..8415c022111 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl4.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImpl4.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplForRegExp.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplForRegExp.qll index e6bdc74cceb..8415c022111 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplForRegExp.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplForRegExp.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTracking.qll b/python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTracking.qll index 7f96fe5e6fb..192a52f44e3 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTracking.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTracking.qll @@ -35,7 +35,7 @@ private module AddTaintDefaults imp /** * Constructs a standard taint tracking computation. */ -module Make implements DataFlow::DataFlowSig { +module Global implements DataFlow::DataFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -48,10 +48,15 @@ module Make implements DataFlow::DataFlowSig { import DataFlowInternal::Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlow::DataFlowSig { + import Global +} + /** * Constructs a taint tracking computation using flow state. */ -module MakeWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::DataFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -62,3 +67,8 @@ module MakeWithState implements DataFlow::DataF import DataFlowInternal::Impl } + +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlow::DataFlowSig { + import GlobalWithState +} diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll index 617362ab4f0..82714ed1af6 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll @@ -2,7 +2,7 @@ * Provides an implementation of global (interprocedural) data flow. This file * re-exports the local (intraprocedural) data flow analysis from * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed - * through the `Make` and `MakeWithState` modules. + * through the `Global` and `GlobalWithState` modules. */ private import DataFlowImplCommon @@ -73,10 +73,10 @@ signature module ConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -166,10 +166,10 @@ signature module StateConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -182,7 +182,7 @@ signature module StateConfigSig { } /** - * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * Gets the exploration limit for `partialFlow` and `partialFlowRev` * measured in approximate number of interprocedural steps. */ signature int explorationLimitSig(); @@ -203,28 +203,28 @@ signature module DataFlowSig { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink); + predicate flowPath(PathNode source, PathNode sink); /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink); + predicate flow(Node source, Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink); + predicate flowTo(Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink); + predicate flowToExpr(DataFlowExpr sink); } /** * Constructs a standard data flow computation. */ -module Make implements DataFlowSig { +module Global implements DataFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -233,10 +233,15 @@ module Make implements DataFlowSig { import Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlowSig { + import Global +} + /** * Constructs a data flow computation using flow state. */ -module MakeWithState implements DataFlowSig { +module GlobalWithState implements DataFlowSig { private module C implements FullStateConfigSig { import Config } @@ -244,6 +249,11 @@ module MakeWithState implements DataFlowSig { import Impl } +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlowSig { + import GlobalWithState +} + signature class PathNodeSig { /** Gets a textual representation of this element. */ string toString(); diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll index c47b0308855..d18ef5acd6e 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl.qll @@ -91,10 +91,10 @@ signature module FullStateConfigSig { */ FlowFeature getAFeature(); - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ predicate sourceGrouping(Node source, string sourceGroup); - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ predicate sinkGrouping(Node sink, string sinkGroup); /** @@ -3633,7 +3633,7 @@ module Impl { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink) { + predicate flowPath(PathNode source, PathNode sink) { exists(PathNodeImpl flowsource, PathNodeImpl flowsink | source = flowsource and sink = flowsink | @@ -3643,6 +3643,9 @@ module Impl { ) } + /** DEPRECATED: Use `flowPath` instead. */ + deprecated predicate hasFlowPath = flowPath/2; + private predicate flowsTo(PathNodeImpl flowsource, PathNodeSink flowsink, Node source, Node sink) { flowsource.isSource() and flowsource.getNodeEx().asNode() = source and @@ -3653,17 +3656,26 @@ module Impl { /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink) { flowsTo(_, _, source, sink) } + predicate flow(Node source, Node sink) { flowsTo(_, _, source, sink) } + + /** DEPRECATED: Use `flow` instead. */ + deprecated predicate hasFlow = flow/2; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + predicate flowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + + /** DEPRECATED: Use `flowTo` instead. */ + deprecated predicate hasFlowTo = flowTo/1; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink) { hasFlowTo(exprNode(sink)) } + predicate flowToExpr(DataFlowExpr sink) { flowTo(exprNode(sink)) } + + /** DEPRECATED: Use `flowToExpr` instead. */ + deprecated predicate hasFlowToExpr = flowToExpr/1; private predicate finalStats( boolean fwd, int nodes, int fields, int conscand, int states, int tuples @@ -4574,7 +4586,7 @@ module Impl { * * To use this in a `path-problem` query, import the module `PartialPathGraph`. */ - predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + predicate partialFlow(PartialPathNode source, PartialPathNode node, int dist) { partialFlow(source, node) and dist = node.getSourceDistance() } @@ -4594,7 +4606,7 @@ module Impl { * Note that reverse flow has slightly lower precision than the corresponding * forward flow, as reverse flow disregards type pruning among other features. */ - predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + predicate partialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { revPartialFlow(node, sink) and dist = node.getSinkDistance() } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl1.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl1.qll index e6bdc74cceb..8415c022111 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl1.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl1.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl2.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl2.qll index e6bdc74cceb..8415c022111 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl2.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImpl2.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForHttpClientLibraries.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForHttpClientLibraries.qll index e6bdc74cceb..8415c022111 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForHttpClientLibraries.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForHttpClientLibraries.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForPathname.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForPathname.qll index e6bdc74cceb..8415c022111 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForPathname.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplForPathname.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTracking.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTracking.qll index 7f96fe5e6fb..192a52f44e3 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTracking.qll @@ -35,7 +35,7 @@ private module AddTaintDefaults imp /** * Constructs a standard taint tracking computation. */ -module Make implements DataFlow::DataFlowSig { +module Global implements DataFlow::DataFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -48,10 +48,15 @@ module Make implements DataFlow::DataFlowSig { import DataFlowInternal::Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlow::DataFlowSig { + import Global +} + /** * Constructs a taint tracking computation using flow state. */ -module MakeWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::DataFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -62,3 +67,8 @@ module MakeWithState implements DataFlow::DataF import DataFlowInternal::Impl } + +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlow::DataFlowSig { + import GlobalWithState +} diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll index 617362ab4f0..82714ed1af6 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll @@ -2,7 +2,7 @@ * Provides an implementation of global (interprocedural) data flow. This file * re-exports the local (intraprocedural) data flow analysis from * `DataFlowImplSpecific::Public` and adds a global analysis, mainly exposed - * through the `Make` and `MakeWithState` modules. + * through the `Global` and `GlobalWithState` modules. */ private import DataFlowImplCommon @@ -73,10 +73,10 @@ signature module ConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -166,10 +166,10 @@ signature module StateConfigSig { */ default FlowFeature getAFeature() { none() } - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ default predicate sourceGrouping(Node source, string sourceGroup) { none() } - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ default predicate sinkGrouping(Node sink, string sinkGroup) { none() } /** @@ -182,7 +182,7 @@ signature module StateConfigSig { } /** - * Gets the exploration limit for `hasPartialFlow` and `hasPartialFlowRev` + * Gets the exploration limit for `partialFlow` and `partialFlowRev` * measured in approximate number of interprocedural steps. */ signature int explorationLimitSig(); @@ -203,28 +203,28 @@ signature module DataFlowSig { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink); + predicate flowPath(PathNode source, PathNode sink); /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink); + predicate flow(Node source, Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink); + predicate flowTo(Node sink); /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink); + predicate flowToExpr(DataFlowExpr sink); } /** * Constructs a standard data flow computation. */ -module Make implements DataFlowSig { +module Global implements DataFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -233,10 +233,15 @@ module Make implements DataFlowSig { import Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlowSig { + import Global +} + /** * Constructs a data flow computation using flow state. */ -module MakeWithState implements DataFlowSig { +module GlobalWithState implements DataFlowSig { private module C implements FullStateConfigSig { import Config } @@ -244,6 +249,11 @@ module MakeWithState implements DataFlowSig { import Impl } +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlowSig { + import GlobalWithState +} + signature class PathNodeSig { /** Gets a textual representation of this element. */ string toString(); diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll index c47b0308855..d18ef5acd6e 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl.qll @@ -91,10 +91,10 @@ signature module FullStateConfigSig { */ FlowFeature getAFeature(); - /** Holds if sources should be grouped in the result of `hasFlowPath`. */ + /** Holds if sources should be grouped in the result of `flowPath`. */ predicate sourceGrouping(Node source, string sourceGroup); - /** Holds if sinks should be grouped in the result of `hasFlowPath`. */ + /** Holds if sinks should be grouped in the result of `flowPath`. */ predicate sinkGrouping(Node sink, string sinkGroup); /** @@ -3633,7 +3633,7 @@ module Impl { * The corresponding paths are generated from the end-points and the graph * included in the module `PathGraph`. */ - predicate hasFlowPath(PathNode source, PathNode sink) { + predicate flowPath(PathNode source, PathNode sink) { exists(PathNodeImpl flowsource, PathNodeImpl flowsink | source = flowsource and sink = flowsink | @@ -3643,6 +3643,9 @@ module Impl { ) } + /** DEPRECATED: Use `flowPath` instead. */ + deprecated predicate hasFlowPath = flowPath/2; + private predicate flowsTo(PathNodeImpl flowsource, PathNodeSink flowsink, Node source, Node sink) { flowsource.isSource() and flowsource.getNodeEx().asNode() = source and @@ -3653,17 +3656,26 @@ module Impl { /** * Holds if data can flow from `source` to `sink`. */ - predicate hasFlow(Node source, Node sink) { flowsTo(_, _, source, sink) } + predicate flow(Node source, Node sink) { flowsTo(_, _, source, sink) } + + /** DEPRECATED: Use `flow` instead. */ + deprecated predicate hasFlow = flow/2; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + predicate flowTo(Node sink) { sink = any(PathNodeSink n).getNodeEx().asNode() } + + /** DEPRECATED: Use `flowTo` instead. */ + deprecated predicate hasFlowTo = flowTo/1; /** * Holds if data can flow from some source to `sink`. */ - predicate hasFlowToExpr(DataFlowExpr sink) { hasFlowTo(exprNode(sink)) } + predicate flowToExpr(DataFlowExpr sink) { flowTo(exprNode(sink)) } + + /** DEPRECATED: Use `flowToExpr` instead. */ + deprecated predicate hasFlowToExpr = flowToExpr/1; private predicate finalStats( boolean fwd, int nodes, int fields, int conscand, int states, int tuples @@ -4574,7 +4586,7 @@ module Impl { * * To use this in a `path-problem` query, import the module `PartialPathGraph`. */ - predicate hasPartialFlow(PartialPathNode source, PartialPathNode node, int dist) { + predicate partialFlow(PartialPathNode source, PartialPathNode node, int dist) { partialFlow(source, node) and dist = node.getSourceDistance() } @@ -4594,7 +4606,7 @@ module Impl { * Note that reverse flow has slightly lower precision than the corresponding * forward flow, as reverse flow disregards type pruning among other features. */ - predicate hasPartialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { + predicate partialFlowRev(PartialPathNode node, PartialPathNode sink, int dist) { revPartialFlow(node, sink) and dist = node.getSinkDistance() } diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl1.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl1.qll index e6bdc74cceb..8415c022111 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl1.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlowImpl1.qll @@ -1,5 +1,5 @@ /** - * DEPRECATED: Use `Make` and `MakeWithState` instead. + * DEPRECATED: Use `Global` and `GlobalWithState` instead. * * Provides a `Configuration` class backwards-compatible interface to the data * flow library. @@ -388,7 +388,7 @@ private predicate hasFlow(Node source, Node sink, Configuration config) { } private predicate hasFlowPath(PathNode source, PathNode sink, Configuration config) { - hasFlowPath(source, sink) and source.getConfiguration() = config + flowPath(source, sink) and source.getConfiguration() = config } private predicate hasFlowTo(Node sink, Configuration config) { hasFlow(_, sink, config) } diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTracking.qll b/swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTracking.qll index 7f96fe5e6fb..192a52f44e3 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTracking.qll @@ -35,7 +35,7 @@ private module AddTaintDefaults imp /** * Constructs a standard taint tracking computation. */ -module Make implements DataFlow::DataFlowSig { +module Global implements DataFlow::DataFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -48,10 +48,15 @@ module Make implements DataFlow::DataFlowSig { import DataFlowInternal::Impl } +/** DEPRECATED: Use `Global` instead. */ +deprecated module Make implements DataFlow::DataFlowSig { + import Global +} + /** * Constructs a taint tracking computation using flow state. */ -module MakeWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::DataFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -62,3 +67,8 @@ module MakeWithState implements DataFlow::DataF import DataFlowInternal::Impl } + +/** DEPRECATED: Use `GlobalWithState` instead. */ +deprecated module MakeWithState implements DataFlow::DataFlowSig { + import GlobalWithState +} From ec34d4435951550dc67b3ed3dbdbde9ea56e5549 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 23 Mar 2023 11:55:11 +0100 Subject: [PATCH 101/143] Java: Rename references. --- .../frameworks/android/OnActivityResultSource.qll | 4 ++-- .../java/frameworks/google/GoogleHttpClientApi.qll | 4 ++-- .../frameworks/jackson/JacksonSerializability.qll | 4 ++-- .../security/AndroidSensitiveCommunicationQuery.qll | 2 +- .../java/security/ArbitraryApkInstallationQuery.qll | 10 +++++----- .../code/java/security/FragmentInjectionQuery.qll | 2 +- .../IntentUriPermissionManipulationQuery.qll | 2 +- .../semmle/code/java/security/LogInjectionQuery.qll | 2 +- .../code/java/security/RequestForgeryConfig.qll | 2 +- .../code/java/security/RsaWithoutOaepQuery.qll | 2 +- .../code/java/security/SensitiveLoggingQuery.qll | 2 +- .../security/UnsafeContentUriResolutionQuery.qll | 2 +- java/ql/lib/semmle/code/java/security/XSS.qll | 4 ++-- .../lib/semmle/code/java/security/XxeLocalQuery.qll | 2 +- .../lib/semmle/code/java/security/XxeRemoteQuery.qll | 2 +- .../java/security/regexp/PolynomialReDoSQuery.qll | 2 +- java/ql/src/Security/CWE/CWE-022/TaintedPath.ql | 6 +++--- java/ql/src/Security/CWE/CWE-022/TaintedPathLocal.ql | 6 +++--- java/ql/src/Security/CWE/CWE-022/ZipSlip.ql | 4 ++-- java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql | 4 ++-- java/ql/src/Security/CWE/CWE-079/XSS.ql | 4 ++-- java/ql/src/Security/CWE/CWE-079/XSSLocal.ql | 4 ++-- java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql | 4 ++-- java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql | 4 ++-- java/ql/src/Security/CWE/CWE-090/LdapInjection.ql | 2 +- .../ql/src/Security/CWE/CWE-090/LdapInjectionLib.qll | 2 +- .../Security/CWE/CWE-094/ArbitraryApkInstallation.ql | 2 +- .../Security/CWE/CWE-094/InsecureBeanValidation.ql | 4 ++-- .../ql/src/Security/CWE/CWE-113/ResponseSplitting.ql | 4 ++-- .../Security/CWE/CWE-113/ResponseSplittingLocal.ql | 4 ++-- java/ql/src/Security/CWE/CWE-117/LogInjection.ql | 2 +- .../CWE-129/ImproperValidationOfArrayConstruction.ql | 4 ++-- ...operValidationOfArrayConstructionCodeSpecified.ql | 4 ++-- .../ImproperValidationOfArrayConstructionLocal.ql | 4 ++-- .../CWE/CWE-129/ImproperValidationOfArrayIndex.ql | 4 ++-- .../ImproperValidationOfArrayIndexCodeSpecified.ql | 4 ++-- .../CWE-129/ImproperValidationOfArrayIndexLocal.ql | 4 ++-- .../CWE/CWE-134/ExternallyControlledFormatString.ql | 4 ++-- .../CWE-134/ExternallyControlledFormatStringLocal.ql | 4 ++-- .../ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql | 8 ++++---- .../Security/CWE/CWE-190/ArithmeticTaintedLocal.ql | 8 ++++---- .../Security/CWE/CWE-190/ArithmeticUncontrolled.ql | 8 ++++---- .../CWE/CWE-190/ArithmeticWithExtremeValues.ql | 8 ++++---- .../AndroidWebViewSettingsAllowsContentAccess.ql | 4 ++-- .../CWE/CWE-200/TempDirLocalInformationDisclosure.ql | 8 ++++---- .../src/Security/CWE/CWE-209/StackTraceExposure.ql | 12 ++++++------ .../CWE/CWE-266/IntentUriPermissionManipulation.ql | 2 +- .../CWE/CWE-297/UnsafeHostnameVerification.ql | 4 ++-- .../Security/CWE/CWE-327/BrokenCryptoAlgorithm.ql | 4 ++-- .../CWE/CWE-327/MaybeBrokenCryptoAlgorithm.ql | 4 ++-- .../CWE/CWE-441/UnsafeContentUriResolution.ql | 2 +- .../ql/src/Security/CWE/CWE-470/FragmentInjection.ql | 2 +- java/ql/src/Security/CWE/CWE-532/SensitiveInfoLog.ql | 2 +- java/ql/src/Security/CWE/CWE-601/UrlRedirect.ql | 4 ++-- java/ql/src/Security/CWE/CWE-601/UrlRedirectLocal.ql | 4 ++-- java/ql/src/Security/CWE/CWE-611/XXE.ql | 2 +- java/ql/src/Security/CWE/CWE-611/XXELocal.ql | 2 +- java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql | 4 ++-- java/ql/src/Security/CWE/CWE-643/XPathInjection.ql | 4 ++-- .../src/Security/CWE/CWE-681/NumericCastTainted.ql | 4 ++-- .../Security/CWE/CWE-681/NumericCastTaintedLocal.ql | 4 ++-- java/ql/src/Security/CWE/CWE-730/PolynomialReDoS.ql | 2 +- java/ql/src/Security/CWE/CWE-780/RsaWithoutOaep.ql | 2 +- .../Security/CWE/CWE-807/TaintedPermissionsCheck.ql | 4 ++-- java/ql/src/Security/CWE/CWE-918/RequestForgery.ql | 2 +- .../Security/CWE/CWE-927/SensitiveCommunication.ql | 2 +- java/ql/test/TestUtilities/InlineFlowTest.qll | 8 ++++---- .../library-tests/dataflow/inoutbarriers/test.ql | 8 ++++---- java/ql/test/library-tests/dataflow/partial/test.ql | 4 ++-- .../test/library-tests/dataflow/partial/testRev.ql | 4 ++-- java/ql/test/library-tests/dataflow/state/test.ql | 8 ++++---- .../security/CWE-094/ApkInstallationTest.ql | 2 +- .../query-tests/security/CWE-117/LogInjectionTest.ql | 2 +- .../CWE-266/IntentUriPermissionManipulationTest.ql | 2 +- .../CWE-441/UnsafeContentUriResolutionTest.ql | 2 +- .../security/CWE-470/FragmentInjectionTest.ql | 2 +- .../query-tests/security/CWE-532/SensitiveLogInfo.ql | 2 +- .../query-tests/security/CWE-730/PolynomialReDoS.ql | 2 +- .../security/CWE-780/RsaWithoutOaepTest.ql | 2 +- .../query-tests/security/CWE-918/RequestForgery.ql | 2 +- .../security/CWE-927/SensitiveCommunication.ql | 2 +- 81 files changed, 152 insertions(+), 152 deletions(-) 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 8512308f241..c487c6cecc2 100644 --- a/java/ql/lib/semmle/code/java/frameworks/android/OnActivityResultSource.qll +++ b/java/ql/lib/semmle/code/java/frameworks/android/OnActivityResultSource.qll @@ -28,7 +28,7 @@ class OnActivityResultIncomingIntent extends DataFlow::Node { */ predicate isRemoteSource() { exists(RefType startingType, Expr startActivityForResultArg | - ImplicitStartActivityForResult::hasFlowToExpr(startActivityForResultArg) and + ImplicitStartActivityForResult::flowToExpr(startActivityForResultArg) and // startingType is the class enclosing the method that calls `startActivityForResult`. startingType = startActivityForResultArg.getEnclosingCallable().getDeclaringType() | @@ -104,7 +104,7 @@ private module ImplicitStartActivityForResultConfig implements DataFlow::ConfigS } private module ImplicitStartActivityForResult = - DataFlow::Make; + DataFlow::Global; /** An Android Activity or Fragment. */ private class ActivityOrFragment extends Class { diff --git a/java/ql/lib/semmle/code/java/frameworks/google/GoogleHttpClientApi.qll b/java/ql/lib/semmle/code/java/frameworks/google/GoogleHttpClientApi.qll index 72516e5427e..2793f1980c5 100644 --- a/java/ql/lib/semmle/code/java/frameworks/google/GoogleHttpClientApi.qll +++ b/java/ql/lib/semmle/code/java/frameworks/google/GoogleHttpClientApi.qll @@ -21,10 +21,10 @@ private module TypeLiteralToParseAsFlowConfig implements DataFlow::ConfigSig { } } -private module TypeLiteralToParseAsFlow = DataFlow::Make; +private module TypeLiteralToParseAsFlow = DataFlow::Global; private TypeLiteral getSourceWithFlowToParseAs() { - TypeLiteralToParseAsFlow::hasFlow(DataFlow::exprNode(result), _) + TypeLiteralToParseAsFlow::flow(DataFlow::exprNode(result), _) } /** A field that is deserialized by `HttpResponse.parseAs`. */ 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 e26d2312f1b..79fd19f4ef2 100644 --- a/java/ql/lib/semmle/code/java/frameworks/jackson/JacksonSerializability.qll +++ b/java/ql/lib/semmle/code/java/frameworks/jackson/JacksonSerializability.qll @@ -108,10 +108,10 @@ private module TypeLiteralToJacksonDatabindFlowConfig implements DataFlow::Confi } private module TypeLiteralToJacksonDatabindFlow = - DataFlow::Make; + DataFlow::Global; private TypeLiteral getSourceWithFlowToJacksonDatabind() { - TypeLiteralToJacksonDatabindFlow::hasFlow(DataFlow::exprNode(result), _) + TypeLiteralToJacksonDatabindFlow::flow(DataFlow::exprNode(result), _) } /** A type whose values are explicitly deserialized in a call to a Jackson method. */ diff --git a/java/ql/lib/semmle/code/java/security/AndroidSensitiveCommunicationQuery.qll b/java/ql/lib/semmle/code/java/security/AndroidSensitiveCommunicationQuery.qll index 2855f5989cf..e0c9fbff800 100644 --- a/java/ql/lib/semmle/code/java/security/AndroidSensitiveCommunicationQuery.qll +++ b/java/ql/lib/semmle/code/java/security/AndroidSensitiveCommunicationQuery.qll @@ -173,4 +173,4 @@ private module SensitiveCommunicationConfig implements DataFlow::ConfigSig { /** * Tracks taint flow from variables containing sensitive information to broadcast Intents. */ -module SensitiveCommunicationFlow = TaintTracking::Make; +module SensitiveCommunicationFlow = TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/ArbitraryApkInstallationQuery.qll b/java/ql/lib/semmle/code/java/security/ArbitraryApkInstallationQuery.qll index 68b16f7f902..c44db421301 100644 --- a/java/ql/lib/semmle/code/java/security/ArbitraryApkInstallationQuery.qll +++ b/java/ql/lib/semmle/code/java/security/ArbitraryApkInstallationQuery.qll @@ -17,15 +17,15 @@ private module ApkInstallationConfig implements DataFlow::ConfigSig { ma.getMethod() instanceof SetDataMethod and ma.getArgument(0) = node.asExpr() and ( - PackageArchiveMimeTypeFlow::hasFlowToExpr(ma.getQualifier()) + PackageArchiveMimeTypeFlow::flowToExpr(ma.getQualifier()) or - InstallPackageActionFlow::hasFlowToExpr(ma.getQualifier()) + InstallPackageActionFlow::flowToExpr(ma.getQualifier()) ) ) } } -module ApkInstallationFlow = DataFlow::Make; +module ApkInstallationFlow = DataFlow::Global; private newtype ActionState = ActionUnset() or @@ -72,7 +72,7 @@ private module InstallPackageActionConfig implements DataFlow::StateConfigSig { predicate isBarrier(DataFlow::Node node, FlowState state) { none() } } -private module InstallPackageActionFlow = TaintTracking::MakeWithState; +private module InstallPackageActionFlow = TaintTracking::GlobalWithState; private newtype MimeTypeState = MimeTypeUnset() or @@ -117,4 +117,4 @@ private module PackageArchiveMimeTypeConfig implements DataFlow::StateConfigSig } private module PackageArchiveMimeTypeFlow = - TaintTracking::MakeWithState; + TaintTracking::GlobalWithState; diff --git a/java/ql/lib/semmle/code/java/security/FragmentInjectionQuery.qll b/java/ql/lib/semmle/code/java/security/FragmentInjectionQuery.qll index 7564993c1ed..94b1877a4a3 100644 --- a/java/ql/lib/semmle/code/java/security/FragmentInjectionQuery.qll +++ b/java/ql/lib/semmle/code/java/security/FragmentInjectionQuery.qll @@ -37,4 +37,4 @@ private module FragmentInjectionTaintConfig implements DataFlow::ConfigSig { * Taint-tracking flow for unsafe user input * that is used to create Android fragments dynamically. */ -module FragmentInjectionTaintFlow = TaintTracking::Make; +module FragmentInjectionTaintFlow = TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/IntentUriPermissionManipulationQuery.qll b/java/ql/lib/semmle/code/java/security/IntentUriPermissionManipulationQuery.qll index d23a0c8ae4b..970cb4867fd 100644 --- a/java/ql/lib/semmle/code/java/security/IntentUriPermissionManipulationQuery.qll +++ b/java/ql/lib/semmle/code/java/security/IntentUriPermissionManipulationQuery.qll @@ -53,4 +53,4 @@ private module IntentUriPermissionManipulationConfig implements DataFlow::Config * Taint tracking flow for user-provided Intents being returned to third party apps. */ module IntentUriPermissionManipulationFlow = - TaintTracking::Make; + TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/LogInjectionQuery.qll b/java/ql/lib/semmle/code/java/security/LogInjectionQuery.qll index a706da71e50..a26e08d3edc 100644 --- a/java/ql/lib/semmle/code/java/security/LogInjectionQuery.qll +++ b/java/ql/lib/semmle/code/java/security/LogInjectionQuery.qll @@ -38,4 +38,4 @@ private module LogInjectionConfig implements DataFlow::ConfigSig { /** * Taint-tracking flow for tracking untrusted user input used in log entries. */ -module LogInjectionFlow = TaintTracking::Make; +module LogInjectionFlow = TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/RequestForgeryConfig.qll b/java/ql/lib/semmle/code/java/security/RequestForgeryConfig.qll index 1f19d9640e2..9d1f9b5081e 100644 --- a/java/ql/lib/semmle/code/java/security/RequestForgeryConfig.qll +++ b/java/ql/lib/semmle/code/java/security/RequestForgeryConfig.qll @@ -53,4 +53,4 @@ private module RequestForgeryConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node node) { node instanceof RequestForgerySanitizer } } -module RequestForgeryFlow = TaintTracking::Make; +module RequestForgeryFlow = TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/RsaWithoutOaepQuery.qll b/java/ql/lib/semmle/code/java/security/RsaWithoutOaepQuery.qll index e7888afba5d..0d9df09bb74 100644 --- a/java/ql/lib/semmle/code/java/security/RsaWithoutOaepQuery.qll +++ b/java/ql/lib/semmle/code/java/security/RsaWithoutOaepQuery.qll @@ -42,4 +42,4 @@ private module RsaWithoutOaepConfig implements DataFlow::ConfigSig { } /** Flow for finding RSA ciphers initialized without using OAEP padding. */ -module RsaWithoutOaepFlow = DataFlow::Make; +module RsaWithoutOaepFlow = DataFlow::Global; diff --git a/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll b/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll index 2ca0c4b69c0..ea687d32a0a 100644 --- a/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll +++ b/java/ql/lib/semmle/code/java/security/SensitiveLoggingQuery.qll @@ -65,4 +65,4 @@ private module SensitiveLoggerConfig implements DataFlow::ConfigSig { predicate isBarrierIn(Node node) { isSource(node) } } -module SensitiveLoggerFlow = TaintTracking::Make; +module SensitiveLoggerFlow = TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/UnsafeContentUriResolutionQuery.qll b/java/ql/lib/semmle/code/java/security/UnsafeContentUriResolutionQuery.qll index f347f98c9c3..b59c4b79655 100644 --- a/java/ql/lib/semmle/code/java/security/UnsafeContentUriResolutionQuery.qll +++ b/java/ql/lib/semmle/code/java/security/UnsafeContentUriResolutionQuery.qll @@ -41,4 +41,4 @@ private module UnsafeContentResolutionConfig implements DataFlow::ConfigSig { } /** Taint-tracking flow to find paths from remote sources to content URI resolutions. */ -module UnsafeContentResolutionFlow = TaintTracking::Make; +module UnsafeContentResolutionFlow = TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/XSS.qll b/java/ql/lib/semmle/code/java/security/XSS.qll index a2efc852fd2..2680631318f 100644 --- a/java/ql/lib/semmle/code/java/security/XSS.qll +++ b/java/ql/lib/semmle/code/java/security/XSS.qll @@ -43,7 +43,7 @@ private class DefaultXssSink extends XssSink { or exists(MethodAccess ma | ma.getMethod() instanceof WritingMethod and - XssVulnerableWriterSourceToWritingMethodFlow::hasFlowToExpr(ma.getQualifier()) and + XssVulnerableWriterSourceToWritingMethodFlow::flowToExpr(ma.getQualifier()) and this.asExpr() = ma.getArgument(_) ) } @@ -71,7 +71,7 @@ private module XssVulnerableWriterSourceToWritingMethodFlowConfig implements Dat } private module XssVulnerableWriterSourceToWritingMethodFlow = - TaintTracking::Make; + TaintTracking::Global; /** A method that can be used to output data to an output stream or writer. */ private class WritingMethod extends Method { diff --git a/java/ql/lib/semmle/code/java/security/XxeLocalQuery.qll b/java/ql/lib/semmle/code/java/security/XxeLocalQuery.qll index 02d68fceb5c..d3ac09798a6 100644 --- a/java/ql/lib/semmle/code/java/security/XxeLocalQuery.qll +++ b/java/ql/lib/semmle/code/java/security/XxeLocalQuery.qll @@ -42,4 +42,4 @@ module XxeLocalConfig implements DataFlow::ConfigSig { /** * Detect taint flow of unvalidated local user input that is used in XML external entity expansion. */ -module XxeLocalFlow = TaintTracking::Make; +module XxeLocalFlow = TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/XxeRemoteQuery.qll b/java/ql/lib/semmle/code/java/security/XxeRemoteQuery.qll index 46108b7a680..06bccc993a4 100644 --- a/java/ql/lib/semmle/code/java/security/XxeRemoteQuery.qll +++ b/java/ql/lib/semmle/code/java/security/XxeRemoteQuery.qll @@ -42,4 +42,4 @@ module XxeConfig implements DataFlow::ConfigSig { /** * Detect taint flow of unvalidated remote user input that is used in XML external entity expansion. */ -module XxeFlow = TaintTracking::Make; +module XxeFlow = TaintTracking::Global; diff --git a/java/ql/lib/semmle/code/java/security/regexp/PolynomialReDoSQuery.qll b/java/ql/lib/semmle/code/java/security/regexp/PolynomialReDoSQuery.qll index b852c8393fb..e85e130e381 100644 --- a/java/ql/lib/semmle/code/java/security/regexp/PolynomialReDoSQuery.qll +++ b/java/ql/lib/semmle/code/java/security/regexp/PolynomialReDoSQuery.qll @@ -81,4 +81,4 @@ private module PolynomialRedosConfig implements DataFlow::ConfigSig { } } -module PolynomialRedosFlow = TaintTracking::Make; +module PolynomialRedosFlow = TaintTracking::Global; diff --git a/java/ql/src/Security/CWE/CWE-022/TaintedPath.ql b/java/ql/src/Security/CWE/CWE-022/TaintedPath.ql index c7c3ce0f835..4058978f29a 100644 --- a/java/ql/src/Security/CWE/CWE-022/TaintedPath.ql +++ b/java/ql/src/Security/CWE/CWE-022/TaintedPath.ql @@ -41,7 +41,7 @@ module TaintedPathConfig implements DataFlow::ConfigSig { } } -module TaintedPath = TaintTracking::Make; +module TaintedPath = TaintTracking::Global; import TaintedPath::PathGraph @@ -53,13 +53,13 @@ import TaintedPath::PathGraph * continue to report there; otherwise we report directly at `sink`. */ DataFlow::Node getReportingNode(DataFlow::Node sink) { - TaintedPath::hasFlowTo(sink) and + TaintedPath::flowTo(sink) and if exists(PathCreation pc | pc.getAnInput() = sink.asExpr()) then result.asExpr() = any(PathCreation pc | pc.getAnInput() = sink.asExpr()) else result = sink } from TaintedPath::PathNode source, TaintedPath::PathNode sink -where TaintedPath::hasFlowPath(source, sink) +where TaintedPath::flowPath(source, sink) select getReportingNode(sink.getNode()), source, sink, "This path depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-022/TaintedPathLocal.ql b/java/ql/src/Security/CWE/CWE-022/TaintedPathLocal.ql index fa62e4e6dfd..94c2b0e68a0 100644 --- a/java/ql/src/Security/CWE/CWE-022/TaintedPathLocal.ql +++ b/java/ql/src/Security/CWE/CWE-022/TaintedPathLocal.ql @@ -41,7 +41,7 @@ module TaintedPathLocalConfig implements DataFlow::ConfigSig { } } -module TaintedPathLocalFlow = TaintTracking::Make; +module TaintedPathLocalFlow = TaintTracking::Global; import TaintedPathLocalFlow::PathGraph @@ -53,13 +53,13 @@ import TaintedPathLocalFlow::PathGraph * continue to report there; otherwise we report directly at `sink`. */ DataFlow::Node getReportingNode(DataFlow::Node sink) { - TaintedPathLocalFlow::hasFlowTo(sink) and + TaintedPathLocalFlow::flowTo(sink) and if exists(PathCreation pc | pc.getAnInput() = sink.asExpr()) then result.asExpr() = any(PathCreation pc | pc.getAnInput() = sink.asExpr()) else result = sink } from TaintedPathLocalFlow::PathNode source, TaintedPathLocalFlow::PathNode sink -where TaintedPathLocalFlow::hasFlowPath(source, sink) +where TaintedPathLocalFlow::flowPath(source, sink) select getReportingNode(sink.getNode()), source, sink, "This path depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-022/ZipSlip.ql b/java/ql/src/Security/CWE/CWE-022/ZipSlip.ql index bae6311f362..b1afdfe65a4 100644 --- a/java/ql/src/Security/CWE/CWE-022/ZipSlip.ql +++ b/java/ql/src/Security/CWE/CWE-022/ZipSlip.ql @@ -44,7 +44,7 @@ module ZipSlipConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node node) { node instanceof PathInjectionSanitizer } } -module ZipSlipFlow = TaintTracking::Make; +module ZipSlipFlow = TaintTracking::Global; import ZipSlipFlow::PathGraph @@ -56,7 +56,7 @@ private class FileCreationSink extends DataFlow::Node { } from ZipSlipFlow::PathNode source, ZipSlipFlow::PathNode sink -where ZipSlipFlow::hasFlowPath(source, sink) +where ZipSlipFlow::flowPath(source, sink) select source.getNode(), source, sink, "Unsanitized archive entry, which may contain '..', is used in a $@.", sink.getNode(), "file system operation" diff --git a/java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql b/java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql index e8a80e372b7..5289ac39a9b 100644 --- a/java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql +++ b/java/ql/src/Security/CWE/CWE-078/ExecTaintedLocal.ql @@ -32,7 +32,7 @@ module LocalUserInputToArgumentToExecFlowConfig implements DataFlow::ConfigSig { } module LocalUserInputToArgumentToExecFlow = - TaintTracking::Make; + TaintTracking::Global; import LocalUserInputToArgumentToExecFlow::PathGraph @@ -40,7 +40,7 @@ from LocalUserInputToArgumentToExecFlow::PathNode source, LocalUserInputToArgumentToExecFlow::PathNode sink, ArgumentToExec execArg where - LocalUserInputToArgumentToExecFlow::hasFlowPath(source, sink) and + LocalUserInputToArgumentToExecFlow::flowPath(source, sink) and sink.getNode().asExpr() = execArg select execArg, source, sink, "This command line depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-079/XSS.ql b/java/ql/src/Security/CWE/CWE-079/XSS.ql index f2b0a65f9fe..dbec746eaf6 100644 --- a/java/ql/src/Security/CWE/CWE-079/XSS.ql +++ b/java/ql/src/Security/CWE/CWE-079/XSS.ql @@ -29,11 +29,11 @@ module XssConfig implements DataFlow::ConfigSig { } } -module XssFlow = TaintTracking::Make; +module XssFlow = TaintTracking::Global; import XssFlow::PathGraph from XssFlow::PathNode source, XssFlow::PathNode sink -where XssFlow::hasFlowPath(source, sink) +where XssFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Cross-site scripting vulnerability due to a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-079/XSSLocal.ql b/java/ql/src/Security/CWE/CWE-079/XSSLocal.ql index fd9c397f812..90bd2dccc44 100644 --- a/java/ql/src/Security/CWE/CWE-079/XSSLocal.ql +++ b/java/ql/src/Security/CWE/CWE-079/XSSLocal.ql @@ -21,11 +21,11 @@ module XssLocalConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof XssSink } } -module XssLocalFlow = TaintTracking::Make; +module XssLocalFlow = TaintTracking::Global; import XssLocalFlow::PathGraph from XssLocalFlow::PathNode source, XssLocalFlow::PathNode sink -where XssLocalFlow::hasFlowPath(source, sink) +where XssLocalFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Cross-site scripting vulnerability due to $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql b/java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql index 209d778dca8..87f478de979 100644 --- a/java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql +++ b/java/ql/src/Security/CWE/CWE-089/SqlConcatenated.ql @@ -36,7 +36,7 @@ module UncontrolledStringBuilderSourceFlowConfig implements DataFlow::ConfigSig } module UncontrolledStringBuilderSourceFlow = - TaintTracking::Make; + TaintTracking::Global; from QueryInjectionSink query, Expr uncontrolled where @@ -45,7 +45,7 @@ where or exists(StringBuilderVar sbv | uncontrolledStringBuilderQuery(sbv, uncontrolled) and - UncontrolledStringBuilderSourceFlow::hasFlow(DataFlow::exprNode(sbv.getToStringCall()), query) + UncontrolledStringBuilderSourceFlow::flow(DataFlow::exprNode(sbv.getToStringCall()), query) ) ) and not queryTaintedBy(query, _, _) diff --git a/java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql b/java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql index 0ad803533c5..34e322247c9 100644 --- a/java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql +++ b/java/ql/src/Security/CWE/CWE-089/SqlTaintedLocal.ql @@ -31,13 +31,13 @@ module LocalUserInputToQueryInjectionFlowConfig implements DataFlow::ConfigSig { } module LocalUserInputToQueryInjectionFlow = - TaintTracking::Make; + TaintTracking::Global; import LocalUserInputToQueryInjectionFlow::PathGraph from LocalUserInputToQueryInjectionFlow::PathNode source, LocalUserInputToQueryInjectionFlow::PathNode sink -where LocalUserInputToQueryInjectionFlow::hasFlowPath(source, sink) +where LocalUserInputToQueryInjectionFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This query depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-090/LdapInjection.ql b/java/ql/src/Security/CWE/CWE-090/LdapInjection.ql index 66371f161ca..e879a33051d 100644 --- a/java/ql/src/Security/CWE/CWE-090/LdapInjection.ql +++ b/java/ql/src/Security/CWE/CWE-090/LdapInjection.ql @@ -17,6 +17,6 @@ import LdapInjectionLib import LdapInjectionFlow::PathGraph from LdapInjectionFlow::PathNode source, LdapInjectionFlow::PathNode sink -where LdapInjectionFlow::hasFlowPath(source, sink) +where LdapInjectionFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This LDAP query depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-090/LdapInjectionLib.qll b/java/ql/src/Security/CWE/CWE-090/LdapInjectionLib.qll index d682e4902d8..d6ca8b1169d 100644 --- a/java/ql/src/Security/CWE/CWE-090/LdapInjectionLib.qll +++ b/java/ql/src/Security/CWE/CWE-090/LdapInjectionLib.qll @@ -17,4 +17,4 @@ module LdapInjectionFlowConfig implements DataFlow::ConfigSig { } } -module LdapInjectionFlow = TaintTracking::Make; +module LdapInjectionFlow = TaintTracking::Global; diff --git a/java/ql/src/Security/CWE/CWE-094/ArbitraryApkInstallation.ql b/java/ql/src/Security/CWE/CWE-094/ArbitraryApkInstallation.ql index aab75a8d368..3255ac99bd6 100644 --- a/java/ql/src/Security/CWE/CWE-094/ArbitraryApkInstallation.ql +++ b/java/ql/src/Security/CWE/CWE-094/ArbitraryApkInstallation.ql @@ -15,5 +15,5 @@ import semmle.code.java.security.ArbitraryApkInstallationQuery import ApkInstallationFlow::PathGraph from ApkInstallationFlow::PathNode source, ApkInstallationFlow::PathNode sink -where ApkInstallationFlow::hasFlowPath(source, sink) +where ApkInstallationFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Arbitrary Android APK installation." diff --git a/java/ql/src/Security/CWE/CWE-094/InsecureBeanValidation.ql b/java/ql/src/Security/CWE/CWE-094/InsecureBeanValidation.ql index c3a991ddcd5..5e957f23793 100644 --- a/java/ql/src/Security/CWE/CWE-094/InsecureBeanValidation.ql +++ b/java/ql/src/Security/CWE/CWE-094/InsecureBeanValidation.ql @@ -61,7 +61,7 @@ module BeanValidationConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof BeanValidationSink } } -module BeanValidationFlow = TaintTracking::Make; +module BeanValidationFlow = TaintTracking::Global; import BeanValidationFlow::PathGraph @@ -80,6 +80,6 @@ where or exists(SetMessageInterpolatorCall c | not c.isSafe()) ) and - BeanValidationFlow::hasFlowPath(source, sink) + BeanValidationFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Custom constraint error message contains an unsanitized $@.", source, "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.ql b/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.ql index b1682dd5774..4fef0a620cd 100644 --- a/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.ql +++ b/java/ql/src/Security/CWE/CWE-113/ResponseSplitting.ql @@ -42,12 +42,12 @@ module ResponseSplittingConfig implements DataFlow::ConfigSig { } } -module ResponseSplitting = TaintTracking::Make; +module ResponseSplitting = TaintTracking::Global; import ResponseSplitting::PathGraph from ResponseSplitting::PathNode source, ResponseSplitting::PathNode sink -where ResponseSplitting::hasFlowPath(source, sink) +where ResponseSplitting::flowPath(source, sink) select sink.getNode(), source, sink, "This header depends on a $@, which may cause a response-splitting vulnerability.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-113/ResponseSplittingLocal.ql b/java/ql/src/Security/CWE/CWE-113/ResponseSplittingLocal.ql index 321f5659e27..402ad1ba1bc 100644 --- a/java/ql/src/Security/CWE/CWE-113/ResponseSplittingLocal.ql +++ b/java/ql/src/Security/CWE/CWE-113/ResponseSplittingLocal.ql @@ -26,12 +26,12 @@ module ResponseSplittingLocalConfig implements DataFlow::ConfigSig { } } -module ResponseSplitting = TaintTracking::Make; +module ResponseSplitting = TaintTracking::Global; import ResponseSplitting::PathGraph from ResponseSplitting::PathNode source, ResponseSplitting::PathNode sink -where ResponseSplitting::hasFlowPath(source, sink) +where ResponseSplitting::flowPath(source, sink) select sink.getNode(), source, sink, "This header depends on a $@, which may cause a response-splitting vulnerability.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-117/LogInjection.ql b/java/ql/src/Security/CWE/CWE-117/LogInjection.ql index 61c1db901b0..dd4ffb6a10a 100644 --- a/java/ql/src/Security/CWE/CWE-117/LogInjection.ql +++ b/java/ql/src/Security/CWE/CWE-117/LogInjection.ql @@ -16,6 +16,6 @@ import semmle.code.java.security.LogInjectionQuery import LogInjectionFlow::PathGraph from LogInjectionFlow::PathNode source, LogInjectionFlow::PathNode sink -where LogInjectionFlow::hasFlowPath(source, sink) +where LogInjectionFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This log entry depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstruction.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstruction.ql index c723e7d7067..703bb23b6f5 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstruction.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstruction.ql @@ -23,7 +23,7 @@ private module ImproperValidationOfArrayConstructionConfig implements DataFlow:: } module ImproperValidationOfArrayConstructionFlow = - TaintTracking::Make; + TaintTracking::Global; import ImproperValidationOfArrayConstructionFlow::PathGraph @@ -34,7 +34,7 @@ from where arrayAccess.canThrowOutOfBoundsDueToEmptyArray(sizeExpr, arrayCreation) and sizeExpr = sink.getNode().asExpr() and - ImproperValidationOfArrayConstructionFlow::hasFlowPath(source, sink) + ImproperValidationOfArrayConstructionFlow::flowPath(source, sink) select arrayAccess.getIndexExpr(), source, sink, "This accesses the $@, but the array is initialized using a $@ which may be zero.", arrayCreation, "array", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql index a4335eeb2fe..8541074c493 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionCodeSpecified.ql @@ -27,7 +27,7 @@ module BoundedFlowSourceConfig implements DataFlow::ConfigSig { } } -module BoundedFlowSourceFlow = DataFlow::Make; +module BoundedFlowSourceFlow = DataFlow::Global; import BoundedFlowSourceFlow::PathGraph @@ -39,7 +39,7 @@ where arrayAccess.canThrowOutOfBoundsDueToEmptyArray(sizeExpr, arrayCreation) and sizeExpr = sink.getNode().asExpr() and boundedsource = source.getNode() and - BoundedFlowSourceFlow::hasFlowPath(source, sink) + BoundedFlowSourceFlow::flowPath(source, sink) select arrayAccess.getIndexExpr(), source, sink, "This accesses the $@, but the array is initialized using $@ which may be zero.", arrayCreation, "array", boundedsource, boundedsource.getDescription().toLowerCase() diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionLocal.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionLocal.ql index a1d13c3d8db..f5539e4d05b 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionLocal.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayConstructionLocal.ql @@ -24,7 +24,7 @@ module ImproperValidationOfArrayConstructionLocalConfig implements DataFlow::Con } module ImproperValidationOfArrayConstructionLocalFlow = - TaintTracking::Make; + TaintTracking::Global; import ImproperValidationOfArrayConstructionLocalFlow::PathGraph @@ -35,7 +35,7 @@ from where arrayAccess.canThrowOutOfBoundsDueToEmptyArray(sizeExpr, arrayCreation) and sizeExpr = sink.getNode().asExpr() and - ImproperValidationOfArrayConstructionLocalFlow::hasFlowPath(source, sink) + ImproperValidationOfArrayConstructionLocalFlow::flowPath(source, sink) select arrayAccess.getIndexExpr(), source, sink, "This accesses the $@, but the array is initialized using a $@ which may be zero.", arrayCreation, "array", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndex.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndex.ql index 70b23e058a5..6c6755dc484 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndex.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndex.ql @@ -25,7 +25,7 @@ module ImproperValidationOfArrayIndexConfig implements DataFlow::ConfigSig { } module ImproperValidationOfArrayIndexFlow = - TaintTracking::Make; + TaintTracking::Global; import ImproperValidationOfArrayIndexFlow::PathGraph @@ -34,7 +34,7 @@ from ImproperValidationOfArrayIndexFlow::PathNode sink, CheckableArrayAccess arrayAccess where arrayAccess.canThrowOutOfBounds(sink.getNode().asExpr()) and - ImproperValidationOfArrayIndexFlow::hasFlowPath(source, sink) + ImproperValidationOfArrayIndexFlow::flowPath(source, sink) select arrayAccess.getIndexExpr(), source, sink, "This index depends on a $@ which can cause an ArrayIndexOutOfBoundsException.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexCodeSpecified.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexCodeSpecified.ql index fd07e39b6ba..d2f8f6135a9 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexCodeSpecified.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexCodeSpecified.ql @@ -24,7 +24,7 @@ module BoundedFlowSourceConfig implements DataFlow::ConfigSig { } } -module BoundedFlowSourceFlow = DataFlow::Make; +module BoundedFlowSourceFlow = DataFlow::Global; import BoundedFlowSourceFlow::PathGraph @@ -34,7 +34,7 @@ from where arrayAccess.canThrowOutOfBounds(sink.getNode().asExpr()) and boundedsource = source.getNode() and - BoundedFlowSourceFlow::hasFlowPath(source, sink) and + BoundedFlowSourceFlow::flowPath(source, sink) and boundedsource != sink.getNode() and not ( ( diff --git a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexLocal.ql b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexLocal.ql index d57df422287..51f54eebd79 100644 --- a/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexLocal.ql +++ b/java/ql/src/Security/CWE/CWE-129/ImproperValidationOfArrayIndexLocal.ql @@ -24,7 +24,7 @@ module ImproperValidationOfArrayIndexLocalConfig implements DataFlow::ConfigSig } module ImproperValidationOfArrayIndexLocalFlow = - TaintTracking::Make; + TaintTracking::Global; import ImproperValidationOfArrayIndexLocalFlow::PathGraph @@ -33,7 +33,7 @@ from ImproperValidationOfArrayIndexLocalFlow::PathNode sink, CheckableArrayAccess arrayAccess where arrayAccess.canThrowOutOfBounds(sink.getNode().asExpr()) and - ImproperValidationOfArrayIndexLocalFlow::hasFlowPath(source, sink) + ImproperValidationOfArrayIndexLocalFlow::flowPath(source, sink) select arrayAccess.getIndexExpr(), source, sink, "This index depends on a $@ which can cause an ArrayIndexOutOfBoundsException.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-134/ExternallyControlledFormatString.ql b/java/ql/src/Security/CWE/CWE-134/ExternallyControlledFormatString.ql index da5bc5372a4..a2d2e9005ef 100644 --- a/java/ql/src/Security/CWE/CWE-134/ExternallyControlledFormatString.ql +++ b/java/ql/src/Security/CWE/CWE-134/ExternallyControlledFormatString.ql @@ -27,7 +27,7 @@ module ExternallyControlledFormatStringConfig implements DataFlow::ConfigSig { } module ExternallyControlledFormatStringFlow = - TaintTracking::Make; + TaintTracking::Global; import ExternallyControlledFormatStringFlow::PathGraph @@ -35,7 +35,7 @@ from ExternallyControlledFormatStringFlow::PathNode source, ExternallyControlledFormatStringFlow::PathNode sink, StringFormat formatCall where - ExternallyControlledFormatStringFlow::hasFlowPath(source, sink) and + ExternallyControlledFormatStringFlow::flowPath(source, sink) and sink.getNode().asExpr() = formatCall.getFormatArgument() select formatCall.getFormatArgument(), source, sink, "Format string depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-134/ExternallyControlledFormatStringLocal.ql b/java/ql/src/Security/CWE/CWE-134/ExternallyControlledFormatStringLocal.ql index 0300eaea806..56026c61cfa 100644 --- a/java/ql/src/Security/CWE/CWE-134/ExternallyControlledFormatStringLocal.ql +++ b/java/ql/src/Security/CWE/CWE-134/ExternallyControlledFormatStringLocal.ql @@ -23,7 +23,7 @@ module ExternallyControlledFormatStringLocalConfig implements DataFlow::ConfigSi } module ExternallyControlledFormatStringLocalFlow = - TaintTracking::Make; + TaintTracking::Global; import ExternallyControlledFormatStringLocalFlow::PathGraph @@ -31,7 +31,7 @@ from ExternallyControlledFormatStringLocalFlow::PathNode source, ExternallyControlledFormatStringLocalFlow::PathNode sink, StringFormat formatCall where - ExternallyControlledFormatStringLocalFlow::hasFlowPath(source, sink) and + ExternallyControlledFormatStringLocalFlow::flowPath(source, sink) and sink.getNode().asExpr() = formatCall.getFormatArgument() select formatCall.getFormatArgument(), source, sink, "Format string depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql b/java/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql index c4294e92ef0..81e572e4c4e 100644 --- a/java/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql +++ b/java/ql/src/Security/CWE/CWE-190/ArithmeticTainted.ql @@ -32,9 +32,9 @@ module RemoteUserInputUnderflowConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node n) { underflowBarrier(n) } } -module RemoteUserInputOverflow = TaintTracking::Make; +module RemoteUserInputOverflow = TaintTracking::Global; -module RemoteUserInputUnderflow = TaintTracking::Make; +module RemoteUserInputUnderflow = TaintTracking::Global; module Flow = DataFlow::MergePathGraph; + TaintTracking::Global; module ArithmeticTaintedLocalUnderflowConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof LocalUserInput } @@ -36,7 +36,7 @@ module ArithmeticTaintedLocalUnderflowConfig implements DataFlow::ConfigSig { } module ArithmeticTaintedLocalUnderflowFlow = - TaintTracking::Make; + TaintTracking::Global; module Flow = DataFlow::MergePathGraph; + TaintTracking::Global; module ArithmeticUncontrolledUnderflowConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source instanceof TaintSource } @@ -44,7 +44,7 @@ module ArithmeticUncontrolledUnderflowConfig implements DataFlow::ConfigSig { } module ArithmeticUncontrolledUnderflowFlow = - TaintTracking::Make; + TaintTracking::Global; module Flow = DataFlow::MergePathGraph; +module MaxValueFlow = DataFlow::Global; module MinValueFlowConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { @@ -59,7 +59,7 @@ module MinValueFlowConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node n) { underflowBarrier(n) } } -module MinValueFlow = DataFlow::Make; +module MinValueFlow = DataFlow::Global; module Flow = DataFlow::MergePathGraph; + TaintTracking::GlobalWithState; from Expr e where @@ -116,7 +116,7 @@ where // implicit: no setAllowContentAccess(false) exists(WebViewSource source | source.asExpr() = e and - not WebViewDisallowContentAccessFlow::hasFlow(source, _) + not WebViewDisallowContentAccessFlow::flow(source, _) ) select e, "Sensitive information may be exposed via a malicious link due to access to content:// links being allowed in this WebView." diff --git a/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql b/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql index 6d99eba59c2..400d7159b9a 100644 --- a/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql +++ b/java/ql/src/Security/CWE/CWE-200/TempDirLocalInformationDisclosure.ql @@ -133,7 +133,7 @@ module TempDirSystemGetPropertyToCreateConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof FileCreationSink and - not TempDirSystemGetPropertyDirectlyToMkdir::hasFlowTo(sink) + not TempDirSystemGetPropertyDirectlyToMkdir::flowTo(sink) } predicate isBarrier(DataFlow::Node sanitizer) { @@ -146,7 +146,7 @@ module TempDirSystemGetPropertyToCreateConfig implements DataFlow::ConfigSig { } module TempDirSystemGetPropertyToCreate = - TaintTracking::Make; + TaintTracking::Global; /** * Configuration that tracks calls to to `mkdir` or `mkdirs` that are are directly on the temp directory system property. @@ -179,7 +179,7 @@ module TempDirSystemGetPropertyDirectlyToMkdirConfig implements DataFlow::Config } module TempDirSystemGetPropertyDirectlyToMkdir = - TaintTracking::Make; + TaintTracking::Global; // // Begin configuration for tracking single-method calls that are vulnerable. @@ -270,7 +270,7 @@ import Flow::PathGraph from Flow::PathNode source, Flow::PathNode sink, string message where ( - TempDirSystemGetPropertyToCreate::hasFlowPath(source.asPathNode1(), sink.asPathNode1()) and + TempDirSystemGetPropertyToCreate::flowPath(source.asPathNode1(), sink.asPathNode1()) and message = "Local information disclosure vulnerability from $@ due to use of file or directory readable by other local users." or diff --git a/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql b/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql index be5d3dad848..0a40c11dfe9 100644 --- a/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql +++ b/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql @@ -42,7 +42,7 @@ module ServletWriterSourceToPrintStackTraceMethodFlowConfig implements DataFlow: } module ServletWriterSourceToPrintStackTraceMethodFlow = - TaintTracking::Make; + TaintTracking::Global; /** * A call that uses `Throwable.printStackTrace()` on a stream that is connected @@ -51,7 +51,7 @@ module ServletWriterSourceToPrintStackTraceMethodFlow = predicate printsStackToWriter(MethodAccess call) { exists(PrintStackTraceMethod printStackTrace | call.getMethod() = printStackTrace and - ServletWriterSourceToPrintStackTraceMethodFlow::hasFlowToExpr(call.getAnArgument()) + ServletWriterSourceToPrintStackTraceMethodFlow::flowToExpr(call.getAnArgument()) ) } @@ -87,7 +87,7 @@ module StackTraceStringToHttpResponseSinkFlowConfig implements DataFlow::ConfigS } module StackTraceStringToHttpResponseSinkFlow = - TaintTracking::Make; + TaintTracking::Global; /** * A write of stack trace data to an external stream. @@ -104,7 +104,7 @@ predicate printsStackExternally(MethodAccess call, Expr stackTrace) { predicate stringifiedStackFlowsExternally(DataFlow::Node externalExpr, Expr stackTrace) { exists(MethodAccess stackTraceString | stackTraceExpr(stackTrace, stackTraceString) and - StackTraceStringToHttpResponseSinkFlow::hasFlow(DataFlow::exprNode(stackTraceString), + StackTraceStringToHttpResponseSinkFlow::flow(DataFlow::exprNode(stackTraceString), externalExpr) ) } @@ -127,13 +127,13 @@ module GetMessageFlowSourceToHttpResponseSinkFlowConfig implements DataFlow::Con } module GetMessageFlowSourceToHttpResponseSinkFlow = - TaintTracking::Make; + TaintTracking::Global; /** * A call to `getMessage()` that then flows to a servlet response. */ predicate getMessageFlowsExternally(DataFlow::Node externalExpr, GetMessageFlowSource getMessage) { - GetMessageFlowSourceToHttpResponseSinkFlow::hasFlow(DataFlow::exprNode(getMessage), externalExpr) + GetMessageFlowSourceToHttpResponseSinkFlow::flow(DataFlow::exprNode(getMessage), externalExpr) } from Expr externalExpr, Expr errorInformation diff --git a/java/ql/src/Security/CWE/CWE-266/IntentUriPermissionManipulation.ql b/java/ql/src/Security/CWE/CWE-266/IntentUriPermissionManipulation.ql index 281415a0d91..d79abd6e417 100644 --- a/java/ql/src/Security/CWE/CWE-266/IntentUriPermissionManipulation.ql +++ b/java/ql/src/Security/CWE/CWE-266/IntentUriPermissionManipulation.ql @@ -20,7 +20,7 @@ import IntentUriPermissionManipulationFlow::PathGraph from IntentUriPermissionManipulationFlow::PathNode source, IntentUriPermissionManipulationFlow::PathNode sink -where IntentUriPermissionManipulationFlow::hasFlowPath(source, sink) +where IntentUriPermissionManipulationFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This Intent can be set with arbitrary flags from a $@, " + "and used to give access to internal content providers.", source.getNode(), diff --git a/java/ql/src/Security/CWE/CWE-297/UnsafeHostnameVerification.ql b/java/ql/src/Security/CWE/CWE-297/UnsafeHostnameVerification.ql index f6663b8e87d..4bea66796b8 100644 --- a/java/ql/src/Security/CWE/CWE-297/UnsafeHostnameVerification.ql +++ b/java/ql/src/Security/CWE/CWE-297/UnsafeHostnameVerification.ql @@ -77,7 +77,7 @@ module TrustAllHostnameVerifierConfig implements DataFlow::ConfigSig { } } -module TrustAllHostnameVerifierFlow = DataFlow::Make; +module TrustAllHostnameVerifierFlow = DataFlow::Global; import TrustAllHostnameVerifierFlow::PathGraph @@ -118,7 +118,7 @@ from TrustAllHostnameVerifierFlow::PathNode source, TrustAllHostnameVerifierFlow::PathNode sink, RefType verifier where - TrustAllHostnameVerifierFlow::hasFlowPath(source, sink) and + TrustAllHostnameVerifierFlow::flowPath(source, sink) and not isNodeGuardedByFlag(sink.getNode()) and verifier = source.getNode().asExpr().(ClassInstanceExpr).getConstructedType() select sink, source, sink, diff --git a/java/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.ql b/java/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.ql index ec7ffcbccc1..a423eed3d22 100644 --- a/java/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.ql +++ b/java/ql/src/Security/CWE/CWE-327/BrokenCryptoAlgorithm.ql @@ -38,7 +38,7 @@ module InsecureCryptoConfig implements ConfigSig { } } -module InsecureCryptoFlow = TaintTracking::Make; +module InsecureCryptoFlow = TaintTracking::Global; import InsecureCryptoFlow::PathGraph @@ -48,6 +48,6 @@ from where sink.getNode().asExpr() = c.getAlgoSpec() and source.getNode().asExpr() = s and - InsecureCryptoFlow::hasFlowPath(source, sink) + InsecureCryptoFlow::flowPath(source, sink) select c, source, sink, "Cryptographic algorithm $@ is weak and should not be used.", s, s.getValue() diff --git a/java/ql/src/Security/CWE/CWE-327/MaybeBrokenCryptoAlgorithm.ql b/java/ql/src/Security/CWE/CWE-327/MaybeBrokenCryptoAlgorithm.ql index 47446211438..b5f14421894 100644 --- a/java/ql/src/Security/CWE/CWE-327/MaybeBrokenCryptoAlgorithm.ql +++ b/java/ql/src/Security/CWE/CWE-327/MaybeBrokenCryptoAlgorithm.ql @@ -61,7 +61,7 @@ module InsecureCryptoConfig implements ConfigSig { } } -module InsecureCryptoFlow = TaintTracking::Make; +module InsecureCryptoFlow = TaintTracking::Global; import InsecureCryptoFlow::PathGraph @@ -71,7 +71,7 @@ from where sink.getNode().asExpr() = c.getAlgoSpec() and source.getNode().asExpr() = s and - InsecureCryptoFlow::hasFlowPath(source, sink) + InsecureCryptoFlow::flowPath(source, sink) select c, source, sink, "Cryptographic algorithm $@ may not be secure, consider using a different algorithm.", s, s.getValue() diff --git a/java/ql/src/Security/CWE/CWE-441/UnsafeContentUriResolution.ql b/java/ql/src/Security/CWE/CWE-441/UnsafeContentUriResolution.ql index ce90cc5e00f..4a8c9bc3ad1 100644 --- a/java/ql/src/Security/CWE/CWE-441/UnsafeContentUriResolution.ql +++ b/java/ql/src/Security/CWE/CWE-441/UnsafeContentUriResolution.ql @@ -17,7 +17,7 @@ import semmle.code.java.security.UnsafeContentUriResolutionQuery import UnsafeContentResolutionFlow::PathGraph from UnsafeContentResolutionFlow::PathNode src, UnsafeContentResolutionFlow::PathNode sink -where UnsafeContentResolutionFlow::hasFlowPath(src, sink) +where UnsafeContentResolutionFlow::flowPath(src, sink) select sink.getNode(), src, sink, "This ContentResolver method that resolves a URI depends on a $@.", src.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-470/FragmentInjection.ql b/java/ql/src/Security/CWE/CWE-470/FragmentInjection.ql index 5ffa7068980..6ff9a15eca4 100644 --- a/java/ql/src/Security/CWE/CWE-470/FragmentInjection.ql +++ b/java/ql/src/Security/CWE/CWE-470/FragmentInjection.ql @@ -16,7 +16,7 @@ import semmle.code.java.security.FragmentInjectionQuery import FragmentInjectionTaintFlow::PathGraph from FragmentInjectionTaintFlow::PathNode source, FragmentInjectionTaintFlow::PathNode sink -where FragmentInjectionTaintFlow::hasFlowPath(source, sink) +where FragmentInjectionTaintFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Fragment depends on a $@, which may allow a malicious application to bypass access controls.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-532/SensitiveInfoLog.ql b/java/ql/src/Security/CWE/CWE-532/SensitiveInfoLog.ql index a884ba6c242..9b306bc1bd1 100644 --- a/java/ql/src/Security/CWE/CWE-532/SensitiveInfoLog.ql +++ b/java/ql/src/Security/CWE/CWE-532/SensitiveInfoLog.ql @@ -16,6 +16,6 @@ import semmle.code.java.security.SensitiveLoggingQuery import SensitiveLoggerFlow::PathGraph from SensitiveLoggerFlow::PathNode source, SensitiveLoggerFlow::PathNode sink -where SensitiveLoggerFlow::hasFlowPath(source, sink) +where SensitiveLoggerFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This $@ is written to a log file.", source.getNode(), "potentially sensitive information" diff --git a/java/ql/src/Security/CWE/CWE-601/UrlRedirect.ql b/java/ql/src/Security/CWE/CWE-601/UrlRedirect.ql index cf9393830b0..78c9c86c762 100644 --- a/java/ql/src/Security/CWE/CWE-601/UrlRedirect.ql +++ b/java/ql/src/Security/CWE/CWE-601/UrlRedirect.ql @@ -21,11 +21,11 @@ module UrlRedirectConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof UrlRedirectSink } } -module UrlRedirectFlow = TaintTracking::Make; +module UrlRedirectFlow = TaintTracking::Global; import UrlRedirectFlow::PathGraph from UrlRedirectFlow::PathNode source, UrlRedirectFlow::PathNode sink -where UrlRedirectFlow::hasFlowPath(source, sink) +where UrlRedirectFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Untrusted URL redirection depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-601/UrlRedirectLocal.ql b/java/ql/src/Security/CWE/CWE-601/UrlRedirectLocal.ql index de44173ec57..d8a28f52abb 100644 --- a/java/ql/src/Security/CWE/CWE-601/UrlRedirectLocal.ql +++ b/java/ql/src/Security/CWE/CWE-601/UrlRedirectLocal.ql @@ -21,11 +21,11 @@ module UrlRedirectLocalConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof UrlRedirectSink } } -module UrlRedirectLocalFlow = TaintTracking::Make; +module UrlRedirectLocalFlow = TaintTracking::Global; import UrlRedirectLocalFlow::PathGraph from UrlRedirectLocalFlow::PathNode source, UrlRedirectLocalFlow::PathNode sink -where UrlRedirectLocalFlow::hasFlowPath(source, sink) +where UrlRedirectLocalFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Untrusted URL redirection depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-611/XXE.ql b/java/ql/src/Security/CWE/CWE-611/XXE.ql index 708d4f08ee7..5520d332ed6 100644 --- a/java/ql/src/Security/CWE/CWE-611/XXE.ql +++ b/java/ql/src/Security/CWE/CWE-611/XXE.ql @@ -19,7 +19,7 @@ import semmle.code.java.security.XxeRemoteQuery import XxeFlow::PathGraph from XxeFlow::PathNode source, XxeFlow::PathNode sink -where XxeFlow::hasFlowPath(source, sink) +where XxeFlow::flowPath(source, sink) select sink.getNode(), source, sink, "XML parsing depends on a $@ without guarding against external entity expansion.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-611/XXELocal.ql b/java/ql/src/Security/CWE/CWE-611/XXELocal.ql index 0ab4ddcc106..5e306a65349 100644 --- a/java/ql/src/Security/CWE/CWE-611/XXELocal.ql +++ b/java/ql/src/Security/CWE/CWE-611/XXELocal.ql @@ -19,7 +19,7 @@ import semmle.code.java.security.XxeLocalQuery import XxeLocalFlow::PathGraph from XxeLocalFlow::PathNode source, XxeLocalFlow::PathNode sink -where XxeLocalFlow::hasFlowPath(source, sink) +where XxeLocalFlow::flowPath(source, sink) select sink.getNode(), source, sink, "XML parsing depends on a $@ without guarding against external entity expansion.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql b/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql index 807ef383dee..0d24e9315c1 100644 --- a/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql +++ b/java/ql/src/Security/CWE/CWE-614/InsecureCookie.ql @@ -47,10 +47,10 @@ module SecureCookieConfig implements DataFlow::ConfigSig { } } -module SecureCookieFlow = DataFlow::Make; +module SecureCookieFlow = DataFlow::Global; from MethodAccess add where add.getMethod() instanceof ResponseAddCookieMethod and - not SecureCookieFlow::hasFlowToExpr(add.getArgument(0)) + not SecureCookieFlow::flowToExpr(add.getArgument(0)) select add, "Cookie is added to response without the 'secure' flag being set." diff --git a/java/ql/src/Security/CWE/CWE-643/XPathInjection.ql b/java/ql/src/Security/CWE/CWE-643/XPathInjection.ql index eacebd3f098..18a4d76873b 100644 --- a/java/ql/src/Security/CWE/CWE-643/XPathInjection.ql +++ b/java/ql/src/Security/CWE/CWE-643/XPathInjection.ql @@ -22,11 +22,11 @@ module XPathInjectionConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof XPathInjectionSink } } -module XPathInjectionFlow = TaintTracking::Make; +module XPathInjectionFlow = TaintTracking::Global; import XPathInjectionFlow::PathGraph from XPathInjectionFlow::PathNode source, XPathInjectionFlow::PathNode sink -where XPathInjectionFlow::hasFlowPath(source, sink) +where XPathInjectionFlow::flowPath(source, sink) select sink.getNode(), source, sink, "XPath expression depends on a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-681/NumericCastTainted.ql b/java/ql/src/Security/CWE/CWE-681/NumericCastTainted.ql index 3caefe3fd09..3194e0f8e7b 100644 --- a/java/ql/src/Security/CWE/CWE-681/NumericCastTainted.ql +++ b/java/ql/src/Security/CWE/CWE-681/NumericCastTainted.ql @@ -34,14 +34,14 @@ module NumericCastFlowConfig implements DataFlow::ConfigSig { } } -module NumericCastFlow = TaintTracking::Make; +module NumericCastFlow = TaintTracking::Global; import NumericCastFlow::PathGraph from NumericCastFlow::PathNode source, NumericCastFlow::PathNode sink, NumericNarrowingCastExpr exp where sink.getNode().asExpr() = exp.getExpr() and - NumericCastFlow::hasFlowPath(source, sink) + NumericCastFlow::flowPath(source, sink) select exp, source, sink, "This cast to a narrower type depends on a $@, potentially causing truncation.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-681/NumericCastTaintedLocal.ql b/java/ql/src/Security/CWE/CWE-681/NumericCastTaintedLocal.ql index 41757ab419a..b9224769562 100644 --- a/java/ql/src/Security/CWE/CWE-681/NumericCastTaintedLocal.ql +++ b/java/ql/src/Security/CWE/CWE-681/NumericCastTaintedLocal.ql @@ -32,7 +32,7 @@ module NumericCastFlowConfig implements DataFlow::ConfigSig { } } -module NumericCastFlow = TaintTracking::Make; +module NumericCastFlow = TaintTracking::Global; import NumericCastFlow::PathGraph @@ -42,7 +42,7 @@ from where exp.getExpr() = tainted and sink.getNode().asExpr() = tainted and - NumericCastFlow::hasFlowPath(source, sink) and + NumericCastFlow::flowPath(source, sink) and not exists(RightShiftOp e | e.getShiftedVariable() = tainted.getVariable()) select exp, source, sink, "This cast to a narrower type depends on a $@, potentially causing truncation.", source.getNode(), diff --git a/java/ql/src/Security/CWE/CWE-730/PolynomialReDoS.ql b/java/ql/src/Security/CWE/CWE-730/PolynomialReDoS.ql index 8a1244b93d1..2ba45ca083c 100644 --- a/java/ql/src/Security/CWE/CWE-730/PolynomialReDoS.ql +++ b/java/ql/src/Security/CWE/CWE-730/PolynomialReDoS.ql @@ -21,7 +21,7 @@ from PolynomialRedosFlow::PathNode source, PolynomialRedosFlow::PathNode sink, SuperlinearBackTracking::PolynomialBackTrackingTerm regexp where - PolynomialRedosFlow::hasFlowPath(source, sink) and + PolynomialRedosFlow::flowPath(source, sink) and regexp.getRootTerm() = sink.getNode().(PolynomialRedosSink).getRegExp() select sink, source, sink, "This $@ that depends on a $@ may run slow on strings " + regexp.getPrefixMessage() + diff --git a/java/ql/src/Security/CWE/CWE-780/RsaWithoutOaep.ql b/java/ql/src/Security/CWE/CWE-780/RsaWithoutOaep.ql index a2475202dd8..2191a4a7401 100644 --- a/java/ql/src/Security/CWE/CWE-780/RsaWithoutOaep.ql +++ b/java/ql/src/Security/CWE/CWE-780/RsaWithoutOaep.ql @@ -15,6 +15,6 @@ import semmle.code.java.security.RsaWithoutOaepQuery import RsaWithoutOaepFlow::PathGraph from RsaWithoutOaepFlow::PathNode source, RsaWithoutOaepFlow::PathNode sink -where RsaWithoutOaepFlow::hasFlowPath(source, sink) +where RsaWithoutOaepFlow::flowPath(source, sink) select source, source, sink, "This specification is used to $@ without OAEP padding.", sink, "initialize an RSA cipher" diff --git a/java/ql/src/Security/CWE/CWE-807/TaintedPermissionsCheck.ql b/java/ql/src/Security/CWE/CWE-807/TaintedPermissionsCheck.ql index bb48958443f..8debae02267 100644 --- a/java/ql/src/Security/CWE/CWE-807/TaintedPermissionsCheck.ql +++ b/java/ql/src/Security/CWE/CWE-807/TaintedPermissionsCheck.ql @@ -60,7 +60,7 @@ module TaintedPermissionsCheckFlowConfig implements DataFlow::ConfigSig { } } -module TaintedPermissionsCheckFlow = TaintTracking::Make; +module TaintedPermissionsCheckFlow = TaintTracking::Global; import TaintedPermissionsCheckFlow::PathGraph @@ -68,6 +68,6 @@ from TaintedPermissionsCheckFlow::PathNode source, TaintedPermissionsCheckFlow::PathNode sink, PermissionsConstruction p where - sink.getNode().asExpr() = p.getInput() and TaintedPermissionsCheckFlow::hasFlowPath(source, sink) + sink.getNode().asExpr() = p.getInput() and TaintedPermissionsCheckFlow::flowPath(source, sink) select p, source, sink, "Permissions check depends on a $@.", source.getNode(), "user-controlled value" diff --git a/java/ql/src/Security/CWE/CWE-918/RequestForgery.ql b/java/ql/src/Security/CWE/CWE-918/RequestForgery.ql index c3455dc4beb..570a7af54cc 100644 --- a/java/ql/src/Security/CWE/CWE-918/RequestForgery.ql +++ b/java/ql/src/Security/CWE/CWE-918/RequestForgery.ql @@ -16,6 +16,6 @@ import semmle.code.java.security.RequestForgeryConfig import RequestForgeryFlow::PathGraph from RequestForgeryFlow::PathNode source, RequestForgeryFlow::PathNode sink -where RequestForgeryFlow::hasFlowPath(source, sink) +where RequestForgeryFlow::flowPath(source, sink) select sink.getNode(), source, sink, "Potential server-side request forgery due to a $@.", source.getNode(), "user-provided value" diff --git a/java/ql/src/Security/CWE/CWE-927/SensitiveCommunication.ql b/java/ql/src/Security/CWE/CWE-927/SensitiveCommunication.ql index 59a7d827cf6..576927b1d72 100644 --- a/java/ql/src/Security/CWE/CWE-927/SensitiveCommunication.ql +++ b/java/ql/src/Security/CWE/CWE-927/SensitiveCommunication.ql @@ -16,6 +16,6 @@ import semmle.code.java.security.AndroidSensitiveCommunicationQuery import SensitiveCommunicationFlow::PathGraph from SensitiveCommunicationFlow::PathNode source, SensitiveCommunicationFlow::PathNode sink -where SensitiveCommunicationFlow::hasFlowPath(source, sink) +where SensitiveCommunicationFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This call may leak $@.", source.getNode(), "sensitive information" diff --git a/java/ql/test/TestUtilities/InlineFlowTest.qll b/java/ql/test/TestUtilities/InlineFlowTest.qll index bd4ef924da2..efc5a6fab2b 100644 --- a/java/ql/test/TestUtilities/InlineFlowTest.qll +++ b/java/ql/test/TestUtilities/InlineFlowTest.qll @@ -57,9 +57,9 @@ module DefaultFlowConfig implements DataFlow::ConfigSig { int fieldFlowBranchLimit() { result = 1000 } } -private module DefaultValueFlow = DataFlow::Make; +private module DefaultValueFlow = DataFlow::Global; -private module DefaultTaintFlow = TaintTracking::Make; +private module DefaultTaintFlow = TaintTracking::Global; class DefaultValueFlowConf extends DataFlow::Configuration { DefaultValueFlowConf() { this = "qltest:defaultValueFlowConf" } @@ -118,13 +118,13 @@ class InlineFlowTest extends InlineExpectationsTest { predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { if exists(EnableLegacyConfiguration e) then getValueFlowConfig().hasFlow(src, sink) - else DefaultValueFlow::hasFlow(src, sink) + else DefaultValueFlow::flow(src, sink) } predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { if exists(EnableLegacyConfiguration e) then getTaintFlowConfig().hasFlow(src, sink) - else DefaultTaintFlow::hasFlow(src, sink) + else DefaultTaintFlow::flow(src, sink) } DataFlow::Configuration getValueFlowConfig() { result = any(DefaultValueFlowConf config) } diff --git a/java/ql/test/library-tests/dataflow/inoutbarriers/test.ql b/java/ql/test/library-tests/dataflow/inoutbarriers/test.ql index a582f5b2456..7635dae3820 100644 --- a/java/ql/test/library-tests/dataflow/inoutbarriers/test.ql +++ b/java/ql/test/library-tests/dataflow/inoutbarriers/test.ql @@ -47,13 +47,13 @@ module Conf4 implements ConfigSig { } predicate flow(Node src, Node sink, string s) { - Make::hasFlow(src, sink) and s = "nobarrier" + Global::flow(src, sink) and s = "nobarrier" or - Make::hasFlow(src, sink) and s = "srcbarrier" + Global::flow(src, sink) and s = "srcbarrier" or - Make::hasFlow(src, sink) and s = "sinkbarrier" + Global::flow(src, sink) and s = "sinkbarrier" or - Make::hasFlow(src, sink) and s = "both" + Global::flow(src, sink) and s = "both" } from Node src, Node sink, string s diff --git a/java/ql/test/library-tests/dataflow/partial/test.ql b/java/ql/test/library-tests/dataflow/partial/test.ql index 399a876e9a9..4b2e5e71ff4 100644 --- a/java/ql/test/library-tests/dataflow/partial/test.ql +++ b/java/ql/test/library-tests/dataflow/partial/test.ql @@ -10,10 +10,10 @@ module Config implements ConfigSig { int explorationLimit() { result = 10 } -module PartialFlow = Make::FlowExploration; +module PartialFlow = Global::FlowExploration; import PartialFlow::PartialPathGraph from PartialFlow::PartialPathNode n, int dist -where PartialFlow::hasPartialFlow(_, n, dist) +where PartialFlow::partialFlow(_, n, dist) select dist, n diff --git a/java/ql/test/library-tests/dataflow/partial/testRev.ql b/java/ql/test/library-tests/dataflow/partial/testRev.ql index c869cb4f915..f3f71d69e3b 100644 --- a/java/ql/test/library-tests/dataflow/partial/testRev.ql +++ b/java/ql/test/library-tests/dataflow/partial/testRev.ql @@ -10,10 +10,10 @@ module Config implements ConfigSig { int explorationLimit() { result = 10 } -module PartialFlow = Make::FlowExploration; +module PartialFlow = Global::FlowExploration; import PartialFlow::PartialPathGraph from PartialFlow::PartialPathNode n, int dist -where PartialFlow::hasPartialFlowRev(n, _, dist) +where PartialFlow::partialFlowRev(n, _, dist) select dist, n diff --git a/java/ql/test/library-tests/dataflow/state/test.ql b/java/ql/test/library-tests/dataflow/state/test.ql index afd7ed9a97e..b82dd95c0b1 100644 --- a/java/ql/test/library-tests/dataflow/state/test.ql +++ b/java/ql/test/library-tests/dataflow/state/test.ql @@ -55,7 +55,7 @@ module Config implements DataFlow::StateConfigSig { int explorationLimit() { result = 0 } -module Flow = TaintTracking::MakeWithState; +module Flow = TaintTracking::GlobalWithState; module PartialFlow = Flow::FlowExploration; @@ -67,7 +67,7 @@ class HasFlowTest extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "flow" and exists(Flow::PathNode src, Flow::PathNode sink | - Flow::hasFlowPath(src, sink) and + Flow::flowPath(src, sink) and sink.getNode().getLocation() = location and element = sink.toString() and value = src.getState() @@ -75,7 +75,7 @@ class HasFlowTest extends InlineExpectationsTest { or tag = "pFwd" and exists(PartialFlow::PartialPathNode src, PartialFlow::PartialPathNode node | - PartialFlow::hasPartialFlow(src, node, _) and + PartialFlow::partialFlow(src, node, _) and checkNode(node.getNode()) and node.getNode().getLocation() = location and element = node.toString() and @@ -84,7 +84,7 @@ class HasFlowTest extends InlineExpectationsTest { or tag = "pRev" and exists(PartialFlow::PartialPathNode node, PartialFlow::PartialPathNode sink | - PartialFlow::hasPartialFlowRev(node, sink, _) and + PartialFlow::partialFlowRev(node, sink, _) and checkNode(node.getNode()) and node.getNode().getLocation() = location and element = node.toString() and diff --git a/java/ql/test/query-tests/security/CWE-094/ApkInstallationTest.ql b/java/ql/test/query-tests/security/CWE-094/ApkInstallationTest.ql index 1e40c0a5d25..dd6aec2ebe3 100644 --- a/java/ql/test/query-tests/security/CWE-094/ApkInstallationTest.ql +++ b/java/ql/test/query-tests/security/CWE-094/ApkInstallationTest.ql @@ -10,7 +10,7 @@ class HasApkInstallationTest extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "hasApkInstallation" and - exists(DataFlow::Node sink | ApkInstallationFlow::hasFlowTo(sink) | + exists(DataFlow::Node sink | ApkInstallationFlow::flowTo(sink) | sink.getLocation() = location and element = sink.toString() and value = "" diff --git a/java/ql/test/query-tests/security/CWE-117/LogInjectionTest.ql b/java/ql/test/query-tests/security/CWE-117/LogInjectionTest.ql index ba753b0d930..73a41b1bd8e 100644 --- a/java/ql/test/query-tests/security/CWE-117/LogInjectionTest.ql +++ b/java/ql/test/query-tests/security/CWE-117/LogInjectionTest.ql @@ -12,6 +12,6 @@ private class LogInjectionTest extends InlineFlowTest { override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { - LogInjectionFlow::hasFlow(src, sink) + LogInjectionFlow::flow(src, sink) } } diff --git a/java/ql/test/query-tests/security/CWE-266/IntentUriPermissionManipulationTest.ql b/java/ql/test/query-tests/security/CWE-266/IntentUriPermissionManipulationTest.ql index c434dbe413a..d90039cf920 100644 --- a/java/ql/test/query-tests/security/CWE-266/IntentUriPermissionManipulationTest.ql +++ b/java/ql/test/query-tests/security/CWE-266/IntentUriPermissionManipulationTest.ql @@ -6,6 +6,6 @@ class IntentUriPermissionManipulationTest extends InlineFlowTest { override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { - IntentUriPermissionManipulationFlow::hasFlow(src, sink) + IntentUriPermissionManipulationFlow::flow(src, sink) } } diff --git a/java/ql/test/query-tests/security/CWE-441/UnsafeContentUriResolutionTest.ql b/java/ql/test/query-tests/security/CWE-441/UnsafeContentUriResolutionTest.ql index 5e2046c6fbf..55c07bbd301 100644 --- a/java/ql/test/query-tests/security/CWE-441/UnsafeContentUriResolutionTest.ql +++ b/java/ql/test/query-tests/security/CWE-441/UnsafeContentUriResolutionTest.ql @@ -6,6 +6,6 @@ class Test extends InlineFlowTest { override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { - UnsafeContentResolutionFlow::hasFlow(src, sink) + UnsafeContentResolutionFlow::flow(src, sink) } } diff --git a/java/ql/test/query-tests/security/CWE-470/FragmentInjectionTest.ql b/java/ql/test/query-tests/security/CWE-470/FragmentInjectionTest.ql index 22b02c818f5..2771dd3af90 100644 --- a/java/ql/test/query-tests/security/CWE-470/FragmentInjectionTest.ql +++ b/java/ql/test/query-tests/security/CWE-470/FragmentInjectionTest.ql @@ -6,6 +6,6 @@ class Test extends InlineFlowTest { override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { - FragmentInjectionTaintFlow::hasFlow(src, sink) + FragmentInjectionTaintFlow::flow(src, sink) } } diff --git a/java/ql/test/query-tests/security/CWE-532/SensitiveLogInfo.ql b/java/ql/test/query-tests/security/CWE-532/SensitiveLogInfo.ql index b868dcabf85..5de153a9e35 100644 --- a/java/ql/test/query-tests/security/CWE-532/SensitiveLogInfo.ql +++ b/java/ql/test/query-tests/security/CWE-532/SensitiveLogInfo.ql @@ -4,7 +4,7 @@ import semmle.code.java.security.SensitiveLoggingQuery class HasFlowTest extends InlineFlowTest { override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { - SensitiveLoggerFlow::hasFlow(src, sink) + SensitiveLoggerFlow::flow(src, sink) } override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } diff --git a/java/ql/test/query-tests/security/CWE-730/PolynomialReDoS.ql b/java/ql/test/query-tests/security/CWE-730/PolynomialReDoS.ql index e31d890d908..75af0160def 100644 --- a/java/ql/test/query-tests/security/CWE-730/PolynomialReDoS.ql +++ b/java/ql/test/query-tests/security/CWE-730/PolynomialReDoS.ql @@ -9,7 +9,7 @@ class HasPolyRedos extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "hasPolyRedos" and exists(DataFlow::Node sink | - PolynomialRedosFlow::hasFlowTo(sink) and + PolynomialRedosFlow::flowTo(sink) and location = sink.getLocation() and element = sink.toString() and value = "" diff --git a/java/ql/test/query-tests/security/CWE-780/RsaWithoutOaepTest.ql b/java/ql/test/query-tests/security/CWE-780/RsaWithoutOaepTest.ql index cdfdaea621e..01af77284f0 100644 --- a/java/ql/test/query-tests/security/CWE-780/RsaWithoutOaepTest.ql +++ b/java/ql/test/query-tests/security/CWE-780/RsaWithoutOaepTest.ql @@ -7,6 +7,6 @@ class HasFlowTest extends InlineFlowTest { override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { - RsaWithoutOaepFlow::hasFlow(src, sink) + RsaWithoutOaepFlow::flow(src, sink) } } diff --git a/java/ql/test/query-tests/security/CWE-918/RequestForgery.ql b/java/ql/test/query-tests/security/CWE-918/RequestForgery.ql index b27d81ee073..865e6e8f0d3 100644 --- a/java/ql/test/query-tests/security/CWE-918/RequestForgery.ql +++ b/java/ql/test/query-tests/security/CWE-918/RequestForgery.ql @@ -10,7 +10,7 @@ class HasFlowTest extends InlineExpectationsTest { override predicate hasActualResult(Location location, string element, string tag, string value) { tag = "SSRF" and exists(DataFlow::Node sink | - RequestForgeryFlow::hasFlowTo(sink) and + RequestForgeryFlow::flowTo(sink) and sink.getLocation() = location and element = sink.toString() and value = "" diff --git a/java/ql/test/query-tests/security/CWE-927/SensitiveCommunication.ql b/java/ql/test/query-tests/security/CWE-927/SensitiveCommunication.ql index c57c316310d..0f1864398b4 100644 --- a/java/ql/test/query-tests/security/CWE-927/SensitiveCommunication.ql +++ b/java/ql/test/query-tests/security/CWE-927/SensitiveCommunication.ql @@ -7,6 +7,6 @@ class HasFlowTest extends InlineFlowTest { override predicate hasValueFlow(DataFlow::Node src, DataFlow::Node sink) { none() } override predicate hasTaintFlow(DataFlow::Node src, DataFlow::Node sink) { - SensitiveCommunicationFlow::hasFlow(src, sink) + SensitiveCommunicationFlow::flow(src, sink) } } From 72415c7c2c729901ea16295d8105043f363e4751 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 23 Mar 2023 13:00:44 +0100 Subject: [PATCH 102/143] C++: Rename references. --- .../cpp/security/PrivateCleartextWrite.qll | 2 +- .../internal/DefaultTaintTrackingImpl.qll | 20 +++++++++---------- .../cpp/security/boostorg/asio/protocols.qll | 6 +++--- cpp/ql/src/Critical/OverflowDestination.ql | 4 ++-- .../Conversion/CastArrayPointerArithmetic.ql | 4 ++-- .../Likely Bugs/Format/NonConstantFormat.ql | 4 ++-- .../Leap Year/Adding365DaysPerYear.ql | 2 +- cpp/ql/src/Likely Bugs/Leap Year/LeapYear.qll | 6 +++--- .../UncheckedLeapYearAfterYearModification.ql | 4 ++-- .../Memory Management/NtohlArrayNoBound.ql | 2 +- .../Memory Management/NtohlArrayNoBound.qll | 2 +- .../Protocols/TlsSettingsMisconfiguration.ql | 8 ++++---- .../UseOfDeprecatedHardcodedProtocol.ql | 6 +++--- .../src/Security/CWE/CWE-020/ExternalAPIs.qll | 4 ++-- .../CWE/CWE-020/ExternalAPIsSpecific.qll | 2 +- .../CWE-020/IRUntrustedDataToExternalAPI.ql | 2 +- .../CWE/CWE-020/UntrustedDataToExternalAPI.ql | 2 +- .../Security/CWE/CWE-020/ir/ExternalAPIs.qll | 4 ++-- .../CWE/CWE-020/ir/ExternalAPIsSpecific.qll | 2 +- .../src/Security/CWE/CWE-022/TaintedPath.ql | 4 ++-- .../src/Security/CWE/CWE-078/ExecTainted.ql | 8 ++++---- .../CWE-129/ImproperArrayIndexValidation.ql | 4 ++-- .../CWE/CWE-190/ArithmeticUncontrolled.ql | 4 ++-- .../CWE/CWE-190/TaintedAllocationSize.ql | 4 ++-- .../CWE/CWE-295/SSLResultConflation.ql | 6 +++--- .../CWE/CWE-311/CleartextBufferWrite.ql | 4 ++-- .../CWE/CWE-311/CleartextFileWrite.ql | 4 ++-- .../CWE/CWE-311/CleartextTransmission.ql | 16 +++++++-------- .../CWE/CWE-313/CleartextSqliteDatabase.ql | 4 ++-- cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql | 4 ++-- .../CWE/CWE-326/InsufficientKeySize.ql | 4 ++-- .../CWE/CWE-428/UnsafeCreateProcessCall.ql | 8 ++++---- .../Security/CWE/CWE-497/ExposedSystemData.ql | 6 +++--- .../CWE-497/PotentiallyExposedSystemData.ql | 4 ++-- cpp/ql/src/Security/CWE/CWE-611/XXE.ql | 4 ++-- .../CWE-732/UnsafeDaclSecurityDescriptor.ql | 8 ++++---- .../Security/CWE/CWE-078/WordexpTainted.ql | 4 ++-- .../CWE-190/AllocMultiplicationOverflow.ql | 4 ++-- .../CWE/CWE-193/ConstantSizeArrayOffByOne.ql | 8 ++++---- .../CWE/CWE-193/InvalidPointerDeref.ql | 6 +++--- .../CWE/CWE-359/PrivateCleartextWrite.ql | 2 +- .../analyzing-data-flow-in-cpp/exercise2.ql | 4 ++-- .../analyzing-data-flow-in-cpp/exercise4.ql | 4 ++-- .../fopen-flow-from-getenv.ql | 4 ++-- .../index-flow-from-ntohl.ql | 4 ++-- .../standardFlow.ql | 4 ++-- .../withAdditionalFlow.ql | 4 ++-- .../library-tests/dataflow/crement/from0.ql | 4 ++-- 48 files changed, 117 insertions(+), 117 deletions(-) diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateCleartextWrite.qll b/cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateCleartextWrite.qll index 416bf4b04f8..e733940bdc1 100644 --- a/cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateCleartextWrite.qll +++ b/cpp/ql/lib/experimental/semmle/code/cpp/security/PrivateCleartextWrite.qll @@ -54,7 +54,7 @@ module PrivateCleartextWrite { predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } } - module WriteFlow = TaintTracking::Make; + module WriteFlow = TaintTracking::Global; class PrivateDataSource extends Source { PrivateDataSource() { this.getExpr() instanceof PrivateDataExpr } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DefaultTaintTrackingImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DefaultTaintTrackingImpl.qll index 2c288b6d3da..e21a83fcb54 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DefaultTaintTrackingImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DefaultTaintTrackingImpl.qll @@ -103,7 +103,7 @@ private module DefaultTaintTrackingConfig implements DataFlow::ConfigSig { } } -private module DefaultTaintTrackingFlow = TaintTracking::Make; +private module DefaultTaintTrackingFlow = TaintTracking::Global; private module ToGlobalVarTaintTrackingConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { source = getNodeForSource(_) } @@ -121,13 +121,13 @@ private module ToGlobalVarTaintTrackingConfig implements DataFlow::ConfigSig { predicate isBarrierIn(DataFlow::Node node) { nodeIsBarrierIn(node) } } -private module ToGlobalVarTaintTrackingFlow = TaintTracking::Make; +private module ToGlobalVarTaintTrackingFlow = TaintTracking::Global; private module FromGlobalVarTaintTrackingConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { // This set of sources should be reasonably small, which is good for // performance since the set of sinks is very large. - ToGlobalVarTaintTrackingFlow::hasFlowTo(source) + ToGlobalVarTaintTrackingFlow::flowTo(source) } predicate isSink(DataFlow::Node sink) { exists(adjustedSink(sink)) } @@ -145,7 +145,7 @@ private module FromGlobalVarTaintTrackingConfig implements DataFlow::ConfigSig { } private module FromGlobalVarTaintTrackingFlow = - TaintTracking::Make; + TaintTracking::Global; private predicate readsVariable(LoadInstruction load, Variable var) { load.getSourceAddress().(VariableAddressInstruction).getAstVariable() = var @@ -331,7 +331,7 @@ private import Cached cached predicate tainted(Expr source, Element tainted) { exists(DataFlow::Node sink | - DefaultTaintTrackingFlow::hasFlow(getNodeForSource(source), sink) and + DefaultTaintTrackingFlow::flow(getNodeForSource(source), sink) and tainted = adjustedSink(sink) ) } @@ -360,8 +360,8 @@ predicate taintedIncludingGlobalVars(Expr source, Element tainted, string global DataFlow::VariableNode variableNode, GlobalOrNamespaceVariable global, DataFlow::Node sink | global = variableNode.getVariable() and - ToGlobalVarTaintTrackingFlow::hasFlow(getNodeForSource(source), variableNode) and - FromGlobalVarTaintTrackingFlow::hasFlow(variableNode, sink) and + ToGlobalVarTaintTrackingFlow::flow(getNodeForSource(source), variableNode) and + FromGlobalVarTaintTrackingFlow::flow(variableNode, sink) and tainted = adjustedSink(sink) and global = globalVarFromId(globalVar) ) @@ -450,7 +450,7 @@ module TaintedWithPath { predicate isBarrierIn(DataFlow::Node node) { nodeIsBarrierIn(node) } } - private module AdjustedFlow = TaintTracking::Make; + private module AdjustedFlow = TaintTracking::Global; /* * A sink `Element` may map to multiple `DataFlowX::PathNode`s via (the @@ -472,7 +472,7 @@ module TaintedWithPath { // that makes it easiest to deal with the case where source = sink. TEndpointPathNode(Element e) { exists(DataFlow::Node sourceNode, DataFlow::Node sinkNode | - AdjustedFlow::hasFlow(sourceNode, sinkNode) + AdjustedFlow::flow(sourceNode, sinkNode) | sourceNode = getNodeForExpr(e) and exists(TaintTrackingConfiguration ttCfg | ttCfg.isSource(e)) @@ -634,7 +634,7 @@ module TaintedWithPath { exists(DataFlow::Node flowSource, DataFlow::Node flowSink | source = sourceNode.(InitialPathNode).inner() and flowSource = getNodeForExpr(source) and - AdjustedFlow::hasFlow(flowSource, flowSink) and + AdjustedFlow::flow(flowSource, flowSink) and tainted = adjustedSink(flowSink) and tainted = sinkNode.(FinalPathNode).inner() ) diff --git a/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll b/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll index 6a0841e13e2..e53be5980b1 100644 --- a/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll +++ b/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll @@ -399,7 +399,7 @@ module BoostorgAsio { import Config } - import DataFlow::Make + import DataFlow::Global } /** @@ -596,7 +596,7 @@ module BoostorgAsio { } } - module SslContextFlowsToSetOptionFlow = DataFlow::Make; + module SslContextFlowsToSetOptionFlow = DataFlow::Global; /** * An option value that flows to the first parameter of a call to `SetOptions()`. @@ -640,5 +640,5 @@ module BoostorgAsio { } } - module SslOptionFlow = DataFlow::Make; + module SslOptionFlow = DataFlow::Global; } diff --git a/cpp/ql/src/Critical/OverflowDestination.ql b/cpp/ql/src/Critical/OverflowDestination.ql index 39ce527e08a..4cfaaf8981b 100644 --- a/cpp/ql/src/Critical/OverflowDestination.ql +++ b/cpp/ql/src/Critical/OverflowDestination.ql @@ -84,11 +84,11 @@ module OverflowDestinationConfig implements DataFlow::ConfigSig { } } -module OverflowDestination = TaintTracking::Make; +module OverflowDestination = TaintTracking::Global; from FunctionCall fc, OverflowDestination::PathNode source, OverflowDestination::PathNode sink where - OverflowDestination::hasFlowPath(source, sink) and + OverflowDestination::flowPath(source, sink) and sourceSized(fc, sink.getNode().asIndirectConvertedExpr()) select fc, source, sink, "To avoid overflow, this operation should be bounded by destination-buffer size, not source-buffer size." diff --git a/cpp/ql/src/Likely Bugs/Conversion/CastArrayPointerArithmetic.ql b/cpp/ql/src/Likely Bugs/Conversion/CastArrayPointerArithmetic.ql index 03f622855ab..79a5d530c21 100644 --- a/cpp/ql/src/Likely Bugs/Conversion/CastArrayPointerArithmetic.ql +++ b/cpp/ql/src/Likely Bugs/Conversion/CastArrayPointerArithmetic.ql @@ -80,9 +80,9 @@ predicate introducesNewField(Class derived, Class base) { ) } -module CastToPointerArithFlow = DataFlow::MakeWithState; +module CastToPointerArithFlow = DataFlow::GlobalWithState; from CastToPointerArithFlow::PathNode source, CastToPointerArithFlow::PathNode sink -where CastToPointerArithFlow::hasFlowPath(source, sink) +where CastToPointerArithFlow::flowPath(source, sink) select sink, source, sink, "This pointer arithmetic may be done with the wrong type because of $@.", source, "this cast" diff --git a/cpp/ql/src/Likely Bugs/Format/NonConstantFormat.ql b/cpp/ql/src/Likely Bugs/Format/NonConstantFormat.ql index 2b2e9f6bf8b..65454332ab1 100644 --- a/cpp/ql/src/Likely Bugs/Format/NonConstantFormat.ql +++ b/cpp/ql/src/Likely Bugs/Format/NonConstantFormat.ql @@ -146,13 +146,13 @@ module NonConstFlowConfig implements DataFlow::ConfigSig { predicate isBarrier(DataFlow::Node node) { isBarrierNode(node) } } -module NonConstFlow = TaintTracking::Make; +module NonConstFlow = TaintTracking::Global; from FormattingFunctionCall call, Expr formatString where call.getArgument(call.getFormatParameterIndex()) = formatString and exists(DataFlow::Node sink | - NonConstFlow::hasFlowTo(sink) and + NonConstFlow::flowTo(sink) and isSinkImpl(sink, formatString) ) select formatString, diff --git a/cpp/ql/src/Likely Bugs/Leap Year/Adding365DaysPerYear.ql b/cpp/ql/src/Likely Bugs/Leap Year/Adding365DaysPerYear.ql index fe6581340de..71aa97c0ae5 100644 --- a/cpp/ql/src/Likely Bugs/Leap Year/Adding365DaysPerYear.ql +++ b/cpp/ql/src/Likely Bugs/Leap Year/Adding365DaysPerYear.ql @@ -16,7 +16,7 @@ import LeapYear from Expr source, Expr sink where - PossibleYearArithmeticOperationCheckFlow::hasFlow(DataFlow::exprNode(source), + PossibleYearArithmeticOperationCheckFlow::flow(DataFlow::exprNode(source), DataFlow::exprNode(sink)) select sink, "An arithmetic operation $@ that uses a constant value of 365 ends up modifying this date/time, without considering leap year scenarios.", diff --git a/cpp/ql/src/Likely Bugs/Leap Year/LeapYear.qll b/cpp/ql/src/Likely Bugs/Leap Year/LeapYear.qll index a838f4c6a0d..7a375e7b107 100644 --- a/cpp/ql/src/Likely Bugs/Leap Year/LeapYear.qll +++ b/cpp/ql/src/Likely Bugs/Leap Year/LeapYear.qll @@ -231,7 +231,7 @@ private module LeapYearCheckConfig implements DataFlow::ConfigSig { } } -module LeapYearCheckFlow = DataFlow::Make; +module LeapYearCheckFlow = DataFlow::Global; /** * Data flow configuration for finding an operation with hardcoded 365 that will flow into @@ -284,7 +284,7 @@ private module FiletimeYearArithmeticOperationCheckConfig implements DataFlow::C } module FiletimeYearArithmeticOperationCheckFlow = - DataFlow::Make; + DataFlow::Global; /** * Taint configuration for finding an operation with hardcoded 365 that will flow into any known date/time field. @@ -372,4 +372,4 @@ private module PossibleYearArithmeticOperationCheckConfig implements DataFlow::C } module PossibleYearArithmeticOperationCheckFlow = - TaintTracking::Make; + TaintTracking::Global; diff --git a/cpp/ql/src/Likely Bugs/Leap Year/UncheckedLeapYearAfterYearModification.ql b/cpp/ql/src/Likely Bugs/Leap Year/UncheckedLeapYearAfterYearModification.ql index f85270d523e..1cc51a0d3e2 100644 --- a/cpp/ql/src/Likely Bugs/Leap Year/UncheckedLeapYearAfterYearModification.ql +++ b/cpp/ql/src/Likely Bugs/Leap Year/UncheckedLeapYearAfterYearModification.ql @@ -31,7 +31,7 @@ where // If there is a data flow from the variable that was modified to a function that seems to check for leap year exists(VariableAccess source, ChecksForLeapYearFunctionCall fc | source = var.getAnAccess() and - LeapYearCheckFlow::hasFlow(DataFlow::exprNode(source), + LeapYearCheckFlow::flow(DataFlow::exprNode(source), DataFlow::exprNode(fc.getAnArgument())) ) or @@ -39,7 +39,7 @@ where exists(VariableAccess vacheck, YearFieldAccess yfacheck, ChecksForLeapYearFunctionCall fc | vacheck = var.getAnAccess() and yfacheck.getQualifier() = vacheck and - LeapYearCheckFlow::hasFlow(DataFlow::exprNode(yfacheck), + LeapYearCheckFlow::flow(DataFlow::exprNode(yfacheck), DataFlow::exprNode(fc.getAnArgument())) ) or diff --git a/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.ql b/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.ql index c23eda355c4..38ecd4183ff 100644 --- a/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.ql +++ b/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.ql @@ -12,5 +12,5 @@ import cpp import NtohlArrayNoBound from DataFlow::Node source, DataFlow::Node sink -where NetworkToBufferSizeFlow::hasFlow(source, sink) +where NetworkToBufferSizeFlow::flow(source, sink) select sink, "Unchecked use of data from network function $@.", source, source.toString() diff --git a/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.qll b/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.qll index e3b095d74dd..1bd90084c67 100644 --- a/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.qll +++ b/cpp/ql/src/Likely Bugs/Memory Management/NtohlArrayNoBound.qll @@ -161,4 +161,4 @@ private module NetworkToBufferSizeConfig implements DataFlow::ConfigSig { } } -module NetworkToBufferSizeFlow = DataFlow::Make; +module NetworkToBufferSizeFlow = DataFlow::Global; diff --git a/cpp/ql/src/Likely Bugs/Protocols/TlsSettingsMisconfiguration.ql b/cpp/ql/src/Likely Bugs/Protocols/TlsSettingsMisconfiguration.ql index e7baf96615e..61989db1c6e 100644 --- a/cpp/ql/src/Likely Bugs/Protocols/TlsSettingsMisconfiguration.ql +++ b/cpp/ql/src/Likely Bugs/Protocols/TlsSettingsMisconfiguration.ql @@ -25,17 +25,17 @@ module ExistsAnyFlowConfig implements DataFlow::ConfigSig { } } -module ExistsAnyFlow = DataFlow::Make; +module ExistsAnyFlow = DataFlow::Global; bindingset[flag] predicate isOptionSet(ConstructorCall cc, int flag, FunctionCall fcSetOptions) { exists(VariableAccess contextSetOptions | - ExistsAnyFlow::hasFlow(DataFlow::exprNode(cc), DataFlow::exprNode(contextSetOptions)) and + ExistsAnyFlow::flow(DataFlow::exprNode(cc), DataFlow::exprNode(contextSetOptions)) and exists(BoostorgAsio::SslSetOptionsFunction f | f.getACallToThisFunction() = fcSetOptions | contextSetOptions = fcSetOptions.getQualifier() and forall(Expr optionArgument, Expr optionArgumentSource | optionArgument = fcSetOptions.getArgument(0) and - BoostorgAsio::SslOptionFlow::hasFlow(DataFlow::exprNode(optionArgumentSource), + BoostorgAsio::SslOptionFlow::flow(DataFlow::exprNode(optionArgumentSource), DataFlow::exprNode(optionArgument)) | optionArgument.getValue().toInt().bitShiftRight(16).bitAnd(flag) = flag @@ -49,7 +49,7 @@ predicate isOptionNotSet(ConstructorCall cc, int flag) { not isOptionSet(cc, fla from Expr protocolSource, Expr protocolSink, ConstructorCall cc, Expr e, string msg where - BoostorgAsio::SslContextCallTlsProtocolFlow::hasFlow(DataFlow::exprNode(protocolSource), + BoostorgAsio::SslContextCallTlsProtocolFlow::flow(DataFlow::exprNode(protocolSource), DataFlow::exprNode(protocolSink)) and cc.getArgument(0) = protocolSink and ( diff --git a/cpp/ql/src/Likely Bugs/Protocols/UseOfDeprecatedHardcodedProtocol.ql b/cpp/ql/src/Likely Bugs/Protocols/UseOfDeprecatedHardcodedProtocol.ql index 140cf8e2ccf..4df70695179 100644 --- a/cpp/ql/src/Likely Bugs/Protocols/UseOfDeprecatedHardcodedProtocol.ql +++ b/cpp/ql/src/Likely Bugs/Protocols/UseOfDeprecatedHardcodedProtocol.ql @@ -14,12 +14,12 @@ import semmle.code.cpp.security.boostorg.asio.protocols from Expr protocolSource, Expr protocolSink, ConstructorCall cc where - BoostorgAsio::SslContextCallFlow::hasFlow(DataFlow::exprNode(protocolSource), + BoostorgAsio::SslContextCallFlow::flow(DataFlow::exprNode(protocolSource), DataFlow::exprNode(protocolSink)) and - not BoostorgAsio::SslContextCallTlsProtocolFlow::hasFlow(DataFlow::exprNode(protocolSource), + not BoostorgAsio::SslContextCallTlsProtocolFlow::flow(DataFlow::exprNode(protocolSource), DataFlow::exprNode(protocolSink)) and cc.getArgument(0) = protocolSink and - BoostorgAsio::SslContextCallBannedProtocolFlow::hasFlow(DataFlow::exprNode(protocolSource), + BoostorgAsio::SslContextCallBannedProtocolFlow::flow(DataFlow::exprNode(protocolSource), DataFlow::exprNode(protocolSink)) select protocolSink, "Usage of $@ specifying a deprecated hardcoded protocol $@ in function $@.", cc, "boost::asio::ssl::context::context", protocolSource, protocolSource.toString(), diff --git a/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIs.qll b/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIs.qll index 6d6f17daf0e..70247bdf4a4 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIs.qll +++ b/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIs.qll @@ -10,10 +10,10 @@ import ExternalAPIsSpecific /** A node representing untrusted data being passed to an external API. */ class UntrustedExternalApiDataNode extends ExternalApiDataNode { - UntrustedExternalApiDataNode() { UntrustedDataToExternalApiFlow::hasFlow(_, this) } + UntrustedExternalApiDataNode() { UntrustedDataToExternalApiFlow::flow(_, this) } /** Gets a source of untrusted data which is passed to this external API data node. */ - DataFlow::Node getAnUntrustedSource() { UntrustedDataToExternalApiFlow::hasFlow(result, this) } + DataFlow::Node getAnUntrustedSource() { UntrustedDataToExternalApiFlow::flow(result, this) } } /** DEPRECATED: Alias for UntrustedExternalApiDataNode */ diff --git a/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIsSpecific.qll b/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIsSpecific.qll index d2ab4f0309f..2505f718bc6 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIsSpecific.qll +++ b/cpp/ql/src/Security/CWE/CWE-020/ExternalAPIsSpecific.qll @@ -73,4 +73,4 @@ private module UntrustedDataToExternalApiConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode } } -module UntrustedDataToExternalApiFlow = TaintTracking::Make; +module UntrustedDataToExternalApiFlow = TaintTracking::Global; diff --git a/cpp/ql/src/Security/CWE/CWE-020/IRUntrustedDataToExternalAPI.ql b/cpp/ql/src/Security/CWE/CWE-020/IRUntrustedDataToExternalAPI.ql index d16ce6376dd..432f47f6735 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/IRUntrustedDataToExternalAPI.ql +++ b/cpp/ql/src/Security/CWE/CWE-020/IRUntrustedDataToExternalAPI.ql @@ -16,7 +16,7 @@ import semmle.code.cpp.security.FlowSources import UntrustedDataToExternalApiFlow::PathGraph from UntrustedDataToExternalApiFlow::PathNode source, UntrustedDataToExternalApiFlow::PathNode sink -where UntrustedDataToExternalApiFlow::hasFlowPath(source, sink) +where UntrustedDataToExternalApiFlow::flowPath(source, sink) select sink, source, sink, "Call to " + sink.getNode().(ExternalApiDataNode).getExternalFunction().toString() + " with untrusted data from $@.", source, source.getNode().(RemoteFlowSource).getSourceType() diff --git a/cpp/ql/src/Security/CWE/CWE-020/UntrustedDataToExternalAPI.ql b/cpp/ql/src/Security/CWE/CWE-020/UntrustedDataToExternalAPI.ql index a00accd4d29..1cfd0a7132f 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/UntrustedDataToExternalAPI.ql +++ b/cpp/ql/src/Security/CWE/CWE-020/UntrustedDataToExternalAPI.ql @@ -15,7 +15,7 @@ import ExternalAPIs import UntrustedDataToExternalApiFlow::PathGraph from UntrustedDataToExternalApiFlow::PathNode source, UntrustedDataToExternalApiFlow::PathNode sink -where UntrustedDataToExternalApiFlow::hasFlowPath(source, sink) +where UntrustedDataToExternalApiFlow::flowPath(source, sink) select sink, source, sink, "Call to " + sink.getNode().(ExternalApiDataNode).getExternalFunction().toString() + " with untrusted data from $@.", source, source.toString() diff --git a/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIs.qll b/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIs.qll index 6d6f17daf0e..70247bdf4a4 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIs.qll +++ b/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIs.qll @@ -10,10 +10,10 @@ import ExternalAPIsSpecific /** A node representing untrusted data being passed to an external API. */ class UntrustedExternalApiDataNode extends ExternalApiDataNode { - UntrustedExternalApiDataNode() { UntrustedDataToExternalApiFlow::hasFlow(_, this) } + UntrustedExternalApiDataNode() { UntrustedDataToExternalApiFlow::flow(_, this) } /** Gets a source of untrusted data which is passed to this external API data node. */ - DataFlow::Node getAnUntrustedSource() { UntrustedDataToExternalApiFlow::hasFlow(result, this) } + DataFlow::Node getAnUntrustedSource() { UntrustedDataToExternalApiFlow::flow(result, this) } } /** DEPRECATED: Alias for UntrustedExternalApiDataNode */ diff --git a/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIsSpecific.qll b/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIsSpecific.qll index 4dd077f24ce..93da5497a22 100644 --- a/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIsSpecific.qll +++ b/cpp/ql/src/Security/CWE/CWE-020/ir/ExternalAPIsSpecific.qll @@ -63,4 +63,4 @@ private module UntrustedDataToExternalApiConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink instanceof ExternalApiDataNode } } -module UntrustedDataToExternalApiFlow = TaintTracking::Make; +module UntrustedDataToExternalApiFlow = TaintTracking::Global; diff --git a/cpp/ql/src/Security/CWE/CWE-022/TaintedPath.ql b/cpp/ql/src/Security/CWE/CWE-022/TaintedPath.ql index 89d8f975680..4e626d0bc77 100644 --- a/cpp/ql/src/Security/CWE/CWE-022/TaintedPath.ql +++ b/cpp/ql/src/Security/CWE/CWE-022/TaintedPath.ql @@ -90,7 +90,7 @@ module TaintedPathConfig implements DataFlow::ConfigSig { } } -module TaintedPath = TaintTracking::Make; +module TaintedPath = TaintTracking::Global; from FileFunction fileFunction, Expr taintedArg, FlowSource taintSource, @@ -98,7 +98,7 @@ from where taintedArg = sinkNode.getNode().asIndirectArgument() and fileFunction.outermostWrapperFunctionCall(taintedArg, callChain) and - TaintedPath::hasFlowPath(sourceNode, sinkNode) and + TaintedPath::flowPath(sourceNode, sinkNode) and taintSource = sourceNode.getNode() select taintedArg, sourceNode, sinkNode, "This argument to a file access function is derived from $@ and then passed to " + callChain + ".", diff --git a/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql b/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql index c7e01e0b983..cc4b748e5dc 100644 --- a/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql +++ b/cpp/ql/src/Security/CWE/CWE-078/ExecTainted.ql @@ -76,7 +76,7 @@ class ExecState extends TExecState { DataFlow::Node getOutgoingNode() { result = outgoing } /** Holds if this is a possible `ExecState` for `sink`. */ - predicate isFeasibleForSink(DataFlow::Node sink) { ExecState::hasFlow(outgoing, sink) } + predicate isFeasibleForSink(DataFlow::Node sink) { ExecState::flow(outgoing, sink) } string toString() { result = "ExecState" } } @@ -109,7 +109,7 @@ module ExecStateConfig implements DataFlow::ConfigSig { } } -module ExecState = TaintTracking::Make; +module ExecState = TaintTracking::Global; module ExecTaintConfig implements DataFlow::StateConfigSig { class FlowState = TState; @@ -141,13 +141,13 @@ module ExecTaintConfig implements DataFlow::StateConfigSig { } } -module ExecTaint = TaintTracking::MakeWithState; +module ExecTaint = TaintTracking::GlobalWithState; from ExecTaint::PathNode sourceNode, ExecTaint::PathNode sinkNode, string taintCause, string callChain, DataFlow::Node concatResult, Expr command where - ExecTaint::hasFlowPath(sourceNode, sinkNode) and + ExecTaint::flowPath(sourceNode, sinkNode) and taintCause = sourceNode.getNode().(FlowSource).getSourceType() and isSinkImpl(sinkNode.getNode(), command, callChain) and concatResult = sinkNode.getState().(ExecState).getOutgoingNode() diff --git a/cpp/ql/src/Security/CWE/CWE-129/ImproperArrayIndexValidation.ql b/cpp/ql/src/Security/CWE/CWE-129/ImproperArrayIndexValidation.ql index 598e242b0ef..107be7bddfd 100644 --- a/cpp/ql/src/Security/CWE/CWE-129/ImproperArrayIndexValidation.ql +++ b/cpp/ql/src/Security/CWE/CWE-129/ImproperArrayIndexValidation.ql @@ -114,13 +114,13 @@ module ImproperArrayIndexValidationConfig implements DataFlow::ConfigSig { } } -module ImproperArrayIndexValidation = TaintTracking::Make; +module ImproperArrayIndexValidation = TaintTracking::Global; from ImproperArrayIndexValidation::PathNode source, ImproperArrayIndexValidation::PathNode sink, string sourceType where - ImproperArrayIndexValidation::hasFlowPath(source, sink) and + ImproperArrayIndexValidation::flowPath(source, sink) and isFlowSource(source.getNode(), sourceType) select sink.getNode(), source, sink, "An array indexing expression depends on $@ that might be outside the bounds of the array.", diff --git a/cpp/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql b/cpp/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql index a4d37eb4875..54c3b013471 100644 --- a/cpp/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql +++ b/cpp/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql @@ -122,7 +122,7 @@ module UncontrolledArithConfig implements DataFlow::ConfigSig { } } -module UncontrolledArith = TaintTracking::Make; +module UncontrolledArith = TaintTracking::Global; /** Gets the expression that corresponds to `node`, if any. */ Expr getExpr(DataFlow::Node node) { result = [node.asExpr(), node.asDefiningArgument()] } @@ -131,7 +131,7 @@ from UncontrolledArith::PathNode source, UncontrolledArith::PathNode sink, VariableAccess va, string effect where - UncontrolledArith::hasFlowPath(source, sink) and + UncontrolledArith::flowPath(source, sink) and sink.getNode().asExpr() = va and missingGuard(va, effect) select sink.getNode(), source, sink, diff --git a/cpp/ql/src/Security/CWE/CWE-190/TaintedAllocationSize.ql b/cpp/ql/src/Security/CWE/CWE-190/TaintedAllocationSize.ql index 4d242890528..740e4ad9e8e 100644 --- a/cpp/ql/src/Security/CWE/CWE-190/TaintedAllocationSize.ql +++ b/cpp/ql/src/Security/CWE/CWE-190/TaintedAllocationSize.ql @@ -95,14 +95,14 @@ module TaintedAllocationSizeConfig implements DataFlow::ConfigSig { } } -module TaintedAllocationSize = TaintTracking::Make; +module TaintedAllocationSize = TaintTracking::Global; from Expr alloc, TaintedAllocationSize::PathNode source, TaintedAllocationSize::PathNode sink, string taintCause where isFlowSource(source.getNode(), taintCause) and - TaintedAllocationSize::hasFlowPath(source, sink) and + TaintedAllocationSize::flowPath(source, sink) and allocSink(alloc, sink.getNode()) select alloc, source, sink, "This allocation size is derived from $@ and might overflow.", source.getNode(), "user input (" + taintCause + ")" diff --git a/cpp/ql/src/Security/CWE/CWE-295/SSLResultConflation.ql b/cpp/ql/src/Security/CWE/CWE-295/SSLResultConflation.ql index 34d211a53ae..5eab70c5cc9 100644 --- a/cpp/ql/src/Security/CWE/CWE-295/SSLResultConflation.ql +++ b/cpp/ql/src/Security/CWE/CWE-295/SSLResultConflation.ql @@ -33,14 +33,14 @@ module VerifyResultConfig implements DataFlow::ConfigSig { } } -module VerifyResult = DataFlow::Make; +module VerifyResult = DataFlow::Global; from DataFlow::Node source, DataFlow::Node sink1, DataFlow::Node sink2, GuardCondition guard, Expr c1, Expr c2, boolean testIsTrue where - VerifyResult::hasFlow(source, sink1) and - VerifyResult::hasFlow(source, sink2) and + VerifyResult::flow(source, sink1) and + VerifyResult::flow(source, sink2) and guard.comparesEq(sink1.asExpr(), c1, 0, false, testIsTrue) and // (value != c1) => testIsTrue guard.comparesEq(sink2.asExpr(), c2, 0, false, testIsTrue) and // (value != c2) => testIsTrue c1.getValue().toInt() = 0 and diff --git a/cpp/ql/src/Security/CWE/CWE-311/CleartextBufferWrite.ql b/cpp/ql/src/Security/CWE/CWE-311/CleartextBufferWrite.ql index d7bb69582d7..f2754c5811f 100644 --- a/cpp/ql/src/Security/CWE/CWE-311/CleartextBufferWrite.ql +++ b/cpp/ql/src/Security/CWE/CWE-311/CleartextBufferWrite.ql @@ -49,7 +49,7 @@ module ToBufferConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { isSinkImpl(sink, _) } } -module ToBufferFlow = TaintTracking::Make; +module ToBufferFlow = TaintTracking::Global; predicate isSinkImpl(DataFlow::Node sink, SensitiveBufferWrite w) { w.getASource() = sink.asIndirectExpr() @@ -59,7 +59,7 @@ from SensitiveBufferWrite w, ToBufferFlow::PathNode sourceNode, ToBufferFlow::PathNode sinkNode, FlowSource source where - ToBufferFlow::hasFlowPath(sourceNode, sinkNode) and + ToBufferFlow::flowPath(sourceNode, sinkNode) and sourceNode.getNode() = source and isSinkImpl(sinkNode.getNode(), w) select w, sourceNode, sinkNode, diff --git a/cpp/ql/src/Security/CWE/CWE-311/CleartextFileWrite.ql b/cpp/ql/src/Security/CWE/CWE-311/CleartextFileWrite.ql index 3c1a78b14c5..c04ceae7ada 100644 --- a/cpp/ql/src/Security/CWE/CWE-311/CleartextFileWrite.ql +++ b/cpp/ql/src/Security/CWE/CWE-311/CleartextFileWrite.ql @@ -33,7 +33,7 @@ module FromSensitiveConfig implements DataFlow::ConfigSig { } } -module FromSensitiveFlow = TaintTracking::Make; +module FromSensitiveFlow = TaintTracking::Global; predicate isSinkImpl(DataFlow::Node sink, FileWrite w, Expr dest) { exists(Expr e | @@ -81,7 +81,7 @@ from SensitiveExpr source, FromSensitiveFlow::PathNode sourceNode, FromSensitiveFlow::PathNode midNode, FileWrite w, Expr dest where - FromSensitiveFlow::hasFlowPath(sourceNode, midNode) and + FromSensitiveFlow::flowPath(sourceNode, midNode) and isSourceImpl(sourceNode.getNode(), source) and isSinkImpl(midNode.getNode(), w, dest) select w, sourceNode, midNode, diff --git a/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql b/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql index a0fb6bd2dac..fa0d2ffd82a 100644 --- a/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql +++ b/cpp/ql/src/Security/CWE/CWE-311/CleartextTransmission.ql @@ -250,13 +250,13 @@ module FromSensitiveConfig implements DataFlow::ConfigSig { } } -module FromSensitiveFlow = TaintTracking::Make; +module FromSensitiveFlow = TaintTracking::Global; /** * A taint flow configuration for flow from a sensitive expression to an encryption operation. */ module ToEncryptionConfig implements DataFlow::ConfigSig { - predicate isSource(DataFlow::Node source) { FromSensitiveFlow::hasFlow(source, _) } + predicate isSource(DataFlow::Node source) { FromSensitiveFlow::flow(source, _) } predicate isSink(DataFlow::Node sink) { isSinkEncrypt(sink, _) } @@ -271,7 +271,7 @@ module ToEncryptionConfig implements DataFlow::ConfigSig { } } -module ToEncryptionFlow = TaintTracking::Make; +module ToEncryptionFlow = TaintTracking::Global; /** * A taint flow configuration for flow from an encryption operation to a network operation. @@ -279,25 +279,25 @@ module ToEncryptionFlow = TaintTracking::Make; module FromEncryptionConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { isSinkEncrypt(source, _) } - predicate isSink(DataFlow::Node sink) { FromSensitiveFlow::hasFlowTo(sink) } + predicate isSink(DataFlow::Node sink) { FromSensitiveFlow::flowTo(sink) } predicate isBarrier(DataFlow::Node node) { node.asExpr().getUnspecifiedType() instanceof IntegralType } } -module FromEncryptionFlow = TaintTracking::Make; +module FromEncryptionFlow = TaintTracking::Global; from FromSensitiveFlow::PathNode source, FromSensitiveFlow::PathNode sink, NetworkSendRecv networkSendRecv, string msg where // flow from sensitive -> network data - FromSensitiveFlow::hasFlowPath(source, sink) and + FromSensitiveFlow::flowPath(source, sink) and isSinkSendRecv(sink.getNode(), networkSendRecv) and // no flow from sensitive -> evidence of encryption - not ToEncryptionFlow::hasFlow(source.getNode(), _) and - not FromEncryptionFlow::hasFlowTo(sink.getNode()) and + not ToEncryptionFlow::flow(source.getNode(), _) and + not FromEncryptionFlow::flowTo(sink.getNode()) and // construct result if networkSendRecv instanceof NetworkSend then diff --git a/cpp/ql/src/Security/CWE/CWE-313/CleartextSqliteDatabase.ql b/cpp/ql/src/Security/CWE/CWE-313/CleartextSqliteDatabase.ql index 797302be5a4..0c060befeff 100644 --- a/cpp/ql/src/Security/CWE/CWE-313/CleartextSqliteDatabase.ql +++ b/cpp/ql/src/Security/CWE/CWE-313/CleartextSqliteDatabase.ql @@ -125,13 +125,13 @@ module FromSensitiveConfig implements DataFlow::ConfigSig { } } -module FromSensitiveFlow = TaintTracking::Make; +module FromSensitiveFlow = TaintTracking::Global; from SensitiveExpr sensitive, FromSensitiveFlow::PathNode source, FromSensitiveFlow::PathNode sink, SqliteFunctionCall sqliteCall where - FromSensitiveFlow::hasFlowPath(source, sink) and + FromSensitiveFlow::flowPath(source, sink) and isSourceImpl(source.getNode(), sensitive) and isSinkImpl(sink.getNode(), sqliteCall, _) select sqliteCall, source, sink, diff --git a/cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql b/cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql index ceddfbf9f40..423ed57dd98 100644 --- a/cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql +++ b/cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql @@ -89,10 +89,10 @@ module HttpStringToUrlOpenConfig implements DataFlow::ConfigSig { } } -module HttpStringToUrlOpen = TaintTracking::Make; +module HttpStringToUrlOpen = TaintTracking::Global; from HttpStringToUrlOpen::PathNode source, HttpStringToUrlOpen::PathNode sink, HttpStringLiteral str where - HttpStringToUrlOpen::hasFlowPath(source, sink) and + HttpStringToUrlOpen::flowPath(source, sink) and str = source.getNode().asIndirectExpr() select str, source, sink, "This URL may be constructed with the HTTP protocol." diff --git a/cpp/ql/src/Security/CWE/CWE-326/InsufficientKeySize.ql b/cpp/ql/src/Security/CWE/CWE-326/InsufficientKeySize.ql index f899889a59b..3cc10b7ad19 100644 --- a/cpp/ql/src/Security/CWE/CWE-326/InsufficientKeySize.ql +++ b/cpp/ql/src/Security/CWE/CWE-326/InsufficientKeySize.ql @@ -46,13 +46,13 @@ module KeyStrengthFlowConfig implements DataFlow::ConfigSig { } } -module KeyStrengthFlow = DataFlow::Make; +module KeyStrengthFlow = DataFlow::Global; from KeyStrengthFlow::PathNode source, KeyStrengthFlow::PathNode sink, FunctionCall fc, int param, string name, int minimumBits, int bits where - KeyStrengthFlow::hasFlowPath(source, sink) and + KeyStrengthFlow::flowPath(source, sink) and sink.getNode().asExpr() = fc.getArgument(param) and fc.getTarget().hasGlobalName(name) and minimumBits = getMinimumKeyStrength(name, param) and diff --git a/cpp/ql/src/Security/CWE/CWE-428/UnsafeCreateProcessCall.ql b/cpp/ql/src/Security/CWE/CWE-428/UnsafeCreateProcessCall.ql index e6dd4e7046e..2703f819b54 100644 --- a/cpp/ql/src/Security/CWE/CWE-428/UnsafeCreateProcessCall.ql +++ b/cpp/ql/src/Security/CWE/CWE-428/UnsafeCreateProcessCall.ql @@ -64,7 +64,7 @@ module NullAppNameCreateProcessFunctionConfig implements DataFlow::ConfigSig { } } -module NullAppNameCreateProcessFunction = DataFlow::Make; +module NullAppNameCreateProcessFunction = DataFlow::Global; /** * Dataflow that detects a call to CreateProcess with an unquoted commandLine argument @@ -85,7 +85,7 @@ module QuotedCommandInCreateProcessFunctionConfig implements DataFlow::ConfigSig } module QuotedCommandInCreateProcessFunction = - DataFlow::Make; + DataFlow::Global; bindingset[s] predicate isQuotedOrNoSpaceApplicationNameOnCmd(string s) { @@ -98,12 +98,12 @@ from CreateProcessFunctionCall call, string msg1, string msg2 where exists(Expr appName | appName = call.getArgument(call.getApplicationNameArgumentId()) and - NullAppNameCreateProcessFunction::hasFlowToExpr(appName) and + NullAppNameCreateProcessFunction::flowToExpr(appName) and msg1 = call.toString() + " with lpApplicationName == NULL (" + appName + ")" ) and exists(Expr cmd | cmd = call.getArgument(call.getCommandLineArgumentId()) and - QuotedCommandInCreateProcessFunction::hasFlowToExpr(cmd) and + QuotedCommandInCreateProcessFunction::flowToExpr(cmd) and msg2 = " and with an unquoted lpCommandLine (" + cmd + ") introduces a security vulnerability if the path contains spaces." diff --git a/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql b/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql index 7e76cf76c12..74a5e1ba4e0 100644 --- a/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql +++ b/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql @@ -30,15 +30,15 @@ module ExposedSystemDataConfig implements DataFlow::ConfigSig { } } -module ExposedSystemData = TaintTracking::Make; +module ExposedSystemData = TaintTracking::Global; from ExposedSystemData::PathNode source, ExposedSystemData::PathNode sink where - ExposedSystemData::hasFlowPath(source, sink) and + ExposedSystemData::flowPath(source, sink) and not exists( DataFlow::Node alt // remove duplicate results on conversions | - ExposedSystemData::hasFlow(source.getNode(), alt) and + ExposedSystemData::flow(source.getNode(), alt) and alt.asConvertedExpr() = sink.getNode().asIndirectExpr() and alt != sink.getNode() ) diff --git a/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemData.ql b/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemData.ql index a06314e3c97..9fa4f538378 100644 --- a/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemData.ql +++ b/cpp/ql/src/Security/CWE/CWE-497/PotentiallyExposedSystemData.ql @@ -51,9 +51,9 @@ module PotentiallyExposedSystemDataConfig implements DataFlow::ConfigSig { } } -module PotentiallyExposedSystemData = TaintTracking::Make; +module PotentiallyExposedSystemData = TaintTracking::Global; from PotentiallyExposedSystemData::PathNode source, PotentiallyExposedSystemData::PathNode sink -where PotentiallyExposedSystemData::hasFlowPath(source, sink) +where PotentiallyExposedSystemData::flowPath(source, sink) select sink, source, sink, "This operation potentially exposes sensitive system data from $@.", source, source.getNode().toString() diff --git a/cpp/ql/src/Security/CWE/CWE-611/XXE.ql b/cpp/ql/src/Security/CWE/CWE-611/XXE.ql index 1b611a42b8d..6b73e50c963 100644 --- a/cpp/ql/src/Security/CWE/CWE-611/XXE.ql +++ b/cpp/ql/src/Security/CWE/CWE-611/XXE.ql @@ -45,9 +45,9 @@ module XxeConfig implements DataFlow::StateConfigSig { } } -module XxeFlow = DataFlow::MakeWithState; +module XxeFlow = DataFlow::GlobalWithState; from XxeFlow::PathNode source, XxeFlow::PathNode sink -where XxeFlow::hasFlowPath(source, sink) +where XxeFlow::flowPath(source, sink) select sink, source, sink, "This $@ is not configured to prevent an XML external entity (XXE) attack.", source, "XML parser" diff --git a/cpp/ql/src/Security/CWE/CWE-732/UnsafeDaclSecurityDescriptor.ql b/cpp/ql/src/Security/CWE/CWE-732/UnsafeDaclSecurityDescriptor.ql index 8f36ab50aa8..5ed30e19bb3 100644 --- a/cpp/ql/src/Security/CWE/CWE-732/UnsafeDaclSecurityDescriptor.ql +++ b/cpp/ql/src/Security/CWE/CWE-732/UnsafeDaclSecurityDescriptor.ql @@ -39,7 +39,7 @@ module NullDaclConfig implements DataFlow::ConfigSig { } } -module NullDaclFlow = DataFlow::Make; +module NullDaclFlow = DataFlow::Global; /** * Dataflow that detects a call to SetSecurityDescriptorDacl with a pDacl @@ -70,7 +70,7 @@ module NonNullDaclConfig implements DataFlow::ConfigSig { } } -module NonNullDaclFlow = DataFlow::Make; +module NonNullDaclFlow = DataFlow::Global; from SetSecurityDescriptorDaclFunctionCall call, string message where @@ -88,7 +88,7 @@ where " that is set to NULL will result in an unprotected object." | var = call.getArgument(2) and - NullDaclFlow::hasFlowToExpr(var) and - not NonNullDaclFlow::hasFlowToExpr(var) + NullDaclFlow::flowToExpr(var) and + not NonNullDaclFlow::flowToExpr(var) ) select call, message diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-078/WordexpTainted.ql b/cpp/ql/src/experimental/Security/CWE/CWE-078/WordexpTainted.ql index 7b72b2684e6..cf346cb812e 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-078/WordexpTainted.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-078/WordexpTainted.ql @@ -50,9 +50,9 @@ module WordexpTaintConfig implements DataFlow::ConfigSig { } } -module WordexpTaint = TaintTracking::Make; +module WordexpTaint = TaintTracking::Global; from WordexpTaint::PathNode sourceNode, WordexpTaint::PathNode sinkNode -where WordexpTaint::hasFlowPath(sourceNode, sinkNode) +where WordexpTaint::flowPath(sourceNode, sinkNode) select sinkNode.getNode(), sourceNode, sinkNode, "Using user-supplied data in a `wordexp` command, without disabling command substitution, can make code vulnerable to command injection." diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-190/AllocMultiplicationOverflow.ql b/cpp/ql/src/experimental/Security/CWE/CWE-190/AllocMultiplicationOverflow.ql index 71958eaad91..00cf017297f 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-190/AllocMultiplicationOverflow.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-190/AllocMultiplicationOverflow.ql @@ -32,10 +32,10 @@ module MultToAllocConfig implements DataFlow::ConfigSig { } } -module MultToAlloc = DataFlow::Make; +module MultToAlloc = DataFlow::Global; from MultToAlloc::PathNode source, MultToAlloc::PathNode sink -where MultToAlloc::hasFlowPath(source, sink) +where MultToAlloc::flowPath(source, sink) select sink, source, sink, "Potentially overflowing value from $@ is used in the size of this allocation.", source, "multiplication" diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql b/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql index 35cce4a30da..b8e439be05c 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql @@ -43,7 +43,7 @@ module FieldAddressToPointerArithmeticConfig implements DataFlow::ConfigSig { } } -module FieldAddressToPointerArithmeticFlow = DataFlow::Make; +module FieldAddressToPointerArithmeticFlow = DataFlow::Global; predicate isFieldAddressSource(Field f, DataFlow::Node source) { source.asInstruction().(FieldAddressInstruction).getField() = f @@ -70,7 +70,7 @@ predicate isInvalidPointerDerefSink(DataFlow::Node sink, Instruction i, string o predicate isConstantSizeOverflowSource(Field f, PointerAddInstruction pai, int delta) { exists(int size, int bound, DataFlow::Node source, DataFlow::InstructionNode sink | - FieldAddressToPointerArithmeticFlow::hasFlow(source, sink) and + FieldAddressToPointerArithmeticFlow::flow(source, sink) and isFieldAddressSource(f, source) and pai.getLeft() = sink.asInstruction() and f.getUnspecifiedType().(ArrayType).getArraySize() = size and @@ -90,13 +90,13 @@ module PointerArithmeticToDerefConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { isInvalidPointerDerefSink(sink, _, _) } } -module PointerArithmeticToDerefFlow = DataFlow::Make; +module PointerArithmeticToDerefFlow = DataFlow::Global; from Field f, PointerArithmeticToDerefFlow::PathNode source, PointerArithmeticToDerefFlow::PathNode sink, Instruction deref, string operation, int delta where - PointerArithmeticToDerefFlow::hasFlowPath(source, sink) and + PointerArithmeticToDerefFlow::flowPath(source, sink) and isInvalidPointerDerefSink(sink.getNode(), deref, operation) and isConstantSizeOverflowSource(f, source.getNode().asInstruction(), delta) select source, source, sink, diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-193/InvalidPointerDeref.ql b/cpp/ql/src/experimental/Security/CWE/CWE-193/InvalidPointerDeref.ql index 9cadcb505d0..cfd610767de 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-193/InvalidPointerDeref.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-193/InvalidPointerDeref.ql @@ -209,7 +209,7 @@ module InvalidPointerToDerefConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { isInvalidPointerDerefSink(sink, _, _) } } -module InvalidPointerToDerefFlow = DataFlow::Make; +module InvalidPointerToDerefFlow = DataFlow::Global; /** * Holds if `pai` is a pointer-arithmetic operation and `source` is a dataflow node with a @@ -241,7 +241,7 @@ newtype TMergedPathNode = // pointer, but we want to raise an alert at the dereference. TPathNodeSink(Instruction i) { exists(DataFlow::Node n | - InvalidPointerToDerefFlow::hasFlow(_, n) and + InvalidPointerToDerefFlow::flow(_, n) and isInvalidPointerDerefSink(n, i, _) ) } @@ -349,7 +349,7 @@ predicate hasFlowPath( | conf1.hasFlowPath(source1.asPathNode1(), _, sink1, _) and joinOn1(pai, sink1, source3) and - InvalidPointerToDerefFlow::hasFlowPath(source3, sink3) and + InvalidPointerToDerefFlow::flowPath(source3, sink3) and joinOn2(sink3, sink.asSinkNode(), operation) ) } diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-359/PrivateCleartextWrite.ql b/cpp/ql/src/experimental/Security/CWE/CWE-359/PrivateCleartextWrite.ql index c09277f38f2..2355c276b60 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-359/PrivateCleartextWrite.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-359/PrivateCleartextWrite.ql @@ -16,7 +16,7 @@ import experimental.semmle.code.cpp.security.PrivateCleartextWrite::PrivateClear import WriteFlow::PathGraph from WriteFlow::PathNode source, WriteFlow::PathNode sink -where WriteFlow::hasFlowPath(source, sink) +where WriteFlow::flowPath(source, sink) select sink.getNode(), source, sink, "This write into the external location '" + sink.getNode() + "' may contain unencrypted data from $@.", source, "this source of private data." diff --git a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise2.ql b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise2.ql index 3fbc4fc10fd..a27e6382916 100644 --- a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise2.ql +++ b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise2.ql @@ -12,11 +12,11 @@ module LiteralToGethostbynameConfig implements DataFlow::ConfigSig { } } -module LiteralToGethostbynameFlow = DataFlow::Make; +module LiteralToGethostbynameFlow = DataFlow::Global; from StringLiteral sl, FunctionCall fc, DataFlow::Node source, DataFlow::Node sink where source.asIndirectExpr(1) = sl and sink.asIndirectExpr(1) = fc.getArgument(0) and - LiteralToGethostbynameFlow::hasFlow(source, sink) + LiteralToGethostbynameFlow::flow(source, sink) select sl, fc diff --git a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise4.ql b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise4.ql index fc73440cd7b..09d580234fb 100644 --- a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise4.ql +++ b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/exercise4.ql @@ -16,11 +16,11 @@ module GetenvToGethostbynameConfig implements DataFlow::ConfigSig { } } -module GetenvToGethostbynameFlow = DataFlow::Make; +module GetenvToGethostbynameFlow = DataFlow::Global; from Expr getenv, FunctionCall fc, DataFlow::Node source, DataFlow::Node sink where source.asIndirectExpr(1) = getenv and sink.asIndirectExpr(1) = fc.getArgument(0) and - GetenvToGethostbynameFlow::hasFlow(source, sink) + GetenvToGethostbynameFlow::flow(source, sink) select getenv, fc diff --git a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/fopen-flow-from-getenv.ql b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/fopen-flow-from-getenv.ql index 7d810156e7d..917193b2994 100644 --- a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/fopen-flow-from-getenv.ql +++ b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/fopen-flow-from-getenv.ql @@ -17,11 +17,11 @@ module EnvironmentToFileConfig implements DataFlow::ConfigSig { } } -module EnvironmentToFileFlow = DataFlow::Make; +module EnvironmentToFileFlow = DataFlow::Global; from Expr getenv, Expr fopen, DataFlow::Node source, DataFlow::Node sink where source.asIndirectExpr(1) = getenv and sink.asIndirectExpr(1) = fopen and - EnvironmentToFileFlow::hasFlow(source, sink) + EnvironmentToFileFlow::flow(source, sink) select fopen, "This 'fopen' uses data from $@.", getenv, "call to 'getenv'" diff --git a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/index-flow-from-ntohl.ql b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/index-flow-from-ntohl.ql index a81c3a71d75..15cc379131a 100644 --- a/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/index-flow-from-ntohl.ql +++ b/cpp/ql/test/examples/docs-examples/analyzing-data-flow-in-cpp/index-flow-from-ntohl.ql @@ -30,9 +30,9 @@ module NetworkToBufferSizeConfig implements DataFlow::ConfigSig { } } -module NetworkToBufferSizeFlow = TaintTracking::Make; +module NetworkToBufferSizeFlow = TaintTracking::Global; from DataFlow::Node ntohl, DataFlow::Node offset -where NetworkToBufferSizeFlow::hasFlow(ntohl, offset) +where NetworkToBufferSizeFlow::flow(ntohl, offset) select offset, "This array offset may be influenced by $@.", ntohl, "converted data from the network" diff --git a/cpp/ql/test/library-tests/dataflow/additional-flow-to-parameter/standardFlow.ql b/cpp/ql/test/library-tests/dataflow/additional-flow-to-parameter/standardFlow.ql index 1497702db76..d929b6557a4 100644 --- a/cpp/ql/test/library-tests/dataflow/additional-flow-to-parameter/standardFlow.ql +++ b/cpp/ql/test/library-tests/dataflow/additional-flow-to-parameter/standardFlow.ql @@ -14,8 +14,8 @@ module TestConfig implements DataFlow::ConfigSig { } } -module TestFlow = DataFlow::Make; +module TestFlow = DataFlow::Global; from DataFlow::Node sink, DataFlow::Node source -where TestFlow::hasFlow(source, sink) +where TestFlow::flow(source, sink) select sink, source diff --git a/cpp/ql/test/library-tests/dataflow/additional-flow-to-parameter/withAdditionalFlow.ql b/cpp/ql/test/library-tests/dataflow/additional-flow-to-parameter/withAdditionalFlow.ql index c46d2cddf88..49e98db06ae 100644 --- a/cpp/ql/test/library-tests/dataflow/additional-flow-to-parameter/withAdditionalFlow.ql +++ b/cpp/ql/test/library-tests/dataflow/additional-flow-to-parameter/withAdditionalFlow.ql @@ -25,8 +25,8 @@ module TestConfig implements DataFlow::ConfigSig { } } -module TestFlow = DataFlow::Make; +module TestFlow = DataFlow::Global; from DataFlow::Node sink, DataFlow::Node source -where TestFlow::hasFlow(source, sink) +where TestFlow::flow(source, sink) select sink, source diff --git a/cpp/ql/test/library-tests/dataflow/crement/from0.ql b/cpp/ql/test/library-tests/dataflow/crement/from0.ql index 90bf8401fba..d395920c030 100644 --- a/cpp/ql/test/library-tests/dataflow/crement/from0.ql +++ b/cpp/ql/test/library-tests/dataflow/crement/from0.ql @@ -7,8 +7,8 @@ module Cfg implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node sink) { sink.asExpr() instanceof VariableAccess } } -module Flow = DataFlow::Make; +module Flow = DataFlow::Global; from Expr sink -where Flow::hasFlowToExpr(sink) +where Flow::flowToExpr(sink) select sink From d0b7ffda703edbde6d889d691c997c6ed59e9748 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 23 Mar 2023 13:01:38 +0100 Subject: [PATCH 103/143] Python/Ruby/Swift: Rename references. --- python/ql/src/Security/CWE-327/FluentApiModel.qll | 4 ++-- ruby/ql/lib/codeql/ruby/security/StoredXSSQuery.qll | 2 +- ruby/ql/lib/codeql/ruby/security/XSS.qll | 4 ++-- ruby/ql/src/queries/security/cwe-079/StoredXSS.ql | 2 +- swift/ql/src/queries/Summary/SummaryStats.ql | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/python/ql/src/Security/CWE-327/FluentApiModel.qll b/python/ql/src/Security/CWE-327/FluentApiModel.qll index 3f479bc1627..6ba3231f49b 100644 --- a/python/ql/src/Security/CWE-327/FluentApiModel.qll +++ b/python/ql/src/Security/CWE-327/FluentApiModel.qll @@ -112,7 +112,7 @@ module InsecureContextConfiguration2 implements DataFlow::StateConfigSig { } } -private module InsecureContextFlow = DataFlow::MakeWithState; +private module InsecureContextFlow = DataFlow::GlobalWithState; /** * Holds if `conectionCreation` marks the creation of a connection based on the contex @@ -127,7 +127,7 @@ predicate unsafe_connection_creation_with_context( ) { // Connection created from a context allowing `insecure_version`. exists(InsecureContextFlow::PathNode src, InsecureContextFlow::PathNode sink | - InsecureContextFlow::hasFlowPath(src, sink) and + InsecureContextFlow::flowPath(src, sink) and src.getNode() = contextOrigin and sink.getNode() = connectionCreation and sink.getState().allowsInsecureVersion(insecure_version) and diff --git a/ruby/ql/lib/codeql/ruby/security/StoredXSSQuery.qll b/ruby/ql/lib/codeql/ruby/security/StoredXSSQuery.qll index abec1880e65..f08529988c7 100644 --- a/ruby/ql/lib/codeql/ruby/security/StoredXSSQuery.qll +++ b/ruby/ql/lib/codeql/ruby/security/StoredXSSQuery.qll @@ -56,7 +56,7 @@ module StoredXss { } } - import TaintTracking::Make + import TaintTracking::Global } /** DEPRECATED: Alias for StoredXss */ diff --git a/ruby/ql/lib/codeql/ruby/security/XSS.qll b/ruby/ql/lib/codeql/ruby/security/XSS.qll index dbed650250e..d4b99766a58 100644 --- a/ruby/ql/lib/codeql/ruby/security/XSS.qll +++ b/ruby/ql/lib/codeql/ruby/security/XSS.qll @@ -304,7 +304,7 @@ private module OrmTracking { } } - import DataFlow::Make + import DataFlow::Global } /** Provides default sources, sinks and sanitizers for detecting stored cross-site scripting (XSS) vulnerabilities. */ @@ -336,7 +336,7 @@ module StoredXss { private class OrmFieldAsSource extends Source instanceof DataFlow::CallNode { OrmFieldAsSource() { exists(DataFlow::CallNode subSrc | - OrmTracking::hasFlow(subSrc, this.getReceiver()) and + OrmTracking::flow(subSrc, this.getReceiver()) and subSrc.(OrmInstantiation).methodCallMayAccessField(this.getMethodName()) ) } diff --git a/ruby/ql/src/queries/security/cwe-079/StoredXSS.ql b/ruby/ql/src/queries/security/cwe-079/StoredXSS.ql index 1dc855230a1..da1bd427589 100644 --- a/ruby/ql/src/queries/security/cwe-079/StoredXSS.ql +++ b/ruby/ql/src/queries/security/cwe-079/StoredXSS.ql @@ -17,6 +17,6 @@ import codeql.ruby.security.StoredXSSQuery import StoredXss::PathGraph from StoredXss::PathNode source, StoredXss::PathNode sink -where StoredXss::hasFlowPath(source, sink) +where StoredXss::flowPath(source, sink) select sink.getNode(), source, sink, "Stored cross-site scripting vulnerability due to $@.", source.getNode(), "stored value" diff --git a/swift/ql/src/queries/Summary/SummaryStats.ql b/swift/ql/src/queries/Summary/SummaryStats.ql index 10dcc0c5199..444c4da2ca2 100644 --- a/swift/ql/src/queries/Summary/SummaryStats.ql +++ b/swift/ql/src/queries/Summary/SummaryStats.ql @@ -21,12 +21,12 @@ module TaintReachConfig implements DataFlow::ConfigSig { predicate isSink(DataFlow::Node node) { any() } } -module TaintReachFlow = TaintTracking::Make; +module TaintReachFlow = TaintTracking::Global; /** * Gets the total number of dataflow nodes that taint reaches (from any source). */ -int taintedNodesCount() { result = count(DataFlow::Node n | TaintReachFlow::hasFlowTo(n)) } +int taintedNodesCount() { result = count(DataFlow::Node n | TaintReachFlow::flowTo(n)) } /** * Gets the proportion of dataflow nodes that taint reaches (from any source), From 978c5f7bd814ee7ef67f79cb1a5deb3fc9b192b6 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 23 Mar 2023 13:05:39 +0100 Subject: [PATCH 104/143] Java/C++: Autoformat --- .../Leap Year/UncheckedLeapYearAfterYearModification.ql | 6 ++---- .../Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql | 3 ++- .../code/java/security/ArbitraryApkInstallationQuery.qll | 3 ++- java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql | 3 +-- java/ql/src/Security/CWE/CWE-807/TaintedPermissionsCheck.ql | 3 +-- 5 files changed, 8 insertions(+), 10 deletions(-) diff --git a/cpp/ql/src/Likely Bugs/Leap Year/UncheckedLeapYearAfterYearModification.ql b/cpp/ql/src/Likely Bugs/Leap Year/UncheckedLeapYearAfterYearModification.ql index 1cc51a0d3e2..03570b3611c 100644 --- a/cpp/ql/src/Likely Bugs/Leap Year/UncheckedLeapYearAfterYearModification.ql +++ b/cpp/ql/src/Likely Bugs/Leap Year/UncheckedLeapYearAfterYearModification.ql @@ -31,16 +31,14 @@ where // If there is a data flow from the variable that was modified to a function that seems to check for leap year exists(VariableAccess source, ChecksForLeapYearFunctionCall fc | source = var.getAnAccess() and - LeapYearCheckFlow::flow(DataFlow::exprNode(source), - DataFlow::exprNode(fc.getAnArgument())) + LeapYearCheckFlow::flow(DataFlow::exprNode(source), DataFlow::exprNode(fc.getAnArgument())) ) or // If there is a data flow from the field that was modified to a function that seems to check for leap year exists(VariableAccess vacheck, YearFieldAccess yfacheck, ChecksForLeapYearFunctionCall fc | vacheck = var.getAnAccess() and yfacheck.getQualifier() = vacheck and - LeapYearCheckFlow::flow(DataFlow::exprNode(yfacheck), - DataFlow::exprNode(fc.getAnArgument())) + LeapYearCheckFlow::flow(DataFlow::exprNode(yfacheck), DataFlow::exprNode(fc.getAnArgument())) ) or // If there is a successor or predecessor that sets the month = 1 diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql b/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql index b8e439be05c..f90f0bdcab8 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-193/ConstantSizeArrayOffByOne.ql @@ -43,7 +43,8 @@ module FieldAddressToPointerArithmeticConfig implements DataFlow::ConfigSig { } } -module FieldAddressToPointerArithmeticFlow = DataFlow::Global; +module FieldAddressToPointerArithmeticFlow = + DataFlow::Global; predicate isFieldAddressSource(Field f, DataFlow::Node source) { source.asInstruction().(FieldAddressInstruction).getField() = f diff --git a/java/ql/lib/semmle/code/java/security/ArbitraryApkInstallationQuery.qll b/java/ql/lib/semmle/code/java/security/ArbitraryApkInstallationQuery.qll index c44db421301..d066f4974a1 100644 --- a/java/ql/lib/semmle/code/java/security/ArbitraryApkInstallationQuery.qll +++ b/java/ql/lib/semmle/code/java/security/ArbitraryApkInstallationQuery.qll @@ -72,7 +72,8 @@ private module InstallPackageActionConfig implements DataFlow::StateConfigSig { predicate isBarrier(DataFlow::Node node, FlowState state) { none() } } -private module InstallPackageActionFlow = TaintTracking::GlobalWithState; +private module InstallPackageActionFlow = + TaintTracking::GlobalWithState; private newtype MimeTypeState = MimeTypeUnset() or diff --git a/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql b/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql index 0a40c11dfe9..98a342bcb27 100644 --- a/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql +++ b/java/ql/src/Security/CWE/CWE-209/StackTraceExposure.ql @@ -104,8 +104,7 @@ predicate printsStackExternally(MethodAccess call, Expr stackTrace) { predicate stringifiedStackFlowsExternally(DataFlow::Node externalExpr, Expr stackTrace) { exists(MethodAccess stackTraceString | stackTraceExpr(stackTrace, stackTraceString) and - StackTraceStringToHttpResponseSinkFlow::flow(DataFlow::exprNode(stackTraceString), - externalExpr) + StackTraceStringToHttpResponseSinkFlow::flow(DataFlow::exprNode(stackTraceString), externalExpr) ) } diff --git a/java/ql/src/Security/CWE/CWE-807/TaintedPermissionsCheck.ql b/java/ql/src/Security/CWE/CWE-807/TaintedPermissionsCheck.ql index 8debae02267..87266e0df47 100644 --- a/java/ql/src/Security/CWE/CWE-807/TaintedPermissionsCheck.ql +++ b/java/ql/src/Security/CWE/CWE-807/TaintedPermissionsCheck.ql @@ -67,7 +67,6 @@ import TaintedPermissionsCheckFlow::PathGraph from TaintedPermissionsCheckFlow::PathNode source, TaintedPermissionsCheckFlow::PathNode sink, PermissionsConstruction p -where - sink.getNode().asExpr() = p.getInput() and TaintedPermissionsCheckFlow::flowPath(source, sink) +where sink.getNode().asExpr() = p.getInput() and TaintedPermissionsCheckFlow::flowPath(source, sink) select p, source, sink, "Permissions check depends on a $@.", source.getNode(), "user-controlled value" From ab95a0b9f095d0e6cbb14bb236f6af208cbe978a Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 23 Mar 2023 13:09:09 +0100 Subject: [PATCH 105/143] Java/C#: Rename references --- .../utils/modelgenerator/internal/CaptureModels.qll | 12 ++++++------ .../utils/modelgenerator/internal/CaptureModels.qll | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll b/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll index 7dbdc5bee52..5ca3ffed782 100644 --- a/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll +++ b/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll @@ -210,7 +210,7 @@ module ThroughFlowConfig implements DataFlow::StateConfigSig { } } -private module ThroughFlow = TaintTracking::MakeWithState; +private module ThroughFlow = TaintTracking::GlobalWithState; /** * Gets the summary model(s) of `api`, if there is flow from parameters to return value or parameter. @@ -220,7 +220,7 @@ string captureThroughFlow(DataFlowTargetApi api) { DataFlow::ParameterNode p, DataFlowImplCommon::ReturnNodeExt returnNodeExt, string input, string output | - ThroughFlow::hasFlow(p, returnNodeExt) and + ThroughFlow::flow(p, returnNodeExt) and returnNodeExt.getEnclosingCallable() = api and input = parameterNodeAsInput(p) and output = returnNodeAsOutput(returnNodeExt) and @@ -253,14 +253,14 @@ module FromSourceConfig implements DataFlow::ConfigSig { } } -private module FromSource = TaintTracking::Make; +private module FromSource = TaintTracking::Global; /** * Gets the source model(s) of `api`, if there is flow from an existing known source to the return of `api`. */ string captureSource(DataFlowTargetApi api) { exists(DataFlow::Node source, DataFlow::Node sink, string kind | - FromSource::hasFlow(source, sink) and + FromSource::flow(source, sink) and ExternalFlow::sourceNode(source, kind) and api = sink.getEnclosingCallable() and isRelevantSourceKind(kind) and @@ -285,14 +285,14 @@ module PropagateToSinkConfig implements DataFlow::ConfigSig { DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSourceCallContext } } -private module PropagateToSink = TaintTracking::Make; +private module PropagateToSink = TaintTracking::Global; /** * Gets the sink model(s) of `api`, if there is flow from a parameter to an existing known sink. */ string captureSink(DataFlowTargetApi api) { exists(DataFlow::Node src, DataFlow::Node sink, string kind | - PropagateToSink::hasFlow(src, sink) and + PropagateToSink::flow(src, sink) and ExternalFlow::sinkNode(sink, kind) and api = src.getEnclosingCallable() and isRelevantSinkKind(kind) and diff --git a/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll b/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll index 7dbdc5bee52..5ca3ffed782 100644 --- a/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll +++ b/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll @@ -210,7 +210,7 @@ module ThroughFlowConfig implements DataFlow::StateConfigSig { } } -private module ThroughFlow = TaintTracking::MakeWithState; +private module ThroughFlow = TaintTracking::GlobalWithState; /** * Gets the summary model(s) of `api`, if there is flow from parameters to return value or parameter. @@ -220,7 +220,7 @@ string captureThroughFlow(DataFlowTargetApi api) { DataFlow::ParameterNode p, DataFlowImplCommon::ReturnNodeExt returnNodeExt, string input, string output | - ThroughFlow::hasFlow(p, returnNodeExt) and + ThroughFlow::flow(p, returnNodeExt) and returnNodeExt.getEnclosingCallable() = api and input = parameterNodeAsInput(p) and output = returnNodeAsOutput(returnNodeExt) and @@ -253,14 +253,14 @@ module FromSourceConfig implements DataFlow::ConfigSig { } } -private module FromSource = TaintTracking::Make; +private module FromSource = TaintTracking::Global; /** * Gets the source model(s) of `api`, if there is flow from an existing known source to the return of `api`. */ string captureSource(DataFlowTargetApi api) { exists(DataFlow::Node source, DataFlow::Node sink, string kind | - FromSource::hasFlow(source, sink) and + FromSource::flow(source, sink) and ExternalFlow::sourceNode(source, kind) and api = sink.getEnclosingCallable() and isRelevantSourceKind(kind) and @@ -285,14 +285,14 @@ module PropagateToSinkConfig implements DataFlow::ConfigSig { DataFlow::FlowFeature getAFeature() { result instanceof DataFlow::FeatureHasSourceCallContext } } -private module PropagateToSink = TaintTracking::Make; +private module PropagateToSink = TaintTracking::Global; /** * Gets the sink model(s) of `api`, if there is flow from a parameter to an existing known sink. */ string captureSink(DataFlowTargetApi api) { exists(DataFlow::Node src, DataFlow::Node sink, string kind | - PropagateToSink::hasFlow(src, sink) and + PropagateToSink::flow(src, sink) and ExternalFlow::sinkNode(sink, kind) and api = src.getEnclosingCallable() and isRelevantSinkKind(kind) and From b1d9c651947a4e435b10808130c6f97880b24c3e Mon Sep 17 00:00:00 2001 From: Salah Baddou Date: Thu, 23 Mar 2023 12:11:07 +0000 Subject: [PATCH 106/143] Add JndiInjection Sanitizer Class --- .../semmle/code/java/security/JndiInjectionQuery.qll | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/java/ql/lib/semmle/code/java/security/JndiInjectionQuery.qll b/java/ql/lib/semmle/code/java/security/JndiInjectionQuery.qll index 9130bb6c7a2..1c8ef38c7ea 100644 --- a/java/ql/lib/semmle/code/java/security/JndiInjectionQuery.qll +++ b/java/ql/lib/semmle/code/java/security/JndiInjectionQuery.qll @@ -17,7 +17,9 @@ class JndiInjectionFlowConfig extends TaintTracking::Configuration { override predicate isSink(DataFlow::Node sink) { sink instanceof JndiInjectionSink } override predicate isSanitizer(DataFlow::Node node) { - node.getType() instanceof PrimitiveType or node.getType() instanceof BoxedType + node.getType() instanceof PrimitiveType or node.getType() instanceof BoxedType + or + node instanceof JndiInjectionSanitizer } override predicate isAdditionalTaintStep(DataFlow::Node node1, DataFlow::Node node2) { @@ -25,6 +27,12 @@ class JndiInjectionFlowConfig extends TaintTracking::Configuration { } } +/** + * A Class to be extended for Sanitizer Customizations + */ + +abstract class JndiInjectionSanitizer extends DataFlow::Node { } + /** * A method that does a JNDI lookup when it receives a `SearchControls` argument with `setReturningObjFlag` = `true` */ From 27c29303dab7d79511de01106c7207713604a31e Mon Sep 17 00:00:00 2001 From: erik-krogh Date: Thu, 23 Mar 2023 13:12:22 +0100 Subject: [PATCH 107/143] add test diagnostics test for internal error --- .../internal-error/diagnostics.expected | 15 +++++++++++++++ .../internal-error/src/my_failure.ts | 17 +++++++++++++++++ .../diagnostics/internal-error/test.py | 7 +++++++ .../diagnostics/internal-error/tsconfig.json | 1 + 4 files changed, 40 insertions(+) create mode 100644 javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/diagnostics.expected create mode 100644 javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/src/my_failure.ts create mode 100644 javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/test.py create mode 100644 javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/tsconfig.json diff --git a/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/diagnostics.expected b/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/diagnostics.expected new file mode 100644 index 00000000000..72108d0ebb5 --- /dev/null +++ b/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/diagnostics.expected @@ -0,0 +1,15 @@ +{ + "timestamp": "2023-03-23T12:04:41.317+00:00", + "source": { + "id": "js/internal-error", + "name": "Internal error", + "extractorName": "javascript" + }, + "markdownMessage": "Internal error: com.semmle.util.exception.CatastrophicError: The TypeScript parser wrapper crashed with exit code 1", + "severity": "unknown", + "visibility": { + "cliSummaryTable": true, + "statusPage": false, + "telemetry": true + } +} \ No newline at end of file diff --git a/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/src/my_failure.ts b/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/src/my_failure.ts new file mode 100644 index 00000000000..29e78b136e8 --- /dev/null +++ b/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/src/my_failure.ts @@ -0,0 +1,17 @@ +type Output = { + (...args: S): any; +}; + +declare function createThing( + type: K, + fn: (...args: S) => any +): Output; + +const one = createThing("one", () => ({})); + +const two = createThing("two", () => ({})); + +const three = createThing("three", (cursor: string) => null); +const four = createThing("four", (error: number) => null); + +type Events = Array; diff --git a/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/test.py b/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/test.py new file mode 100644 index 00000000000..3f6c33bf31c --- /dev/null +++ b/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/test.py @@ -0,0 +1,7 @@ +import os +from create_database_utils import * +from diagnostics_test_utils import * + +run_codeql_database_create([], lang="javascript", runFunction = runUnsuccessfully, db = None) + +check_diagnostics() diff --git a/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/tsconfig.json b/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/tsconfig.json new file mode 100644 index 00000000000..9e26dfeeb6e --- /dev/null +++ b/javascript/ql/integration-tests/all-platforms/diagnostics/internal-error/tsconfig.json @@ -0,0 +1 @@ +{} \ No newline at end of file From 1c1aa7ecdd164e9915669f1318b2dc76e72d0961 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 23 Mar 2023 13:17:36 +0100 Subject: [PATCH 108/143] Dataflow: Add change notes. --- cpp/ql/lib/change-notes/2023-03-23-dataflow-renaming.md | 6 ++++++ csharp/ql/lib/change-notes/2023-03-23-dataflow-renaming.md | 6 ++++++ go/ql/lib/change-notes/2023-03-23-dataflow-renaming.md | 6 ++++++ java/ql/lib/change-notes/2023-03-23-dataflow-renaming.md | 6 ++++++ python/ql/lib/change-notes/2023-03-23-dataflow-renaming.md | 6 ++++++ ruby/ql/lib/change-notes/2023-03-23-dataflow-renaming.md | 6 ++++++ 6 files changed, 36 insertions(+) create mode 100644 cpp/ql/lib/change-notes/2023-03-23-dataflow-renaming.md create mode 100644 csharp/ql/lib/change-notes/2023-03-23-dataflow-renaming.md create mode 100644 go/ql/lib/change-notes/2023-03-23-dataflow-renaming.md create mode 100644 java/ql/lib/change-notes/2023-03-23-dataflow-renaming.md create mode 100644 python/ql/lib/change-notes/2023-03-23-dataflow-renaming.md create mode 100644 ruby/ql/lib/change-notes/2023-03-23-dataflow-renaming.md diff --git a/cpp/ql/lib/change-notes/2023-03-23-dataflow-renaming.md b/cpp/ql/lib/change-notes/2023-03-23-dataflow-renaming.md new file mode 100644 index 00000000000..54df71fae46 --- /dev/null +++ b/cpp/ql/lib/change-notes/2023-03-23-dataflow-renaming.md @@ -0,0 +1,6 @@ +--- +category: deprecated +--- +* The recently introduced new data flow and taint tracking APIs have had a + number of module and predicate renamings. The old APIs remain in place for + now. diff --git a/csharp/ql/lib/change-notes/2023-03-23-dataflow-renaming.md b/csharp/ql/lib/change-notes/2023-03-23-dataflow-renaming.md new file mode 100644 index 00000000000..54df71fae46 --- /dev/null +++ b/csharp/ql/lib/change-notes/2023-03-23-dataflow-renaming.md @@ -0,0 +1,6 @@ +--- +category: deprecated +--- +* The recently introduced new data flow and taint tracking APIs have had a + number of module and predicate renamings. The old APIs remain in place for + now. diff --git a/go/ql/lib/change-notes/2023-03-23-dataflow-renaming.md b/go/ql/lib/change-notes/2023-03-23-dataflow-renaming.md new file mode 100644 index 00000000000..54df71fae46 --- /dev/null +++ b/go/ql/lib/change-notes/2023-03-23-dataflow-renaming.md @@ -0,0 +1,6 @@ +--- +category: deprecated +--- +* The recently introduced new data flow and taint tracking APIs have had a + number of module and predicate renamings. The old APIs remain in place for + now. diff --git a/java/ql/lib/change-notes/2023-03-23-dataflow-renaming.md b/java/ql/lib/change-notes/2023-03-23-dataflow-renaming.md new file mode 100644 index 00000000000..54df71fae46 --- /dev/null +++ b/java/ql/lib/change-notes/2023-03-23-dataflow-renaming.md @@ -0,0 +1,6 @@ +--- +category: deprecated +--- +* The recently introduced new data flow and taint tracking APIs have had a + number of module and predicate renamings. The old APIs remain in place for + now. diff --git a/python/ql/lib/change-notes/2023-03-23-dataflow-renaming.md b/python/ql/lib/change-notes/2023-03-23-dataflow-renaming.md new file mode 100644 index 00000000000..54df71fae46 --- /dev/null +++ b/python/ql/lib/change-notes/2023-03-23-dataflow-renaming.md @@ -0,0 +1,6 @@ +--- +category: deprecated +--- +* The recently introduced new data flow and taint tracking APIs have had a + number of module and predicate renamings. The old APIs remain in place for + now. diff --git a/ruby/ql/lib/change-notes/2023-03-23-dataflow-renaming.md b/ruby/ql/lib/change-notes/2023-03-23-dataflow-renaming.md new file mode 100644 index 00000000000..54df71fae46 --- /dev/null +++ b/ruby/ql/lib/change-notes/2023-03-23-dataflow-renaming.md @@ -0,0 +1,6 @@ +--- +category: deprecated +--- +* The recently introduced new data flow and taint tracking APIs have had a + number of module and predicate renamings. The old APIs remain in place for + now. From 4993e7c149ab809d4ef43278e66d5defb099b642 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 23 Mar 2023 13:39:53 +0100 Subject: [PATCH 109/143] Dataflow: Rename output signature --- .../semmle/code/java/dataflow/internal/DataFlow.qll | 12 ++++++------ .../internal/tainttracking1/TaintTracking.qll | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll index 82714ed1af6..137612c52af 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll @@ -188,9 +188,9 @@ signature module StateConfigSig { signature int explorationLimitSig(); /** - * The output of a data flow computation. + * The output of a global data flow computation. */ -signature module DataFlowSig { +signature module GlobalFlowSig { /** * A `Node` augmented with a call context (except for sinks) and an access path. * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. @@ -224,7 +224,7 @@ signature module DataFlowSig { /** * Constructs a standard data flow computation. */ -module Global implements DataFlowSig { +module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -234,14 +234,14 @@ module Global implements DataFlowSig { } /** DEPRECATED: Use `Global` instead. */ -deprecated module Make implements DataFlowSig { +deprecated module Make implements GlobalFlowSig { import Global } /** * Constructs a data flow computation using flow state. */ -module GlobalWithState implements DataFlowSig { +module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { import Config } @@ -250,7 +250,7 @@ module GlobalWithState implements DataFlowSig { } /** DEPRECATED: Use `GlobalWithState` instead. */ -deprecated module MakeWithState implements DataFlowSig { +deprecated module MakeWithState implements GlobalFlowSig { import GlobalWithState } diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTracking.qll b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTracking.qll index 192a52f44e3..3f8cef3698a 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTracking.qll @@ -35,7 +35,7 @@ private module AddTaintDefaults imp /** * Constructs a standard taint tracking computation. */ -module Global implements DataFlow::DataFlowSig { +module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -49,14 +49,14 @@ module Global implements DataFlow::DataFlowSig { } /** DEPRECATED: Use `Global` instead. */ -deprecated module Make implements DataFlow::DataFlowSig { +deprecated module Make implements DataFlow::GlobalFlowSig { import Global } /** * Constructs a taint tracking computation using flow state. */ -module GlobalWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -69,6 +69,6 @@ module GlobalWithState implements DataFlow::Dat } /** DEPRECATED: Use `GlobalWithState` instead. */ -deprecated module MakeWithState implements DataFlow::DataFlowSig { +deprecated module MakeWithState implements DataFlow::GlobalFlowSig { import GlobalWithState } From d440bc2d0cc0c4c978378e44e09d324e3e9930b9 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 23 Mar 2023 13:40:23 +0100 Subject: [PATCH 110/143] Dataflow: Sync. --- .../semmle/code/cpp/dataflow/internal/DataFlow.qll | 12 ++++++------ .../internal/tainttracking1/TaintTracking.qll | 8 ++++---- .../code/cpp/ir/dataflow/internal/DataFlow.qll | 12 ++++++------ .../internal/tainttracking1/TaintTracking.qll | 8 ++++---- .../code/csharp/dataflow/internal/DataFlow.qll | 12 ++++++------ .../internal/tainttracking1/TaintTracking.qll | 8 ++++---- go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll | 12 ++++++------ .../internal/tainttracking1/TaintTracking.qll | 8 ++++---- .../semmle/python/dataflow/new/internal/DataFlow.qll | 12 ++++++------ .../new/internal/tainttracking1/TaintTracking.qll | 8 ++++---- .../lib/codeql/ruby/dataflow/internal/DataFlow.qll | 12 ++++++------ .../internal/tainttracking1/TaintTracking.qll | 8 ++++---- .../lib/codeql/swift/dataflow/internal/DataFlow.qll | 12 ++++++------ .../internal/tainttracking1/TaintTracking.qll | 8 ++++---- 14 files changed, 70 insertions(+), 70 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll index 82714ed1af6..137612c52af 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll @@ -188,9 +188,9 @@ signature module StateConfigSig { signature int explorationLimitSig(); /** - * The output of a data flow computation. + * The output of a global data flow computation. */ -signature module DataFlowSig { +signature module GlobalFlowSig { /** * A `Node` augmented with a call context (except for sinks) and an access path. * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. @@ -224,7 +224,7 @@ signature module DataFlowSig { /** * Constructs a standard data flow computation. */ -module Global implements DataFlowSig { +module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -234,14 +234,14 @@ module Global implements DataFlowSig { } /** DEPRECATED: Use `Global` instead. */ -deprecated module Make implements DataFlowSig { +deprecated module Make implements GlobalFlowSig { import Global } /** * Constructs a data flow computation using flow state. */ -module GlobalWithState implements DataFlowSig { +module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { import Config } @@ -250,7 +250,7 @@ module GlobalWithState implements DataFlowSig { } /** DEPRECATED: Use `GlobalWithState` instead. */ -deprecated module MakeWithState implements DataFlowSig { +deprecated module MakeWithState implements GlobalFlowSig { import GlobalWithState } diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTracking.qll index 192a52f44e3..3f8cef3698a 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTracking.qll @@ -35,7 +35,7 @@ private module AddTaintDefaults imp /** * Constructs a standard taint tracking computation. */ -module Global implements DataFlow::DataFlowSig { +module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -49,14 +49,14 @@ module Global implements DataFlow::DataFlowSig { } /** DEPRECATED: Use `Global` instead. */ -deprecated module Make implements DataFlow::DataFlowSig { +deprecated module Make implements DataFlow::GlobalFlowSig { import Global } /** * Constructs a taint tracking computation using flow state. */ -module GlobalWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -69,6 +69,6 @@ module GlobalWithState implements DataFlow::Dat } /** DEPRECATED: Use `GlobalWithState` instead. */ -deprecated module MakeWithState implements DataFlow::DataFlowSig { +deprecated module MakeWithState implements DataFlow::GlobalFlowSig { import GlobalWithState } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll index 82714ed1af6..137612c52af 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll @@ -188,9 +188,9 @@ signature module StateConfigSig { signature int explorationLimitSig(); /** - * The output of a data flow computation. + * The output of a global data flow computation. */ -signature module DataFlowSig { +signature module GlobalFlowSig { /** * A `Node` augmented with a call context (except for sinks) and an access path. * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. @@ -224,7 +224,7 @@ signature module DataFlowSig { /** * Constructs a standard data flow computation. */ -module Global implements DataFlowSig { +module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -234,14 +234,14 @@ module Global implements DataFlowSig { } /** DEPRECATED: Use `Global` instead. */ -deprecated module Make implements DataFlowSig { +deprecated module Make implements GlobalFlowSig { import Global } /** * Constructs a data flow computation using flow state. */ -module GlobalWithState implements DataFlowSig { +module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { import Config } @@ -250,7 +250,7 @@ module GlobalWithState implements DataFlowSig { } /** DEPRECATED: Use `GlobalWithState` instead. */ -deprecated module MakeWithState implements DataFlowSig { +deprecated module MakeWithState implements GlobalFlowSig { import GlobalWithState } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTracking.qll index 192a52f44e3..3f8cef3698a 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTracking.qll @@ -35,7 +35,7 @@ private module AddTaintDefaults imp /** * Constructs a standard taint tracking computation. */ -module Global implements DataFlow::DataFlowSig { +module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -49,14 +49,14 @@ module Global implements DataFlow::DataFlowSig { } /** DEPRECATED: Use `Global` instead. */ -deprecated module Make implements DataFlow::DataFlowSig { +deprecated module Make implements DataFlow::GlobalFlowSig { import Global } /** * Constructs a taint tracking computation using flow state. */ -module GlobalWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -69,6 +69,6 @@ module GlobalWithState implements DataFlow::Dat } /** DEPRECATED: Use `GlobalWithState` instead. */ -deprecated module MakeWithState implements DataFlow::DataFlowSig { +deprecated module MakeWithState implements DataFlow::GlobalFlowSig { import GlobalWithState } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll index 82714ed1af6..137612c52af 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll @@ -188,9 +188,9 @@ signature module StateConfigSig { signature int explorationLimitSig(); /** - * The output of a data flow computation. + * The output of a global data flow computation. */ -signature module DataFlowSig { +signature module GlobalFlowSig { /** * A `Node` augmented with a call context (except for sinks) and an access path. * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. @@ -224,7 +224,7 @@ signature module DataFlowSig { /** * Constructs a standard data flow computation. */ -module Global implements DataFlowSig { +module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -234,14 +234,14 @@ module Global implements DataFlowSig { } /** DEPRECATED: Use `Global` instead. */ -deprecated module Make implements DataFlowSig { +deprecated module Make implements GlobalFlowSig { import Global } /** * Constructs a data flow computation using flow state. */ -module GlobalWithState implements DataFlowSig { +module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { import Config } @@ -250,7 +250,7 @@ module GlobalWithState implements DataFlowSig { } /** DEPRECATED: Use `GlobalWithState` instead. */ -deprecated module MakeWithState implements DataFlowSig { +deprecated module MakeWithState implements GlobalFlowSig { import GlobalWithState } diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTracking.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTracking.qll index 192a52f44e3..3f8cef3698a 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTracking.qll @@ -35,7 +35,7 @@ private module AddTaintDefaults imp /** * Constructs a standard taint tracking computation. */ -module Global implements DataFlow::DataFlowSig { +module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -49,14 +49,14 @@ module Global implements DataFlow::DataFlowSig { } /** DEPRECATED: Use `Global` instead. */ -deprecated module Make implements DataFlow::DataFlowSig { +deprecated module Make implements DataFlow::GlobalFlowSig { import Global } /** * Constructs a taint tracking computation using flow state. */ -module GlobalWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -69,6 +69,6 @@ module GlobalWithState implements DataFlow::Dat } /** DEPRECATED: Use `GlobalWithState` instead. */ -deprecated module MakeWithState implements DataFlow::DataFlowSig { +deprecated module MakeWithState implements DataFlow::GlobalFlowSig { import GlobalWithState } diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll index 82714ed1af6..137612c52af 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll @@ -188,9 +188,9 @@ signature module StateConfigSig { signature int explorationLimitSig(); /** - * The output of a data flow computation. + * The output of a global data flow computation. */ -signature module DataFlowSig { +signature module GlobalFlowSig { /** * A `Node` augmented with a call context (except for sinks) and an access path. * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. @@ -224,7 +224,7 @@ signature module DataFlowSig { /** * Constructs a standard data flow computation. */ -module Global implements DataFlowSig { +module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -234,14 +234,14 @@ module Global implements DataFlowSig { } /** DEPRECATED: Use `Global` instead. */ -deprecated module Make implements DataFlowSig { +deprecated module Make implements GlobalFlowSig { import Global } /** * Constructs a data flow computation using flow state. */ -module GlobalWithState implements DataFlowSig { +module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { import Config } @@ -250,7 +250,7 @@ module GlobalWithState implements DataFlowSig { } /** DEPRECATED: Use `GlobalWithState` instead. */ -deprecated module MakeWithState implements DataFlowSig { +deprecated module MakeWithState implements GlobalFlowSig { import GlobalWithState } diff --git a/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTracking.qll b/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTracking.qll index 192a52f44e3..3f8cef3698a 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTracking.qll @@ -35,7 +35,7 @@ private module AddTaintDefaults imp /** * Constructs a standard taint tracking computation. */ -module Global implements DataFlow::DataFlowSig { +module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -49,14 +49,14 @@ module Global implements DataFlow::DataFlowSig { } /** DEPRECATED: Use `Global` instead. */ -deprecated module Make implements DataFlow::DataFlowSig { +deprecated module Make implements DataFlow::GlobalFlowSig { import Global } /** * Constructs a taint tracking computation using flow state. */ -module GlobalWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -69,6 +69,6 @@ module GlobalWithState implements DataFlow::Dat } /** DEPRECATED: Use `GlobalWithState` instead. */ -deprecated module MakeWithState implements DataFlow::DataFlowSig { +deprecated module MakeWithState implements DataFlow::GlobalFlowSig { import GlobalWithState } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll index 82714ed1af6..137612c52af 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll @@ -188,9 +188,9 @@ signature module StateConfigSig { signature int explorationLimitSig(); /** - * The output of a data flow computation. + * The output of a global data flow computation. */ -signature module DataFlowSig { +signature module GlobalFlowSig { /** * A `Node` augmented with a call context (except for sinks) and an access path. * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. @@ -224,7 +224,7 @@ signature module DataFlowSig { /** * Constructs a standard data flow computation. */ -module Global implements DataFlowSig { +module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -234,14 +234,14 @@ module Global implements DataFlowSig { } /** DEPRECATED: Use `Global` instead. */ -deprecated module Make implements DataFlowSig { +deprecated module Make implements GlobalFlowSig { import Global } /** * Constructs a data flow computation using flow state. */ -module GlobalWithState implements DataFlowSig { +module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { import Config } @@ -250,7 +250,7 @@ module GlobalWithState implements DataFlowSig { } /** DEPRECATED: Use `GlobalWithState` instead. */ -deprecated module MakeWithState implements DataFlowSig { +deprecated module MakeWithState implements GlobalFlowSig { import GlobalWithState } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTracking.qll b/python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTracking.qll index 192a52f44e3..3f8cef3698a 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTracking.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTracking.qll @@ -35,7 +35,7 @@ private module AddTaintDefaults imp /** * Constructs a standard taint tracking computation. */ -module Global implements DataFlow::DataFlowSig { +module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -49,14 +49,14 @@ module Global implements DataFlow::DataFlowSig { } /** DEPRECATED: Use `Global` instead. */ -deprecated module Make implements DataFlow::DataFlowSig { +deprecated module Make implements DataFlow::GlobalFlowSig { import Global } /** * Constructs a taint tracking computation using flow state. */ -module GlobalWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -69,6 +69,6 @@ module GlobalWithState implements DataFlow::Dat } /** DEPRECATED: Use `GlobalWithState` instead. */ -deprecated module MakeWithState implements DataFlow::DataFlowSig { +deprecated module MakeWithState implements DataFlow::GlobalFlowSig { import GlobalWithState } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll index 82714ed1af6..137612c52af 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll @@ -188,9 +188,9 @@ signature module StateConfigSig { signature int explorationLimitSig(); /** - * The output of a data flow computation. + * The output of a global data flow computation. */ -signature module DataFlowSig { +signature module GlobalFlowSig { /** * A `Node` augmented with a call context (except for sinks) and an access path. * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. @@ -224,7 +224,7 @@ signature module DataFlowSig { /** * Constructs a standard data flow computation. */ -module Global implements DataFlowSig { +module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -234,14 +234,14 @@ module Global implements DataFlowSig { } /** DEPRECATED: Use `Global` instead. */ -deprecated module Make implements DataFlowSig { +deprecated module Make implements GlobalFlowSig { import Global } /** * Constructs a data flow computation using flow state. */ -module GlobalWithState implements DataFlowSig { +module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { import Config } @@ -250,7 +250,7 @@ module GlobalWithState implements DataFlowSig { } /** DEPRECATED: Use `GlobalWithState` instead. */ -deprecated module MakeWithState implements DataFlowSig { +deprecated module MakeWithState implements GlobalFlowSig { import GlobalWithState } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTracking.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTracking.qll index 192a52f44e3..3f8cef3698a 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTracking.qll @@ -35,7 +35,7 @@ private module AddTaintDefaults imp /** * Constructs a standard taint tracking computation. */ -module Global implements DataFlow::DataFlowSig { +module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -49,14 +49,14 @@ module Global implements DataFlow::DataFlowSig { } /** DEPRECATED: Use `Global` instead. */ -deprecated module Make implements DataFlow::DataFlowSig { +deprecated module Make implements DataFlow::GlobalFlowSig { import Global } /** * Constructs a taint tracking computation using flow state. */ -module GlobalWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -69,6 +69,6 @@ module GlobalWithState implements DataFlow::Dat } /** DEPRECATED: Use `GlobalWithState` instead. */ -deprecated module MakeWithState implements DataFlow::DataFlowSig { +deprecated module MakeWithState implements DataFlow::GlobalFlowSig { import GlobalWithState } diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll index 82714ed1af6..137612c52af 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll @@ -188,9 +188,9 @@ signature module StateConfigSig { signature int explorationLimitSig(); /** - * The output of a data flow computation. + * The output of a global data flow computation. */ -signature module DataFlowSig { +signature module GlobalFlowSig { /** * A `Node` augmented with a call context (except for sinks) and an access path. * Only those `PathNode`s that are reachable from a source, and which can reach a sink, are generated. @@ -224,7 +224,7 @@ signature module DataFlowSig { /** * Constructs a standard data flow computation. */ -module Global implements DataFlowSig { +module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { import DefaultState import Config @@ -234,14 +234,14 @@ module Global implements DataFlowSig { } /** DEPRECATED: Use `Global` instead. */ -deprecated module Make implements DataFlowSig { +deprecated module Make implements GlobalFlowSig { import Global } /** * Constructs a data flow computation using flow state. */ -module GlobalWithState implements DataFlowSig { +module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { import Config } @@ -250,7 +250,7 @@ module GlobalWithState implements DataFlowSig { } /** DEPRECATED: Use `GlobalWithState` instead. */ -deprecated module MakeWithState implements DataFlowSig { +deprecated module MakeWithState implements GlobalFlowSig { import GlobalWithState } diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTracking.qll b/swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTracking.qll index 192a52f44e3..3f8cef3698a 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTracking.qll @@ -35,7 +35,7 @@ private module AddTaintDefaults imp /** * Constructs a standard taint tracking computation. */ -module Global implements DataFlow::DataFlowSig { +module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import DataFlowInternal::DefaultState import Config @@ -49,14 +49,14 @@ module Global implements DataFlow::DataFlowSig { } /** DEPRECATED: Use `Global` instead. */ -deprecated module Make implements DataFlow::DataFlowSig { +deprecated module Make implements DataFlow::GlobalFlowSig { import Global } /** * Constructs a taint tracking computation using flow state. */ -module GlobalWithState implements DataFlow::DataFlowSig { +module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { import Config } @@ -69,6 +69,6 @@ module GlobalWithState implements DataFlow::Dat } /** DEPRECATED: Use `GlobalWithState` instead. */ -deprecated module MakeWithState implements DataFlow::DataFlowSig { +deprecated module MakeWithState implements DataFlow::GlobalFlowSig { import GlobalWithState } From 3eed4b418695c9442ffc14a5e0d8ee799e54c443 Mon Sep 17 00:00:00 2001 From: Tony Torralba Date: Thu, 23 Mar 2023 17:05:53 +0100 Subject: [PATCH 111/143] Move JndiInjectionSanitizer to importable file Add change note --- java/ql/lib/change-notes/2023-03-23-jndi-sanitizer.md | 4 ++++ .../ql/lib/semmle/code/java/security/JndiInjection.qll | 3 +++ .../semmle/code/java/security/JndiInjectionQuery.qll | 10 ++-------- 3 files changed, 9 insertions(+), 8 deletions(-) create mode 100644 java/ql/lib/change-notes/2023-03-23-jndi-sanitizer.md diff --git a/java/ql/lib/change-notes/2023-03-23-jndi-sanitizer.md b/java/ql/lib/change-notes/2023-03-23-jndi-sanitizer.md new file mode 100644 index 00000000000..20738f07c05 --- /dev/null +++ b/java/ql/lib/change-notes/2023-03-23-jndi-sanitizer.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added the extensible abstract class `JndiInjectionSanitizer`. Now this class can be extended to add more sanitizers to the `java/jndi-injection` query. diff --git a/java/ql/lib/semmle/code/java/security/JndiInjection.qll b/java/ql/lib/semmle/code/java/security/JndiInjection.qll index cacf725cc99..6a05bbfdc2c 100644 --- a/java/ql/lib/semmle/code/java/security/JndiInjection.qll +++ b/java/ql/lib/semmle/code/java/security/JndiInjection.qll @@ -9,6 +9,9 @@ private import semmle.code.java.frameworks.SpringLdap /** A data flow sink for unvalidated user input that is used in JNDI lookup. */ abstract class JndiInjectionSink extends DataFlow::Node { } +/** A sanitizer for JNDI injection vulnerabilities. */ +abstract class JndiInjectionSanitizer extends DataFlow::Node { } + /** * A unit class for adding additional taint steps. * diff --git a/java/ql/lib/semmle/code/java/security/JndiInjectionQuery.qll b/java/ql/lib/semmle/code/java/security/JndiInjectionQuery.qll index 1c8ef38c7ea..970b8a65cef 100644 --- a/java/ql/lib/semmle/code/java/security/JndiInjectionQuery.qll +++ b/java/ql/lib/semmle/code/java/security/JndiInjectionQuery.qll @@ -17,8 +17,8 @@ class JndiInjectionFlowConfig extends TaintTracking::Configuration { override predicate isSink(DataFlow::Node sink) { sink instanceof JndiInjectionSink } override predicate isSanitizer(DataFlow::Node node) { - node.getType() instanceof PrimitiveType or node.getType() instanceof BoxedType - or + node.getType() instanceof PrimitiveType or + node.getType() instanceof BoxedType or node instanceof JndiInjectionSanitizer } @@ -27,12 +27,6 @@ class JndiInjectionFlowConfig extends TaintTracking::Configuration { } } -/** - * A Class to be extended for Sanitizer Customizations - */ - -abstract class JndiInjectionSanitizer extends DataFlow::Node { } - /** * A method that does a JNDI lookup when it receives a `SearchControls` argument with `setReturningObjFlag` = `true` */ From a6b775f769003b945d13e255626fba8a225baa32 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Tue, 17 Jan 2023 10:34:23 -0500 Subject: [PATCH 112/143] Java: update TopJdkApis test case for top-300 --- java/ql/test/ext/TopJdkApis/TopJdkApis.qll | 55 ++++++++++++++++++- .../test/ext/TopJdkApis/TopJdkApisTest.java | 8 +++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/java/ql/test/ext/TopJdkApis/TopJdkApis.qll b/java/ql/test/ext/TopJdkApis/TopJdkApis.qll index 9bd5e1f9623..aa13db92d8e 100644 --- a/java/ql/test/ext/TopJdkApis/TopJdkApis.qll +++ b/java/ql/test/ext/TopJdkApis/TopJdkApis.qll @@ -111,7 +111,60 @@ predicate topJdkApiName(string apiName) { "java.util.Collection#iterator()", "java.util.Map#computeIfAbsent(Object,Function)", "java.text.SimpleDateFormat#SimpleDateFormat(String)", "java.util.StringJoiner#add(CharSequence)", "java.lang.Long#longValue()", - "java.util.stream.Collectors#joining(CharSequence)" + "java.util.stream.Collectors#joining(CharSequence)", + // top 300 JDK APIs + "java.lang.Math#max(int,int)", "java.util.Map#of(Object,Object)", + "java.lang.Long#valueOf(long)", "java.util.Random#nextInt(int)", + "java.lang.Long#valueOf(String)", "java.util.concurrent.CountDownLatch#await(long,TimeUnit)", + "java.util.Properties#getProperty(String)", "java.util.Optional#isEmpty()", + "java.util.concurrent.CompletableFuture#get()", "java.util.Objects#isNull(Object)", + "java.lang.StringBuilder#append(long)", "java.awt.Container#add(Component,Object)", + "java.math.BigDecimal#add(BigDecimal)", "java.sql.PreparedStatement#executeQuery()", + "java.lang.StringBuilder#StringBuilder(int)", "java.util.Map#forEach(BiConsumer)", + "java.math.BigDecimal#BigDecimal(int)", "java.util.Collections#unmodifiableList(List)", + "java.util.Properties#put(Object,Object)", "java.sql.Timestamp#Timestamp(long)", + "java.util.List#equals(Object)", "java.lang.String#indexOf(int)", + "java.lang.Long#toString(long)", "java.lang.Integer#Integer(int)", + "java.util.concurrent.atomic.AtomicBoolean#get()", + "java.lang.System#setProperty(String,String)", "java.util.concurrent.Future#get()", + "java.lang.Thread#start()", "java.util.Set#of(Object)", "java.util.Calendar#set(int,int)", + "java.time.Duration#ofSeconds(long)", "java.lang.System#arraycopy(Object,int,Object,int,int)", + "java.net.URI#toString()", "java.util.concurrent.atomic.AtomicInteger#incrementAndGet()", + "java.util.Set#remove(Object)", "java.lang.Boolean#parseBoolean(String)", + "java.util.Calendar#getTime()", "java.nio.charset.Charset#name()", + "java.lang.ThreadLocal#get()", "java.lang.Class#getCanonicalName()", + "java.util.List#remove(Object)", "java.lang.Throwable#toString()", + "java.util.stream.Stream#toList()", "java.io.ByteArrayOutputStream#toByteArray()", + "java.util.concurrent.atomic.AtomicLong#get()", + "java.lang.NullPointerException#NullPointerException(String)", "java.util.List#of()", + "java.util.Calendar#getInstance()", "java.util.Calendar#get(int)", + "java.util.Optional#orElseThrow()", "java.lang.System#lineSeparator()", + "java.lang.Boolean#booleanValue()", "java.util.logging.Logger#isLoggable(Level)", + "java.lang.Enum#hashCode()", "java.util.List#hashCode()", + "java.lang.reflect.Method#invoke(Object,Object[])", "java.lang.String#String(byte[],Charset)", + "java.util.Comparator#comparing(Function)", "java.util.Arrays#toString(Object[])", + "java.time.LocalDate#now()", "java.util.function.Function#identity()", + "java.io.OutputStream#write(byte[])", "java.lang.Integer#equals(Object)", + "java.io.BufferedReader#BufferedReader(Reader)", "java.io.DataInput#readInt()", + "java.io.BufferedReader#readLine()", "java.util.Map#entry(Object,Object)", + "java.lang.Runnable#run()", "java.util.ResourceBundle#getString(String)", + "java.util.Iterator#remove()", "java.lang.String#join(CharSequence,Iterable)", + "java.util.concurrent.atomic.AtomicBoolean#set(boolean)", "java.time.LocalDateTime#now()", + "java.sql.ResultSet#getLong(String)", "java.text.DateFormat#parse(String)", + "java.lang.String#toString()", "java.lang.Integer#valueOf(String)", + "java.util.regex.Matcher#find()", "java.io.DataOutput#writeInt(int)", + "java.util.HashMap#HashMap(int)", "java.util.stream.Stream#sorted(Comparator)", + "java.lang.String#toCharArray()", + "java.util.concurrent.atomic.AtomicInteger#AtomicInteger(int)", + "java.lang.String#String(byte[])", "java.lang.reflect.Method#getName()", + "java.sql.ResultSet#getString(int)", "java.net.URI#create(String)", + "java.lang.Enum#ordinal()", "java.util.concurrent.atomic.AtomicReference#set(Object)", + "java.util.concurrent.CompletableFuture#join()", + "java.io.FileInputStream#FileInputStream(File)", "java.io.File#delete()", + "java.util.concurrent.TimeUnit#toMillis(long)", "java.util.List#of(Object,Object,Object)", + "java.lang.String#compareTo(String)", "java.util.stream.IntStream#range(int,int)", + "java.math.BigInteger#valueOf(long)", "java.util.List#remove(int)", + "java.util.HashMap#HashMap(Map)", "java.util.function.BiConsumer#accept(Object,Object)" ] } diff --git a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.java b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.java index 49a7396ad64..6ef7d70d118 100644 --- a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.java +++ b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.java @@ -1,6 +1,10 @@ +import java.awt.Container; +import java.io.BufferedReader; import java.io.ByteArrayInputStream; +import java.io.FileInputStream; import java.lang.IllegalStateException; import java.lang.IndexOutOfBoundsException; +import java.lang.NullPointerException; import java.lang.Math; import java.lang.System; import java.math.BigDecimal; @@ -17,9 +21,13 @@ import java.util.Map; import java.util.Objects; import java.util.StringJoiner; import java.util.UUID; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; +import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; From 971b0e88141dfbe7d9feefe0f7c28457b36d482b Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Thu, 23 Mar 2023 17:50:08 -0400 Subject: [PATCH 113/143] Java: -1 to this conflict --- java/ql/lib/ext/java.awt.model.yml | 6 +++ java/ql/lib/ext/java.io.model.yml | 4 ++ java/ql/lib/ext/java.lang.model.yml | 40 ++++++++++++++----- java/ql/lib/ext/java.lang.reflect.model.yml | 12 ++++++ java/ql/lib/ext/java.math.model.yml | 3 ++ java/ql/lib/ext/java.nio.charset.model.yml | 6 +++ java/ql/lib/ext/java.sql.model.yml | 4 ++ java/ql/lib/ext/java.text.model.yml | 6 +++ java/ql/lib/ext/java.time.model.yml | 8 ++++ .../ext/java.util.concurrent.atomic.model.yml | 6 +++ .../ql/lib/ext/java.util.concurrent.model.yml | 5 +++ java/ql/lib/ext/java.util.function.model.yml | 7 ++++ java/ql/lib/ext/java.util.logging.model.yml | 6 +++ java/ql/lib/ext/java.util.model.yml | 21 +++++++++- java/ql/lib/ext/java.util.regex.model.yml | 6 +++ java/ql/lib/ext/java.util.stream.model.yml | 1 + java/ql/test/ext/TopJdkApis/TopJdkApis.qll | 1 + .../ext/TopJdkApis/TopJdkApisTest.expected | 1 + 18 files changed, 131 insertions(+), 12 deletions(-) create mode 100644 java/ql/lib/ext/java.awt.model.yml create mode 100644 java/ql/lib/ext/java.lang.reflect.model.yml create mode 100644 java/ql/lib/ext/java.nio.charset.model.yml diff --git a/java/ql/lib/ext/java.awt.model.yml b/java/ql/lib/ext/java.awt.model.yml new file mode 100644 index 00000000000..a8dd6f1ca1a --- /dev/null +++ b/java/ql/lib/ext/java.awt.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["java.awt", "Container", True, "add", "(Component,Object)", "", "Argument[0]", "Argument[-1].Element", "value", "manual"] diff --git a/java/ql/lib/ext/java.io.model.yml b/java/ql/lib/ext/java.io.model.yml index 4ba64033fa4..e94f2dd882d 100644 --- a/java/ql/lib/ext/java.io.model.yml +++ b/java/ql/lib/ext/java.io.model.yml @@ -59,9 +59,11 @@ extensions: - ["java.io", "CharArrayReader", False, "CharArrayReader", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.io", "CharArrayWriter", True, "toCharArray", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "DataInput", True, "readFully", "", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["java.io", "DataInput", True, "readInt", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - ["java.io", "DataInput", True, "readLine", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "DataInput", True, "readUTF", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "DataInputStream", False, "DataInputStream", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["java.io", "DataOutput", True, "writeInt", "(int)", "", "Argument[0]", "Argument[-1]", "taint", "manual"] - ["java.io", "File", False, "File", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.io", "File", False, "File", "", "", "Argument[1]", "Argument[this]", "taint", "manual"] - ["java.io", "File", True, "getAbsoluteFile", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] @@ -72,6 +74,7 @@ extensions: - ["java.io", "File", True, "toPath", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "toString", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "toURI", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["java.io", "FileInputStream", False, "FileInputStream", "(File)", "", "Argument[0]", "Argument[-1]", "taint", "manual"] - ["java.io", "FilterOutputStream", True, "FilterOutputStream", "(OutputStream)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.io", "InputStream", True, "read", "(byte[])", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["java.io", "InputStream", True, "read", "(byte[],int,int)", "", "Argument[this]", "Argument[0]", "taint", "manual"] @@ -93,4 +96,5 @@ extensions: pack: codeql/java-all extensible: neutralModel data: + - ["java.io", "File", "delete", "()", "manual"] - ["java.io", "File", "exists", "()", "manual"] diff --git a/java/ql/lib/ext/java.lang.model.yml b/java/ql/lib/ext/java.lang.model.yml index 774cf751a13..a53337d2f87 100644 --- a/java/ql/lib/ext/java.lang.model.yml +++ b/java/ql/lib/ext/java.lang.model.yml @@ -58,6 +58,7 @@ extensions: - ["java.lang", "Iterable", True, "forEach", "(Consumer)", "", "Argument[this].Element", "Argument[0].Parameter[0]", "value", "manual"] - ["java.lang", "Iterable", True, "iterator", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - ["java.lang", "Iterable", True, "spliterator", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] + - ["java.lang", "NullPointerException", False, "NullPointerException", "(String)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "Object", True, "clone", "", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - ["java.lang", "Object", True, "clone", "", "", "Argument[this].MapKey", "ReturnValue.MapKey", "value", "manual"] - ["java.lang", "Object", True, "clone", "", "", "Argument[this].MapValue", "ReturnValue.MapValue", "value", "manual"] @@ -107,50 +108,69 @@ extensions: - ["java.lang", "StringBuffer", True, "StringBuffer", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "StringBuilder", True, "StringBuilder", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "System", False, "arraycopy", "", "", "Argument[0]", "Argument[2]", "taint", "manual"] + - ["java.lang", "ThreadLocal", True, "get", "()", "", "Argument[-1].SyntheticField[java.lang.ThreadLocal.value]", "ReturnValue", "value", "manual"] # ! not sure if this model is correct, and if should be neutral model instead - ["java.lang", "Throwable", False, "Throwable", "(Throwable)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "value", "manual"] - ["java.lang", "Throwable", True, "getCause", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "ReturnValue", "value", "manual"] - ["java.lang", "Throwable", True, "getMessage", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "value", "manual"] + - ["java.lang", "Throwable", True, "toString", "()", "", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "taint", "manual"] # ! little unsure about this one... - addsTo: pack: codeql/java-all extensible: neutralModel data: - ["java.lang", "AbstractStringBuilder", "length", "()", "manual"] - ["java.lang", "Boolean", "equals", "(Object)", "manual"] + - ["java.lang", "Class", "getCanonicalName", "()", "manual"] - ["java.lang", "Class", "getClassLoader", "()", "manual"] - ["java.lang", "Class", "getName", "()", "manual"] - ["java.lang", "Class", "getSimpleName", "()", "manual"] - ["java.lang", "Class", "isAssignableFrom", "(Class)", "manual"] - ["java.lang", "Enum", "Enum", "(String,int)", "manual"] - ["java.lang", "Enum", "equals", "(Object)", "manual"] + - ["java.lang", "Enum", "hashCode", "()", "manual"] - ["java.lang", "Enum", "name", "()", "manual"] + - ["java.lang", "Enum", "ordinal", "()", "manual"] - ["java.lang", "Enum", "toString", "()", "manual"] + - ["java.lang", "Integer", "equals", "(Object)", "manual"] - ["java.lang", "Long", "equals", "(Object)", "manual"] - ["java.lang", "Object", "equals", "(Object)", "manual"] - ["java.lang", "Object", "getClass", "()", "manual"] - ["java.lang", "Object", "hashCode", "()", "manual"] - ["java.lang", "Object", "toString", "()", "manual"] + - ["java.lang", "Runnable", "run", "()", "manual"] + - ["java.lang", "String", "compareTo", "(String)", "manual"] - ["java.lang", "String", "contains", "(CharSequence)", "manual"] - ["java.lang", "String", "endsWith", "(String)", "manual"] - ["java.lang", "String", "equals", "(Object)", "manual"] - ["java.lang", "String", "equalsIgnoreCase", "(String)", "manual"] - ["java.lang", "String", "hashCode", "()", "manual"] + - ["java.lang", "String", "indexOf", "(int)", "manual"] - ["java.lang", "String", "indexOf", "(String)", "manual"] - ["java.lang", "String", "isEmpty", "()", "manual"] - ["java.lang", "String", "length", "()", "manual"] - ["java.lang", "String", "startsWith", "(String)", "manual"] - ["java.lang", "System", "currentTimeMillis", "()", "manual"] + - ["java.lang", "System", "lineSeparator", "()", "manual"] # ! double-check... - ["java.lang", "System", "nanoTime", "()", "manual"] - ["java.lang", "Thread", "currentThread", "()", "manual"] - ["java.lang", "Thread", "sleep", "(long)", "manual"] + - ["java.lang", "Thread", "start", "()", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - - ["java.lang", "Integer", "intValue", "()", "manual"] # taint-numeric - - ["java.lang", "Integer", "parseInt", "(String)", "manual"] # taint-numeric - - ["java.lang", "Integer", "toString", "(int)", "manual"] # taint-numeric - - ["java.lang", "Integer", "valueOf", "(int)", "manual"] # taint-numeric - - ["java.lang", "Long", "longValue", "()", "manual"] # taint-numeric - - ["java.lang", "Long", "parseLong", "(String)", "manual"] # taint-numeric - - ["java.lang", "Long", "toString", "()", "manual"] # taint-numeric - - ["java.lang", "Math", "min", "(int,int)", "manual"] # value-numeric - - ["java.lang", "String", "valueOf", "(int)", "manual"] # taint-numeric - - ["java.lang", "String", "valueOf", "(long)", "manual"] # taint-numeric + - ["java.lang", "Boolean", "booleanValue", "()", "manual"] # taint-numeric + - ["java.lang", "Boolean", "parseBoolean", "(String)", "manual"] # taint-numeric + - ["java.lang", "Integer", "Integer", "(int)", "manual"] # taint-numeric + - ["java.lang", "Integer", "intValue", "()", "manual"] # taint-numeric + - ["java.lang", "Integer", "parseInt", "(String)", "manual"] # taint-numeric + - ["java.lang", "Integer", "toString", "(int)", "manual"] # taint-numeric + - ["java.lang", "Integer", "valueOf", "(int)", "manual"] # taint-numeric + - ["java.lang", "Integer", "valueOf", "(String)", "manual"] # taint-numeric # ! should probably make this and others like it have a "" signature instead... + - ["java.lang", "Long", "longValue", "()", "manual"] # taint-numeric + - ["java.lang", "Long", "parseLong", "(String)", "manual"] # taint-numeric + - ["java.lang", "Long", "toString", "()", "manual"] # taint-numeric + - ["java.lang", "Long", "toString", "(long)", "manual"] # taint-numeric + - ["java.lang", "Long", "valueOf", "(long)", "manual"] # taint-numeric + - ["java.lang", "Long", "valueOf", "(String)", "manual"] # taint-numeric + - ["java.lang", "Math", "max", "(int,int)", "manual"] # value-numeric + - ["java.lang", "Math", "min", "(int,int)", "manual"] # value-numeric + - ["java.lang", "String", "valueOf", "(int)", "manual"] # taint-numeric + - ["java.lang", "String", "valueOf", "(long)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.lang.reflect.model.yml b/java/ql/lib/ext/java.lang.reflect.model.yml new file mode 100644 index 00000000000..6de65bc46b9 --- /dev/null +++ b/java/ql/lib/ext/java.lang.reflect.model.yml @@ -0,0 +1,12 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["java.lang.reflect", "Method", False, "invoke", "(Object,Object[])", "", "Argument[1].ArrayElement", "Argument[-1].Parameter[0]", "value", "manual"] # ! very unsure if this model is correct... + + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.lang.reflect", "Method", "getName", "()", "manual"] # ! seems uninteresting flow to me, but maybe double-check diff --git a/java/ql/lib/ext/java.math.model.yml b/java/ql/lib/ext/java.math.model.yml index 1d45a4076bf..944b23e0535 100644 --- a/java/ql/lib/ext/java.math.model.yml +++ b/java/ql/lib/ext/java.math.model.yml @@ -7,6 +7,9 @@ extensions: # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. + - ["java.math", "BigDecimal", "BigDecimal", "(int)", "manual"] # taint-numeric - ["java.math", "BigDecimal", "BigDecimal", "(String)", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "add", "(BigDecimal)", "manual"] # taint-numeric - ["java.math", "BigDecimal", "valueOf", "(double)", "manual"] # taint-numeric - ["java.math", "BigDecimal", "valueOf", "(long)", "manual"] # taint-numeric + - ["java.math", "BigInteger", "valueOf", "(long)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.nio.charset.model.yml b/java/ql/lib/ext/java.nio.charset.model.yml new file mode 100644 index 00000000000..e961a06256e --- /dev/null +++ b/java/ql/lib/ext/java.nio.charset.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["java.nio.charset", "Charset", False, "name", "()", "", "Argument[-1].SyntheticField[java.nio.charset.Charset.canonicalName]", "ReturnValue", "value", "manual"] diff --git a/java/ql/lib/ext/java.sql.model.yml b/java/ql/lib/ext/java.sql.model.yml index def9f5d1863..14b3c7c3685 100644 --- a/java/ql/lib/ext/java.sql.model.yml +++ b/java/ql/lib/ext/java.sql.model.yml @@ -21,6 +21,7 @@ extensions: extensible: summaryModel data: - ["java.sql", "Connection", True, "nativeSQL", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["java.sql", "PreparedStatement", True, "executeQuery", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] # ! this should maybe be a neutral model, not sure if this really counts as "flow through"... - ["java.sql", "PreparedStatement", True, "setString", "(int,String)", "", "Argument[1]", "Argument[this]", "value", "manual"] - ["java.sql", "ResultSet", True, "getString", "(String)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - addsTo: @@ -32,3 +33,6 @@ extensions: # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - ["java.sql", "PreparedStatement", "setInt", "(int,int)", "manual"] # value-numeric - ["java.sql", "ResultSet", "getInt", "(String)", "manual"] # taint-numeric + - ["java.sql", "ResultSet", "getLong", "(String)", "manual"] # taint-numeric + - ["java.sql", "ResultSet", "getString", "(int)", "manual"] # taint-numeric + - ["java.sql", "Timestamp", "Timestamp", "(long)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.text.model.yml b/java/ql/lib/ext/java.text.model.yml index bbb01596f17..4a087ec34b2 100644 --- a/java/ql/lib/ext/java.text.model.yml +++ b/java/ql/lib/ext/java.text.model.yml @@ -1,4 +1,10 @@ extensions: + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["java.text", "DateFormat", True, "parse", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! maybe not interesting flow and should be neutral model? + - addsTo: pack: codeql/java-all extensible: neutralModel diff --git a/java/ql/lib/ext/java.time.model.yml b/java/ql/lib/ext/java.time.model.yml index 002240c6488..ae5b8bc0e63 100644 --- a/java/ql/lib/ext/java.time.model.yml +++ b/java/ql/lib/ext/java.time.model.yml @@ -1,9 +1,17 @@ extensions: + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["java.time", "Duration", False, "ofSeconds", "(long)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! maybe not interesting flow and should be neutral model? + - addsTo: pack: codeql/java-all extensible: neutralModel data: - ["java.time", "Instant", "now", "()", "manual"] + - ["java.time", "LocalDate", "now", "()", "manual"] + - ["java.time", "LocalDateTime", "now", "()", "manual"] - ["java.time", "ZonedDateTime", "now", "()", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. diff --git a/java/ql/lib/ext/java.util.concurrent.atomic.model.yml b/java/ql/lib/ext/java.util.concurrent.atomic.model.yml index b4b49273790..1e563a76d0f 100644 --- a/java/ql/lib/ext/java.util.concurrent.atomic.model.yml +++ b/java/ql/lib/ext/java.util.concurrent.atomic.model.yml @@ -5,12 +5,18 @@ extensions: data: - ["java.util.concurrent.atomic", "AtomicReference", False, "AtomicReference", "(Object)", "", "Argument[0]", "Argument[this].SyntheticField[java.util.concurrent.atomic.AtomicReference.value]", "value", "manual"] - ["java.util.concurrent.atomic", "AtomicReference", False, "get", "()", "", "Argument[this].SyntheticField[java.util.concurrent.atomic.AtomicReference.value]", "ReturnValue", "value", "manual"] + - ["java.util.concurrent.atomic", "AtomicReference", False, "set", "(Object)", "", "Argument[0]", "Argument[-1].SyntheticField[java.util.concurrent.atomic.AtomicReference.value]", "value", "manual"] - addsTo: pack: codeql/java-all extensible: neutralModel data: + - ["java.util.concurrent.atomic", "AtomicBoolean", "get", "()", "manual"] + - ["java.util.concurrent.atomic", "AtomicBoolean", "set", "(boolean)", "manual"] + # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - ["java.util.concurrent.atomic", "AtomicInteger", "AtomicInteger", "(int)", "manual"] # value-numeric - ["java.util.concurrent.atomic", "AtomicInteger", "get", "()", "manual"] # value-numeric + - ["java.util.concurrent.atomic", "AtomicInteger", "incrementAndGet", "()", "manual"] # taint-numeric + - ["java.util.concurrent.atomic", "AtomicLong", "get", "()", "manual"] # value-numeric diff --git a/java/ql/lib/ext/java.util.concurrent.model.yml b/java/ql/lib/ext/java.util.concurrent.model.yml index dd0c6b75754..1f8d4d01350 100644 --- a/java/ql/lib/ext/java.util.concurrent.model.yml +++ b/java/ql/lib/ext/java.util.concurrent.model.yml @@ -17,7 +17,10 @@ extensions: - ["java.util.concurrent", "BlockingQueue", True, "poll", "(long,TimeUnit)", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - ["java.util.concurrent", "BlockingQueue", True, "put", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util.concurrent", "BlockingQueue", True, "take", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"] + - ["java.util.concurrent", "CompletableFuture", False, "get", "()", "", "Argument[-1].SyntheticField[java.util.concurrent.CompletableFuture.value]", "ReturnValue", "value", "manual"] # ! not sure if using SyntheticField is correct here; also, should prbly remove this for `Future.get` below's subtyping to handle. + - ["java.util.concurrent", "CompletableFuture", False, "join", "()", "", "Argument[-1].SyntheticField[java.util.concurrent.CompletableFuture.value]", "ReturnValue", "value", "manual"] # ! not sure if using SyntheticField is correct here - ["java.util.concurrent", "ConcurrentHashMap", True, "elements", "()", "", "Argument[this].MapValue", "ReturnValue.Element", "value", "manual"] + - ["java.util.concurrent", "Future", True, "get", "()", "", "Argument[-1].SyntheticField[java.util.concurrent.Future.value]", "ReturnValue", "value", "manual"] # ! not sure if using SyntheticField is correct here - ["java.util.concurrent", "TransferQueue", True, "transfer", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util.concurrent", "TransferQueue", True, "tryTransfer", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util.concurrent", "TransferQueue", True, "tryTransfer", "(Object,long,TimeUnit)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] @@ -26,9 +29,11 @@ extensions: pack: codeql/java-all extensible: neutralModel data: + - ["java.util.concurrent", "CountDownLatch", "await", "(long,TimeUnit)", "manual"] - ["java.util.concurrent", "CountDownLatch", "countDown", "()", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - ["java.util.concurrent", "CountDownLatch", "CountDownLatch", "(int)", "manual"] # value-numeric - ["java.util.concurrent", "CountDownLatch", "getCount", "()", "manual"] # value-numeric + - ["java.util.concurrent", "TimeUnit", "toMillis", "(long)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.util.function.model.yml b/java/ql/lib/ext/java.util.function.model.yml index 90ed9c1b9ab..d81882b70c0 100644 --- a/java/ql/lib/ext/java.util.function.model.yml +++ b/java/ql/lib/ext/java.util.function.model.yml @@ -4,3 +4,10 @@ extensions: extensible: sinkModel data: - ["java.util.function", "Predicate", False, "test", "(Object)", "", "Argument[this]", "regex-use[0]", "manual"] + + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.util.function", "BiConsumer", "accept", "(Object,Object)", "manual"] # ! remove this model? + - ["java.util.function", "Function", "identity", "()", "manual"] # ! remove this model? diff --git a/java/ql/lib/ext/java.util.logging.model.yml b/java/ql/lib/ext/java.util.logging.model.yml index 41a59ceee3a..2d5421e2f47 100644 --- a/java/ql/lib/ext/java.util.logging.model.yml +++ b/java/ql/lib/ext/java.util.logging.model.yml @@ -42,3 +42,9 @@ extensions: extensible: summaryModel data: - ["java.util.logging", "LogRecord", False, "LogRecord", "", "", "Argument[1]", "Argument[this]", "taint", "manual"] + + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.util.logging", "Logger", "isLoggable", "(Level)", "manual"] diff --git a/java/ql/lib/ext/java.util.model.yml b/java/ql/lib/ext/java.util.model.yml index 5f3dad67c37..dec98781db4 100644 --- a/java/ql/lib/ext/java.util.model.yml +++ b/java/ql/lib/ext/java.util.model.yml @@ -290,6 +290,7 @@ extensions: - ["java.util", "Queue", True, "peek", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - ["java.util", "Queue", True, "poll", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - ["java.util", "Queue", True, "remove", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"] + - ["java.util", "ResourceBundle", True, "getString", "(String)", "", "Argument[-1].MapValue", "ReturnValue", "value", "manual"] - ["java.util", "Scanner", True, "Scanner", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.util", "Scanner", True, "findInLine", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.util", "Scanner", True, "findWithinHorizon", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] @@ -364,25 +365,38 @@ extensions: data: - ["java.util", "ArrayList", "ArrayList", "(int)", "manual"] - ["java.util", "ArrayList", "size", "()", "manual"] + - ["java.util", "Arrays", "toString", "(Object[])", "manual"] # ! should this have a summary model after all? (or unwanted model due to too much FP flow?) + - ["java.util", "Calendar", "getInstance", "()", "manual"] - ["java.util", "Collection", "isEmpty", "()", "manual"] - ["java.util", "Collection", "size", "()", "manual"] - ["java.util", "Collections", "emptyList", "()", "manual"] - ["java.util", "Collections", "emptyMap", "()", "manual"] - ["java.util", "Collections", "emptySet", "()", "manual"] + - ["java.util", "Comparator", "comparing", "(Function)", "manual"] # ! seems complex (functional interface), should maybe not have any model? + - ["java.util", "HashMap", "HashMap", "(int)", "manual"] - ["java.util", "Iterator", "hasNext", "()", "manual"] + - ["java.util", "Iterator", "remove", "()", "manual"] # ! WithoutElement comment? (double-check if it returns anything, etc.) - ["java.util", "List", "contains", "(Object)", "manual"] + - ["java.util", "List", "equals", "(Object)", "manual"] + - ["java.util", "List", "hashCode", "()", "manual"] - ["java.util", "List", "isEmpty", "()", "manual"] + - ["java.util", "List", "of", "()", "manual"] + - ["java.util", "List", "remove", "(Object)", "manual"] # ! WithoutElement comment? (actually, see above, is this already modeled for a different signature?) - ["java.util", "List", "size", "()", "manual"] - ["java.util", "Map", "containsKey", "(Object)", "manual"] - ["java.util", "Map", "isEmpty", "()", "manual"] - ["java.util", "Map", "size", "()", "manual"] - ["java.util", "Objects", "equals", "(Object,Object)", "manual"] - ["java.util", "Objects", "hash", "(Object[])", "manual"] + - ["java.util", "Objects", "isNull", "(Object)", "manual"] - ["java.util", "Objects", "nonNull", "(Object)", "manual"] - ["java.util", "Optional", "empty", "()", "manual"] + - ["java.util", "Optional", "isEmpty", "()", "manual"] - ["java.util", "Optional", "isPresent", "()", "manual"] + - ["java.util", "Random", "nextInt", "(int)", "manual"] - ["java.util", "Set", "contains", "(Object)", "manual"] - ["java.util", "Set", "isEmpty", "()", "manual"] + - ["java.util", "Set", "remove", "(Object)", "manual"] # ! WithoutElement comment? (double-check if it returns anything, etc.) - ["java.util", "Set", "size", "()", "manual"] - ["java.util", "UUID", "randomUUID", "()", "manual"] - ["java.util", "UUID", "toString", "()", "manual"] @@ -394,5 +408,8 @@ extensions: # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - - ["java.util", "Date", "Date", "(long)", "manual"] # taint-numeric - - ["java.util", "Date", "getTime", "()", "manual"] # taint-numeric + - ["java.util", "Calendar", "get", "(int)", "manual"] # value-numeric + - ["java.util", "Calendar", "getTime", "()", "manual"] # taint-numeric + - ["java.util", "Calendar", "set", "(int,int)", "manual"] # value-numeric + - ["java.util", "Date", "Date", "(long)", "manual"] # taint-numeric + - ["java.util", "Date", "getTime", "()", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.util.regex.model.yml b/java/ql/lib/ext/java.util.regex.model.yml index d002fd93419..ac8667de757 100644 --- a/java/ql/lib/ext/java.util.regex.model.yml +++ b/java/ql/lib/ext/java.util.regex.model.yml @@ -24,3 +24,9 @@ extensions: - ["java.util.regex", "Pattern", False, "matcher", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.util.regex", "Pattern", False, "quote", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.util.regex", "Pattern", False, "split", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.util.regex", "Matcher", "find", "()", "manual"] diff --git a/java/ql/lib/ext/java.util.stream.model.yml b/java/ql/lib/ext/java.util.stream.model.yml index 1fafd506185..f4e158d9a20 100644 --- a/java/ql/lib/ext/java.util.stream.model.yml +++ b/java/ql/lib/ext/java.util.stream.model.yml @@ -9,6 +9,7 @@ extensions: - ["java.util.stream", "BaseStream", True, "sequential", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - ["java.util.stream", "BaseStream", True, "spliterator", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - ["java.util.stream", "BaseStream", True, "unordered", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] + - ["java.util.stream", "IntStream", False, "range", "(int,int)", "", "Argument[0..1]", "ReturnValue.Element", "value", "manual"] # ! this one is a bit odd, is it correct to have it as a summary model? - ["java.util.stream", "Stream", True, "allMatch", "(Predicate)", "", "Argument[this].Element", "Argument[0].Parameter[0]", "value", "manual"] - ["java.util.stream", "Stream", True, "anyMatch", "(Predicate)", "", "Argument[this].Element", "Argument[0].Parameter[0]", "value", "manual"] - ["java.util.stream", "Stream", True, "collect", "(Supplier,BiConsumer,BiConsumer)", "", "Argument[this].Element", "Argument[1].Parameter[1]", "value", "manual"] diff --git a/java/ql/test/ext/TopJdkApis/TopJdkApis.qll b/java/ql/test/ext/TopJdkApis/TopJdkApis.qll index aa13db92d8e..1da376ff81a 100644 --- a/java/ql/test/ext/TopJdkApis/TopJdkApis.qll +++ b/java/ql/test/ext/TopJdkApis/TopJdkApis.qll @@ -198,6 +198,7 @@ class TopJdkApi extends SummarizedCallableBase { * Note: the following top JDK APIs are not modeled with MaD: * `java.lang.String#valueOf(Object)`: a complex case; an alias for `Object.toString`, except the dispatch is hidden * `java.lang.System#getProperty(String)`: needs to be modeled by regular CodeQL matching the get and set keys to reduce FPs + * `java.lang.System#setProperty(String,String)`: needs to be modeled by regular CodeQL matching the get and set keys to reduce FPs * `java.lang.Throwable#printStackTrace()`: should probably not be a general step, but there might be specialised queries that care * `java.util.function.Consumer#accept(Object)`: specialized lambda flow * `java.util.function.Function#apply(Object)`: specialized lambda flow diff --git a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected index 3ef93396b3b..abf8d09a27f 100644 --- a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected +++ b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected @@ -1,5 +1,6 @@ | java.lang.String#valueOf(Object) | no manual model | | java.lang.System#getProperty(String) | no manual model | +| java.lang.System#setProperty(String,String) | no manual model | | java.lang.Throwable#printStackTrace() | no manual model | | java.util.function.Consumer#accept(Object) | no manual model | | java.util.function.Function#apply(Object) | no manual model | From d6c071d2b744276d9cfee6aca459275429cbfd73 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Tue, 17 Jan 2023 12:33:17 -0500 Subject: [PATCH 114/143] Java: update TopJdkApis test case for top-400 --- java/ql/test/ext/TopJdkApis/TopJdkApis.qll | 57 ++++++++++++++++++- .../test/ext/TopJdkApis/TopJdkApisTest.java | 7 +++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/java/ql/test/ext/TopJdkApis/TopJdkApis.qll b/java/ql/test/ext/TopJdkApis/TopJdkApis.qll index 1da376ff81a..8bc5b77130b 100644 --- a/java/ql/test/ext/TopJdkApis/TopJdkApis.qll +++ b/java/ql/test/ext/TopJdkApis/TopJdkApis.qll @@ -164,7 +164,62 @@ predicate topJdkApiName(string apiName) { "java.util.concurrent.TimeUnit#toMillis(long)", "java.util.List#of(Object,Object,Object)", "java.lang.String#compareTo(String)", "java.util.stream.IntStream#range(int,int)", "java.math.BigInteger#valueOf(long)", "java.util.List#remove(int)", - "java.util.HashMap#HashMap(Map)", "java.util.function.BiConsumer#accept(Object,Object)" + "java.util.HashMap#HashMap(Map)", "java.util.function.BiConsumer#accept(Object,Object)", + // top 400 JDK APIs + "java.util.HashMap#containsKey(Object)", "java.util.Collection#contains(Object)", + "java.lang.Double#parseDouble(String)", "java.lang.Thread#interrupt()", + "java.awt.Container#add(Component)", "java.time.chrono.ChronoZonedDateTime#toInstant()", + "java.util.List#subList(int,int)", "java.util.concurrent.ConcurrentHashMap#get(Object)", + "java.lang.System#getenv(String)", "java.time.Duration#ofMillis(long)", + "java.lang.Integer#toString()", "java.lang.reflect.Constructor#newInstance(Object[])", + "java.util.Hashtable#get(Object)", "java.lang.Class#toString()", + "java.util.Vector#add(Object)", "java.io.StringReader#StringReader(String)", + "java.io.File#getPath()", "java.lang.System#identityHashCode(Object)", + "java.util.stream.Stream#count()", "java.util.concurrent.CompletableFuture#complete(Object)", + "java.nio.file.Files#exists(Path,LinkOption[])", "java.util.List#set(int,Object)", + "java.util.concurrent.atomic.AtomicLong#AtomicLong(long)", + "java.util.Optional#orElseGet(Supplier)", "java.lang.Class#forName(String)", + "java.lang.String#replace(char,char)", "java.util.Enumeration#nextElement()", + "java.lang.Class#getMethod(String,Class[])", "java.nio.file.Path#toAbsolutePath()", + "java.util.Enumeration#hasMoreElements()", "java.lang.Class#cast(Object)", + "java.util.concurrent.atomic.AtomicBoolean#AtomicBoolean(boolean)", + "java.math.BigDecimal#doubleValue()", "java.util.UUID#fromString(String)", + "java.lang.System#exit(int)", "java.util.List#add(int,Object)", + "java.lang.Boolean#valueOf(boolean)", "java.sql.Timestamp#getTime()", + "java.nio.Buffer#remaining()", "java.net.URL#URL(String)", "java.net.URI#URI(String)", + "java.util.Objects#hashCode(Object)", "java.util.Set#clear()", "java.io.File#isDirectory()", + "java.time.Duration#toMillis()", "java.nio.ByteBuffer#allocate(int)", + "java.math.BigDecimal#toString()", "java.lang.Class#getResourceAsStream(String)", + "java.util.logging.Logger#getLogger(String)", "java.lang.String#toLowerCase(Locale)", + "java.util.concurrent.CompletableFuture#completeExceptionally(Throwable)", + "java.util.stream.Stream#findAny()", + "java.util.concurrent.CompletableFuture#completedFuture(Object)", + "java.util.stream.Stream#of(Object)", "java.util.Map#of(Object,Object,Object,Object)", + "java.util.Collections#sort(List,Comparator)", "java.lang.Thread#Thread(Runnable)", + "java.lang.String#lastIndexOf(int)", + "java.io.UncheckedIOException#UncheckedIOException(IOException)", + "java.util.LinkedHashSet#LinkedHashSet(Collection)", + "java.sql.PreparedStatement#executeUpdate()", "java.time.ZoneId#of(String)", + "java.util.concurrent.atomic.AtomicLong#addAndGet(long)", "java.nio.ByteBuffer#wrap(byte[])", + "java.util.List#indexOf(Object)", "java.util.Collections#unmodifiableMap(Map)", + "java.lang.Long#Long(long)", "java.util.StringTokenizer#nextToken()", + "java.lang.String#join(CharSequence,CharSequence[])", "java.io.StringWriter#toString()", + "java.lang.Integer#toHexString(int)", "java.lang.Long#intValue()", + "java.text.MessageFormat#format(String,Object[])", + "java.lang.Exception#Exception(String,Throwable)", + "java.util.stream.Stream#toArray(IntFunction)", "java.util.List#sort(Comparator)", + "java.util.LinkedHashMap#get(Object)", "java.sql.PreparedStatement#setLong(int,long)", + "java.lang.Iterable#iterator()", "java.math.BigInteger#or(BigInteger)", + "java.time.LocalDateTime#of(int,int,int,int,int,int)", "java.time.Instant#toEpochMilli()", + "java.math.BigDecimal#setScale(int,RoundingMode)", "java.lang.Class#isInstance(Object)", + "java.util.regex.Pattern#compile(String)", "java.util.Calendar#getTimeInMillis()", + "java.lang.Class#getResource(String)", "java.util.concurrent.Executor#execute(Runnable)", + "java.util.concurrent.locks.Lock#unlock()", "java.lang.AssertionError#AssertionError(Object)", + "java.util.ArrayList#addAll(Collection)", "java.io.File#mkdirs()", + "java.time.Duration#ofMinutes(long)", "java.time.format.DateTimeFormatter#ofPattern(String)", + "java.lang.Throwable#getLocalizedMessage()", "java.lang.StringBuilder#delete(int,int)", + "java.util.Vector#size()", "java.lang.String#String(String)", "java.util.ArrayList#isEmpty()", + "java.util.Collection#removeIf(Predicate)" ] } diff --git a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.java b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.java index 6ef7d70d118..0bd7bab64c6 100644 --- a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.java +++ b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.java @@ -2,15 +2,21 @@ import java.awt.Container; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.FileInputStream; +import java.io.StringReader; +import java.io.StringWriter; +import java.io.UncheckedIOException; +import java.lang.AssertionError; import java.lang.IllegalStateException; import java.lang.IndexOutOfBoundsException; import java.lang.NullPointerException; import java.lang.Math; import java.lang.System; import java.math.BigDecimal; +import java.nio.file.Files; import java.nio.file.Paths; import java.sql.ResultSet; import java.text.DateFormat; +import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -20,6 +26,7 @@ import java.util.HashSet; import java.util.Map; import java.util.Objects; import java.util.StringJoiner; +import java.util.StringTokenizer; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; From 44c3a41194e61f4b62ef33790414148a84f37b95 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Thu, 23 Mar 2023 17:53:27 -0400 Subject: [PATCH 115/143] Java: resolve more -1 to this conflicts --- java/ql/lib/ext/java.awt.model.yml | 1 + java/ql/lib/ext/java.io.model.yml | 5 ++++ java/ql/lib/ext/java.lang.model.yml | 26 +++++++++++++++++++ java/ql/lib/ext/java.lang.reflect.model.yml | 1 + java/ql/lib/ext/java.math.model.yml | 16 +++++++----- java/ql/lib/ext/java.nio.file.model.yml | 6 +++++ java/ql/lib/ext/java.nio.model.yml | 7 +++++ java/ql/lib/ext/java.sql.model.yml | 13 ++++++---- java/ql/lib/ext/java.text.model.yml | 2 ++ java/ql/lib/ext/java.time.chrono.model.yml | 6 +++++ java/ql/lib/ext/java.time.format.model.yml | 6 +++++ java/ql/lib/ext/java.time.model.yml | 8 +++++- .../ext/java.util.concurrent.atomic.model.yml | 3 +++ .../ext/java.util.concurrent.locks.model.yml | 6 +++++ .../ql/lib/ext/java.util.concurrent.model.yml | 4 +++ java/ql/lib/ext/java.util.logging.model.yml | 1 + java/ql/lib/ext/java.util.model.yml | 24 +++++++++++++---- java/ql/lib/ext/java.util.regex.model.yml | 1 + java/ql/lib/ext/java.util.stream.model.yml | 1 + 19 files changed, 120 insertions(+), 17 deletions(-) create mode 100644 java/ql/lib/ext/java.time.chrono.model.yml create mode 100644 java/ql/lib/ext/java.time.format.model.yml create mode 100644 java/ql/lib/ext/java.util.concurrent.locks.model.yml diff --git a/java/ql/lib/ext/java.awt.model.yml b/java/ql/lib/ext/java.awt.model.yml index a8dd6f1ca1a..97776d26e93 100644 --- a/java/ql/lib/ext/java.awt.model.yml +++ b/java/ql/lib/ext/java.awt.model.yml @@ -3,4 +3,5 @@ extensions: pack: codeql/java-all extensible: summaryModel data: + - ["java.awt", "Container", True, "add", "(Component)", "", "Argument[0]", "Argument[-1].Element", "value", "manual"] # ! signature as "" instead? - ["java.awt", "Container", True, "add", "(Component,Object)", "", "Argument[0]", "Argument[-1].Element", "value", "manual"] diff --git a/java/ql/lib/ext/java.io.model.yml b/java/ql/lib/ext/java.io.model.yml index e94f2dd882d..58ddfc1f523 100644 --- a/java/ql/lib/ext/java.io.model.yml +++ b/java/ql/lib/ext/java.io.model.yml @@ -71,6 +71,7 @@ extensions: - ["java.io", "File", True, "getCanonicalFile", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "getCanonicalPath", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "getName", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["java.io", "File", False, "getPath", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] # ! True versus False (maybe it's private/hidden?).. (and neutral instead?) - ["java.io", "File", True, "toPath", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "toString", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "toURI", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] @@ -91,6 +92,8 @@ extensions: - ["java.io", "OutputStream", True, "write", "(int)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.io", "Reader", True, "read", "", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["java.io", "StringReader", False, "StringReader", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["java.io", "StringWriter", False, "toString", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] # ! currently supported by taintPreservingQualifierToMethod? + - ["java.io", "UncheckedIOException", False, "UncheckedIOException", "(IOException)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.Throwable.cause]", "value", "manual"] - ["java.io", "Writer", True, "write", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - addsTo: pack: codeql/java-all @@ -98,3 +101,5 @@ extensions: data: - ["java.io", "File", "delete", "()", "manual"] - ["java.io", "File", "exists", "()", "manual"] + - ["java.io", "File", "isDirectory", "()", "manual"] + - ["java.io", "File", "mkdirs", "()", "manual"] diff --git a/java/ql/lib/ext/java.lang.model.yml b/java/ql/lib/ext/java.lang.model.yml index a53337d2f87..ff4edca5a5c 100644 --- a/java/ql/lib/ext/java.lang.model.yml +++ b/java/ql/lib/ext/java.lang.model.yml @@ -48,10 +48,14 @@ extensions: - ["java.lang", "AbstractStringBuilder", True, "toString", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.lang", "Appendable", True, "append", "", "", "Argument[this]", "ReturnValue", "value", "manual"] - ["java.lang", "Appendable", True, "append", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["java.lang", "AssertionError", False, "AssertionError", "(Object)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "CharSequence", True, "charAt", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.lang", "CharSequence", True, "subSequence", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.lang", "CharSequence", True, "toString", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["java.lang", "Class", False, "cast", "(Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.lang", "Exception", False, "Exception", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] + - ["java.lang", "Exception", False, "Exception", "(String,Throwable)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "value", "manual"] + - ["java.lang", "Exception", False, "Exception", "(String,Throwable)", "", "Argument[1]", "Argument[-1].SyntheticField[java.lang.Throwable.cause]", "value", "manual"] - ["java.lang", "IllegalArgumentException", False, "IllegalArgumentException", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "IllegalStateException", False, "IllegalStateException", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "IndexOutOfBoundsException", False, "IndexOutOfBoundsException", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] @@ -104,14 +108,20 @@ extensions: - ["java.lang", "String", False, "valueOf", "(char)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.lang", "String", False, "valueOf", "(char[])", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.lang", "String", False, "valueOf", "(char[],int,int)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + # ! why do below have subtype=True for constructors? - ["java.lang", "StringBuffer", True, "StringBuffer", "(CharSequence)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "StringBuffer", True, "StringBuffer", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "StringBuilder", True, "StringBuilder", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["java.lang", "StringBuilder", False, "delete", "(int,int)", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - ["java.lang", "System", False, "arraycopy", "", "", "Argument[0]", "Argument[2]", "taint", "manual"] + - ["java.lang", "System", False, "getenv", "(String)", "", "Argument[-1].MapValue", "ReturnValue", "value", "manual"] # ! neutral instead? + - ["java.lang", "System", False, "getenv", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! really unsure about this...; neutral instead? -- or unmodelled + - ["java.lang", "Thread", False, "Thread", "(Runnable)", "", "Argument[0]", "Argument[-1]", "taint", "manual"] # ! neutral instead? - ["java.lang", "ThreadLocal", True, "get", "()", "", "Argument[-1].SyntheticField[java.lang.ThreadLocal.value]", "ReturnValue", "value", "manual"] # ! not sure if this model is correct, and if should be neutral model instead - ["java.lang", "Throwable", False, "Throwable", "(Throwable)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "value", "manual"] - ["java.lang", "Throwable", True, "getCause", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "ReturnValue", "value", "manual"] - ["java.lang", "Throwable", True, "getMessage", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "value", "manual"] + - ["java.lang", "Throwable", True, "getLocalizedMessage", "()", "", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "value", "manual"] # ! should the field used be different? - ["java.lang", "Throwable", True, "toString", "()", "", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "taint", "manual"] # ! little unsure about this one... - addsTo: pack: codeql/java-all @@ -119,11 +129,18 @@ extensions: data: - ["java.lang", "AbstractStringBuilder", "length", "()", "manual"] - ["java.lang", "Boolean", "equals", "(Object)", "manual"] + - ["java.lang", "Boolean", "valueOf", "(boolean)", "manual"] + - ["java.lang", "Class", "forName", "(String)", "manual"] - ["java.lang", "Class", "getCanonicalName", "()", "manual"] - ["java.lang", "Class", "getClassLoader", "()", "manual"] + - ["java.lang", "Class", "getMethod", "(String,Class[])", "manual"] - ["java.lang", "Class", "getName", "()", "manual"] + - ["java.lang", "Class", "getResource", "(String)", "manual"] + - ["java.lang", "Class", "getResourceAsStream", "(String)", "manual"] - ["java.lang", "Class", "getSimpleName", "()", "manual"] - ["java.lang", "Class", "isAssignableFrom", "(Class)", "manual"] + - ["java.lang", "Class", "isInstance", "(Object)", "manual"] + - ["java.lang", "Class", "toString", "()", "manual"] - ["java.lang", "Enum", "Enum", "(String,int)", "manual"] - ["java.lang", "Enum", "equals", "(Object)", "manual"] - ["java.lang", "Enum", "hashCode", "()", "manual"] @@ -146,24 +163,33 @@ extensions: - ["java.lang", "String", "indexOf", "(int)", "manual"] - ["java.lang", "String", "indexOf", "(String)", "manual"] - ["java.lang", "String", "isEmpty", "()", "manual"] + - ["java.lang", "String", "lastIndexOf", "(int)", "manual"] - ["java.lang", "String", "length", "()", "manual"] - ["java.lang", "String", "startsWith", "(String)", "manual"] - ["java.lang", "System", "currentTimeMillis", "()", "manual"] + - ["java.lang", "System", "exit", "(int)", "manual"] + - ["java.lang", "System", "identityHashCode", "(Object)", "manual"] - ["java.lang", "System", "lineSeparator", "()", "manual"] # ! double-check... - ["java.lang", "System", "nanoTime", "()", "manual"] - ["java.lang", "Thread", "currentThread", "()", "manual"] + - ["java.lang", "Thread", "interrupt", "()", "manual"] - ["java.lang", "Thread", "sleep", "(long)", "manual"] - ["java.lang", "Thread", "start", "()", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - ["java.lang", "Boolean", "booleanValue", "()", "manual"] # taint-numeric - ["java.lang", "Boolean", "parseBoolean", "(String)", "manual"] # taint-numeric + - ["java.lang", "Double", "parseDouble", "(String)", "manual"] # taint-numeric - ["java.lang", "Integer", "Integer", "(int)", "manual"] # taint-numeric - ["java.lang", "Integer", "intValue", "()", "manual"] # taint-numeric - ["java.lang", "Integer", "parseInt", "(String)", "manual"] # taint-numeric + - ["java.lang", "Integer", "toHexString", "(int)", "manual"] # taint-numeric + - ["java.lang", "Integer", "toString", "()", "manual"] # taint-numeric - ["java.lang", "Integer", "toString", "(int)", "manual"] # taint-numeric - ["java.lang", "Integer", "valueOf", "(int)", "manual"] # taint-numeric - ["java.lang", "Integer", "valueOf", "(String)", "manual"] # taint-numeric # ! should probably make this and others like it have a "" signature instead... + - ["java.lang", "Long", "Long", "(long)", "manual"] # taint-numeric + - ["java.lang", "Long", "intValue", "()", "manual"] # taint-numeric - ["java.lang", "Long", "longValue", "()", "manual"] # taint-numeric - ["java.lang", "Long", "parseLong", "(String)", "manual"] # taint-numeric - ["java.lang", "Long", "toString", "()", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.lang.reflect.model.yml b/java/ql/lib/ext/java.lang.reflect.model.yml index 6de65bc46b9..b4f8ab4054d 100644 --- a/java/ql/lib/ext/java.lang.reflect.model.yml +++ b/java/ql/lib/ext/java.lang.reflect.model.yml @@ -3,6 +3,7 @@ extensions: pack: codeql/java-all extensible: summaryModel data: + - ["java.lang.reflect", "Constructor", False, "newInstance", "(Object[])", "", "Argument[0].ArrayElement", "ReturnValue.Parameter", "value", "manual"] # ! unsure about input/output - ["java.lang.reflect", "Method", False, "invoke", "(Object,Object[])", "", "Argument[1].ArrayElement", "Argument[-1].Parameter[0]", "value", "manual"] # ! very unsure if this model is correct... - addsTo: diff --git a/java/ql/lib/ext/java.math.model.yml b/java/ql/lib/ext/java.math.model.yml index 944b23e0535..f071e5d4678 100644 --- a/java/ql/lib/ext/java.math.model.yml +++ b/java/ql/lib/ext/java.math.model.yml @@ -7,9 +7,13 @@ extensions: # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - - ["java.math", "BigDecimal", "BigDecimal", "(int)", "manual"] # taint-numeric - - ["java.math", "BigDecimal", "BigDecimal", "(String)", "manual"] # taint-numeric - - ["java.math", "BigDecimal", "add", "(BigDecimal)", "manual"] # taint-numeric - - ["java.math", "BigDecimal", "valueOf", "(double)", "manual"] # taint-numeric - - ["java.math", "BigDecimal", "valueOf", "(long)", "manual"] # taint-numeric - - ["java.math", "BigInteger", "valueOf", "(long)", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "BigDecimal", "(int)", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "BigDecimal", "(String)", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "add", "(BigDecimal)", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "doubleValue", "()", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "setScale", "(int,RoundingMode)", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "toString", "()", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "valueOf", "(double)", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "valueOf", "(long)", "manual"] # taint-numeric + - ["java.math", "BigInteger", "or", "(BigInteger)", "manual"] # taint-numeric + - ["java.math", "BigInteger", "valueOf", "(long)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.nio.file.model.yml b/java/ql/lib/ext/java.nio.file.model.yml index cca00413c33..b2ad2e0660a 100644 --- a/java/ql/lib/ext/java.nio.file.model.yml +++ b/java/ql/lib/ext/java.nio.file.model.yml @@ -61,3 +61,9 @@ extensions: # - ["java.nio.file", "Files", True, "walkFileTree", "(Path,FileVisitor)", "", "Argument[0]", "Argument[1].Method[preVisitDirectory(Path,BasicFileAttributes)].Parameter[0]", "taint", "ai-generated"] # - ["java.nio.file", "Files", True, "walkFileTree", "(Path,FileVisitor)", "", "Argument[0]" "Argument[1].Method[visitFile(Path,BasicFileAttributes)].Parameter[0]", "taint", "ai-generated"] # - ["java.nio.file", "Files", True, "walkFileTree", "(Path,FileVisitor)", "", "Argument[0]", "Argument[1].Method[visitFileFailed(Path,IOException)].Parameter[0]", "taint", "ai-generated"] + + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.nio.file", "Files", "exists", "(Path,LinkOption[])", "manual"] diff --git a/java/ql/lib/ext/java.nio.model.yml b/java/ql/lib/ext/java.nio.model.yml index 675b85bf766..1192599f762 100644 --- a/java/ql/lib/ext/java.nio.model.yml +++ b/java/ql/lib/ext/java.nio.model.yml @@ -6,3 +6,10 @@ extensions: - ["java.nio", "ByteBuffer", False, "array", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.nio", "ByteBuffer", False, "get", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.nio", "ByteBuffer", False, "wrap", "(byte[])", "", "Argument[0]", "ReturnValue", "taint", "manual"] + + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.nio", "Buffer", "remaining", "()", "manual"] + - ["java.nio", "ByteBuffer", "allocate", "(int)", "manual"] diff --git a/java/ql/lib/ext/java.sql.model.yml b/java/ql/lib/ext/java.sql.model.yml index 14b3c7c3685..6a801095c4f 100644 --- a/java/ql/lib/ext/java.sql.model.yml +++ b/java/ql/lib/ext/java.sql.model.yml @@ -28,11 +28,14 @@ extensions: pack: codeql/java-all extensible: neutralModel data: + - ["java.sql", "PreparedStatement", "executeUpdate", "()", "manual"] - ["java.sql", "ResultSet", "next", "()", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - - ["java.sql", "PreparedStatement", "setInt", "(int,int)", "manual"] # value-numeric - - ["java.sql", "ResultSet", "getInt", "(String)", "manual"] # taint-numeric - - ["java.sql", "ResultSet", "getLong", "(String)", "manual"] # taint-numeric - - ["java.sql", "ResultSet", "getString", "(int)", "manual"] # taint-numeric - - ["java.sql", "Timestamp", "Timestamp", "(long)", "manual"] # taint-numeric + - ["java.sql", "PreparedStatement", "setInt", "(int,int)", "manual"] # value-numeric + - ["java.sql", "PreparedStatement", "setLong", "(int,long)", "manual"] # value-numeric + - ["java.sql", "ResultSet", "getInt", "(String)", "manual"] # taint-numeric + - ["java.sql", "ResultSet", "getLong", "(String)", "manual"] # taint-numeric + - ["java.sql", "ResultSet", "getString", "(int)", "manual"] # taint-numeric + - ["java.sql", "Timestamp", "Timestamp", "(long)", "manual"] # taint-numeric + - ["java.sql", "Timestamp", "getTime", "()", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.text.model.yml b/java/ql/lib/ext/java.text.model.yml index 4a087ec34b2..b2237825e5a 100644 --- a/java/ql/lib/ext/java.text.model.yml +++ b/java/ql/lib/ext/java.text.model.yml @@ -4,6 +4,8 @@ extensions: extensible: summaryModel data: - ["java.text", "DateFormat", True, "parse", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! maybe not interesting flow and should be neutral model? + - ["java.text", "MessageFormat", False, "format", "(String,Object[])", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! not sure I did this right + - ["java.text", "MessageFormat", False, "format", "(String,Object[])", "", "Argument[1].ArrayElement", "ReturnValue", "taint", "manual"] # ! not sure I did this right - addsTo: pack: codeql/java-all diff --git a/java/ql/lib/ext/java.time.chrono.model.yml b/java/ql/lib/ext/java.time.chrono.model.yml new file mode 100644 index 00000000000..9dd5ca401d3 --- /dev/null +++ b/java/ql/lib/ext/java.time.chrono.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["java.time.chrono", "ChronoZonedDateTime", False, "toInstant", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] # ! neutral? diff --git a/java/ql/lib/ext/java.time.format.model.yml b/java/ql/lib/ext/java.time.format.model.yml new file mode 100644 index 00000000000..8d782400089 --- /dev/null +++ b/java/ql/lib/ext/java.time.format.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["java.time.format", "DateTimeFormatter", False, "ofPattern", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! neutral? diff --git a/java/ql/lib/ext/java.time.model.yml b/java/ql/lib/ext/java.time.model.yml index ae5b8bc0e63..8298b25ee3b 100644 --- a/java/ql/lib/ext/java.time.model.yml +++ b/java/ql/lib/ext/java.time.model.yml @@ -13,7 +13,13 @@ extensions: - ["java.time", "LocalDate", "now", "()", "manual"] - ["java.time", "LocalDateTime", "now", "()", "manual"] - ["java.time", "ZonedDateTime", "now", "()", "manual"] + - ["java.time", "ZoneId", "of", "(String)", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - - ["java.time", "LocalDate", "of", "(int,int,int)", "manual"] # taint-numeric + - ["java.time", "Duration", "ofMillis", "(long)", "manual"] # taint-numeric + - ["java.time", "Duration", "ofMinutes", "(long)", "manual"] # taint-numeric + - ["java.time", "Duration", "toMillis", "()", "manual"] # taint-numeric + - ["java.time", "Instant", "toEpochMilli", "()", "manual"] # taint-numeric + - ["java.time", "LocalDate", "of", "(int,int,int)", "manual"] # taint-numeric + - ["java.time", "LocalDateTime", "of", "(int,int,int,int,int,int)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.util.concurrent.atomic.model.yml b/java/ql/lib/ext/java.util.concurrent.atomic.model.yml index 1e563a76d0f..f6a0edc2b63 100644 --- a/java/ql/lib/ext/java.util.concurrent.atomic.model.yml +++ b/java/ql/lib/ext/java.util.concurrent.atomic.model.yml @@ -11,6 +11,7 @@ extensions: pack: codeql/java-all extensible: neutralModel data: + - ["java.util.concurrent.atomic", "AtomicBoolean", "AtomicBoolean", "(boolean)", "manual"] - ["java.util.concurrent.atomic", "AtomicBoolean", "get", "()", "manual"] - ["java.util.concurrent.atomic", "AtomicBoolean", "set", "(boolean)", "manual"] @@ -19,4 +20,6 @@ extensions: - ["java.util.concurrent.atomic", "AtomicInteger", "AtomicInteger", "(int)", "manual"] # value-numeric - ["java.util.concurrent.atomic", "AtomicInteger", "get", "()", "manual"] # value-numeric - ["java.util.concurrent.atomic", "AtomicInteger", "incrementAndGet", "()", "manual"] # taint-numeric + - ["java.util.concurrent.atomic", "AtomicLong", "AtomicLong", "(long)", "manual"] # value-numeric # ! this is supposedly already supported per the telemetry query, LOOK INTO WHY/HOW + - ["java.util.concurrent.atomic", "AtomicLong", "addAndGet", "(long)", "manual"] # taint-numeric - ["java.util.concurrent.atomic", "AtomicLong", "get", "()", "manual"] # value-numeric diff --git a/java/ql/lib/ext/java.util.concurrent.locks.model.yml b/java/ql/lib/ext/java.util.concurrent.locks.model.yml new file mode 100644 index 00000000000..0a248e01262 --- /dev/null +++ b/java/ql/lib/ext/java.util.concurrent.locks.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.util.concurrent.locks", "Lock", "unlock", "()", "manual"] diff --git a/java/ql/lib/ext/java.util.concurrent.model.yml b/java/ql/lib/ext/java.util.concurrent.model.yml index 1f8d4d01350..8fdd29bb262 100644 --- a/java/ql/lib/ext/java.util.concurrent.model.yml +++ b/java/ql/lib/ext/java.util.concurrent.model.yml @@ -17,6 +17,8 @@ extensions: - ["java.util.concurrent", "BlockingQueue", True, "poll", "(long,TimeUnit)", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - ["java.util.concurrent", "BlockingQueue", True, "put", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util.concurrent", "BlockingQueue", True, "take", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"] + - ["java.util.concurrent", "CompletableFuture", False, "complete", "(Object)", "", "Argument[0]", "Argument[-1].SyntheticField[java.util.concurrent.CompletableFuture.value]", "value", "manual"] # ! not sure about CompleteableFuture ones + - ["java.util.concurrent", "CompletableFuture", False, "completedFuture", "(Object)", "", "Argument[0]", "ReturnValue.SyntheticField[java.util.concurrent.CompletableFuture.value]", "value", "manual"] - ["java.util.concurrent", "CompletableFuture", False, "get", "()", "", "Argument[-1].SyntheticField[java.util.concurrent.CompletableFuture.value]", "ReturnValue", "value", "manual"] # ! not sure if using SyntheticField is correct here; also, should prbly remove this for `Future.get` below's subtyping to handle. - ["java.util.concurrent", "CompletableFuture", False, "join", "()", "", "Argument[-1].SyntheticField[java.util.concurrent.CompletableFuture.value]", "ReturnValue", "value", "manual"] # ! not sure if using SyntheticField is correct here - ["java.util.concurrent", "ConcurrentHashMap", True, "elements", "()", "", "Argument[this].MapValue", "ReturnValue.Element", "value", "manual"] @@ -29,8 +31,10 @@ extensions: pack: codeql/java-all extensible: neutralModel data: + - ["java.util.concurrent", "CompletableFuture", "completeExceptionally", "(Throwable)", "manual"] # ! summary? - ["java.util.concurrent", "CountDownLatch", "await", "(long,TimeUnit)", "manual"] - ["java.util.concurrent", "CountDownLatch", "countDown", "()", "manual"] + - ["java.util.concurrent", "Executor", "execute", "(Runnable)", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. diff --git a/java/ql/lib/ext/java.util.logging.model.yml b/java/ql/lib/ext/java.util.logging.model.yml index 2d5421e2f47..45afcb2bfa8 100644 --- a/java/ql/lib/ext/java.util.logging.model.yml +++ b/java/ql/lib/ext/java.util.logging.model.yml @@ -41,6 +41,7 @@ extensions: pack: codeql/java-all extensible: summaryModel data: + - ["java.util.logging", "Logger", False, "getLogger", "(String)", "", "Argument[0]", "ReturnValue.SyntheticField[java.util.logging.Logger.name]", "value", "manual"] # ! not sure if using SyntheticField here is correct... - ["java.util.logging", "LogRecord", False, "LogRecord", "", "", "Argument[1]", "Argument[this]", "taint", "manual"] - addsTo: diff --git a/java/ql/lib/ext/java.util.model.yml b/java/ql/lib/ext/java.util.model.yml index dec98781db4..8df603bfdda 100644 --- a/java/ql/lib/ext/java.util.model.yml +++ b/java/ql/lib/ext/java.util.model.yml @@ -176,6 +176,7 @@ extensions: - ["java.util", "Map", True, "getOrDefault", "", "", "Argument[1]", "ReturnValue", "value", "manual"] - ["java.util", "Map", True, "keySet", "()", "", "Argument[this].MapKey", "ReturnValue.Element", "value", "manual"] - ["java.util", "Map", True, "merge", "(Object,Object,BiFunction)", "", "Argument[1]", "Argument[this].MapValue", "value", "manual"] + # ! difference between formatting of below versus `List.of` above? - ["java.util", "Map", False, "of", "", "", "Argument[0]", "ReturnValue.MapKey", "value", "manual"] - ["java.util", "Map", False, "of", "", "", "Argument[10]", "ReturnValue.MapKey", "value", "manual"] - ["java.util", "Map", False, "of", "", "", "Argument[11]", "ReturnValue.MapValue", "value", "manual"] @@ -347,6 +348,7 @@ extensions: - ["java.util", "TreeMap", False, "TreeMap", "(SortedMap)", "", "Argument[0].MapValue", "Argument[this].MapValue", "value", "manual"] - ["java.util", "TreeSet", False, "TreeSet", "(Collection)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"] - ["java.util", "TreeSet", False, "TreeSet", "(SortedSet)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"] + - ["java.util", "UUID", False, "fromString", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.util", "Vector", False, "Vector", "(Collection)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"] - ["java.util", "Vector", True, "addElement", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util", "Vector", True, "copyInto", "(Object[])", "", "Argument[this].Element", "Argument[0].ArrayElement", "value", "manual"] @@ -364,23 +366,31 @@ extensions: extensible: neutralModel data: - ["java.util", "ArrayList", "ArrayList", "(int)", "manual"] + - ["java.util", "ArrayList", "isEmpty", "()", "manual"] - ["java.util", "ArrayList", "size", "()", "manual"] - ["java.util", "Arrays", "toString", "(Object[])", "manual"] # ! should this have a summary model after all? (or unwanted model due to too much FP flow?) - ["java.util", "Calendar", "getInstance", "()", "manual"] + - ["java.util", "Collection", "contains", "(Object)", "manual"] - ["java.util", "Collection", "isEmpty", "()", "manual"] + - ["java.util", "Collection", "removeIf", "(Predicate)", "manual"] # ! WithoutElement comment? (double-check if it returns anything, etc.) - ["java.util", "Collection", "size", "()", "manual"] - ["java.util", "Collections", "emptyList", "()", "manual"] - ["java.util", "Collections", "emptyMap", "()", "manual"] - ["java.util", "Collections", "emptySet", "()", "manual"] + - ["java.util", "Collections", "sort", "(List,Comparator)", "manual"] # ! summary model instead? - ["java.util", "Comparator", "comparing", "(Function)", "manual"] # ! seems complex (functional interface), should maybe not have any model? + - ["java.util", "Enumeration", "hasMoreElements", "()", "manual"] + - ["java.util", "HashMap", "containsKey", "(Object)", "manual"] - ["java.util", "HashMap", "HashMap", "(int)", "manual"] - ["java.util", "Iterator", "hasNext", "()", "manual"] - ["java.util", "Iterator", "remove", "()", "manual"] # ! WithoutElement comment? (double-check if it returns anything, etc.) - ["java.util", "List", "contains", "(Object)", "manual"] - ["java.util", "List", "equals", "(Object)", "manual"] - ["java.util", "List", "hashCode", "()", "manual"] + - ["java.util", "List", "indexOf", "(Object)", "manual"] - ["java.util", "List", "isEmpty", "()", "manual"] - ["java.util", "List", "of", "()", "manual"] + - ["java.util", "List", "sort", "(Comparator)", "manual"] # ! summary model instead? - ["java.util", "List", "remove", "(Object)", "manual"] # ! WithoutElement comment? (actually, see above, is this already modeled for a different signature?) - ["java.util", "List", "size", "()", "manual"] - ["java.util", "Map", "containsKey", "(Object)", "manual"] @@ -388,6 +398,7 @@ extensions: - ["java.util", "Map", "size", "()", "manual"] - ["java.util", "Objects", "equals", "(Object,Object)", "manual"] - ["java.util", "Objects", "hash", "(Object[])", "manual"] + - ["java.util", "Objects", "hashCode", "(Object)", "manual"] - ["java.util", "Objects", "isNull", "(Object)", "manual"] - ["java.util", "Objects", "nonNull", "(Object)", "manual"] - ["java.util", "Optional", "empty", "()", "manual"] @@ -400,16 +411,19 @@ extensions: - ["java.util", "Set", "size", "()", "manual"] - ["java.util", "UUID", "randomUUID", "()", "manual"] - ["java.util", "UUID", "toString", "()", "manual"] + - ["java.util", "Vector", "size", "()", "manual"] # The below APIs are currently being stored as neutral models since `WithoutElement` has not yet been implemented for Java. # When `WithoutElement` is implemented, these should be changed to summary models of the form `Argument[this].WithoutElement -> Argument[this]`. - ["java.util", "List", "clear", "()", "manual"] - ["java.util", "Map", "clear", "()", "manual"] + - ["java.util", "Set", "clear", "()", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - - ["java.util", "Calendar", "get", "(int)", "manual"] # value-numeric - - ["java.util", "Calendar", "getTime", "()", "manual"] # taint-numeric - - ["java.util", "Calendar", "set", "(int,int)", "manual"] # value-numeric - - ["java.util", "Date", "Date", "(long)", "manual"] # taint-numeric - - ["java.util", "Date", "getTime", "()", "manual"] # taint-numeric + - ["java.util", "Calendar", "get", "(int)", "manual"] # value-numeric + - ["java.util", "Calendar", "getTime", "()", "manual"] # taint-numeric + - ["java.util", "Calendar", "getTimeInMillis", "()", "manual"] # taint-numeric + - ["java.util", "Calendar", "set", "(int,int)", "manual"] # value-numeric + - ["java.util", "Date", "Date", "(long)", "manual"] # taint-numeric + - ["java.util", "Date", "getTime", "()", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.util.regex.model.yml b/java/ql/lib/ext/java.util.regex.model.yml index ac8667de757..8be0c3105ae 100644 --- a/java/ql/lib/ext/java.util.regex.model.yml +++ b/java/ql/lib/ext/java.util.regex.model.yml @@ -21,6 +21,7 @@ extensions: - ["java.util.regex", "Matcher", False, "replaceAll", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.util.regex", "Matcher", False, "replaceFirst", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.util.regex", "Matcher", False, "replaceFirst", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["java.util.regex", "Pattern", False, "compile", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.util.regex", "Pattern", False, "matcher", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.util.regex", "Pattern", False, "quote", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.util.regex", "Pattern", False, "split", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] diff --git a/java/ql/lib/ext/java.util.stream.model.yml b/java/ql/lib/ext/java.util.stream.model.yml index f4e158d9a20..01786c37b7e 100644 --- a/java/ql/lib/ext/java.util.stream.model.yml +++ b/java/ql/lib/ext/java.util.stream.model.yml @@ -95,3 +95,4 @@ extensions: data: - ["java.util.stream", "Collectors", "toList", "()", "manual"] - ["java.util.stream", "Collectors", "toSet", "()", "manual"] + - ["java.util.stream", "Stream", "count", "()", "manual"] From 9103e5c5dd4733ca249a9e51541198f2cf23da56 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Tue, 17 Jan 2023 15:02:14 -0500 Subject: [PATCH 116/143] Java: update TopJdkApis test case for top-500 --- java/ql/test/ext/TopJdkApis/TopJdkApis.qll | 57 ++++++++++++++++++- .../test/ext/TopJdkApis/TopJdkApisTest.java | 3 + 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/java/ql/test/ext/TopJdkApis/TopJdkApis.qll b/java/ql/test/ext/TopJdkApis/TopJdkApis.qll index 8bc5b77130b..8f71c8a88f3 100644 --- a/java/ql/test/ext/TopJdkApis/TopJdkApis.qll +++ b/java/ql/test/ext/TopJdkApis/TopJdkApis.qll @@ -219,7 +219,62 @@ predicate topJdkApiName(string apiName) { "java.time.Duration#ofMinutes(long)", "java.time.format.DateTimeFormatter#ofPattern(String)", "java.lang.Throwable#getLocalizedMessage()", "java.lang.StringBuilder#delete(int,int)", "java.util.Vector#size()", "java.lang.String#String(String)", "java.util.ArrayList#isEmpty()", - "java.util.Collection#removeIf(Predicate)" + "java.util.Collection#removeIf(Predicate)", + // top 500 JDK APIs + "java.util.HashSet#HashSet(int)", "java.util.Set#of(Object,Object)", + "java.util.Collections#unmodifiableSet(Set)", "java.sql.Connection#createStatement()", + "java.math.BigDecimal#subtract(BigDecimal)", "java.util.Date#from(Instant)", + "java.lang.StringBuffer#append(char)", "java.util.Locale#forLanguageTag(String)", + "java.io.DataInput#readLong()", "java.util.Collections#sort(List)", + "java.io.DataOutput#writeLong(long)", "java.util.function.BiFunction#apply(Object,Object)", + "java.lang.String#lastIndexOf(String)", "java.util.Optional#filter(Predicate)", + "java.lang.StringBuilder#append(ObjectString)", "java.lang.StringBuffer#append(Object)", + "java.io.File#getParentFile()", "java.util.stream.Stream#allMatch(Predicate)", + "java.sql.ResultSet#getTimestamp(String)", "java.util.Calendar#setTime(Date)", + "java.util.concurrent.CompletionStage#toCompletableFuture()", + "java.util.concurrent.locks.Lock#lock()", "java.lang.reflect.Field#get(Object)", + "java.io.InputStream#close()", "java.math.BigInteger#BigInteger(String)", + "java.lang.Class#getDeclaredField(String)", + "java.io.InputStreamReader#InputStreamReader(InputStream)", "java.lang.Runtime#getRuntime()", + "java.lang.Class#getDeclaredConstructor(Class[])", + "java.lang.AbstractStringBuilder#setLength(int)", "java.nio.Buffer#position()", + "java.nio.file.Path#getFileName()", "java.util.List#toArray()", + "java.lang.CharSequence#length()", "java.util.stream.Stream#distinct()", + "java.lang.String#format(ObjectString,Object[])", "java.net.URL#toURI()", + "java.util.Queue#poll()", "java.lang.Thread#getContextClassLoader()", + "java.lang.String#valueOf(boolean)", "java.util.Calendar#add(int,int)", + "java.util.HashMap#entrySet()", "java.util.stream.IntStream#mapToObj(IntFunction)", + "java.util.concurrent.atomic.AtomicLong#incrementAndGet()", + "java.util.concurrent.ExecutorService#shutdown()", + "java.util.concurrent.ExecutorService#submit(Runnable)", "java.math.BigDecimal#intValue()", + "java.math.BigDecimal#toBigInteger()", "java.util.LinkedList#add(Object)", + "java.lang.AbstractStringBuilder#charAt(int)", "java.lang.Thread#getName()", + "java.lang.Math#max(long,long)", "java.util.HashMap#size()", + "java.time.LocalDate#plusDays(long)", "java.nio.ByteBuffer#array()", + "java.lang.StringBuilder#append(CharSequence)", "java.util.Vector#addElement(Object)", + "java.lang.ClassLoader#getResource(String)", "java.awt.Insets#Insets(int,int,int,int)", + "java.util.TimeZone#getTimeZone(String)", "java.time.ZoneId#systemDefault()", + "java.lang.Number#doubleValue()", "java.util.stream.Stream#reduce(Object,BinaryOperator)", + "java.lang.CharSequence#toString()", "java.time.Instant#parse(CharSequence)", + "java.text.Format#format(Object)", "java.io.File#toURI()", "java.sql.ResultSet#getInt(int)", + "java.lang.Number#longValue()", "java.lang.Double#doubleToLongBits(double)", + "java.lang.Math#min(long,long)", "java.lang.Double#valueOf(double)", + "java.lang.invoke.MethodHandles#lookup()", "java.util.concurrent.CompletableFuture#isDone()", + "java.time.LocalDate#parse(CharSequence)", "java.lang.StringBuilder#append(boolean)", + "java.util.concurrent.CountDownLatch#await()", + "java.util.concurrent.ConcurrentHashMap#put(Object,Object)", + "java.util.stream.Stream#mapToInt(ToIntFunction)", + "java.math.BigDecimal#multiply(BigDecimal)", "java.util.stream.Stream#concat(Stream,Stream)", + "java.time.Instant#ofEpochMilli(long)", "java.nio.file.Path#getParent()", + "java.util.stream.Stream#sorted()", + "java.util.concurrent.atomic.AtomicBoolean#compareAndSet(boolean,boolean)", + "java.util.UUID#equals(Object)", "java.io.OutputStream#flush()", + "java.time.format.DateTimeFormatter#format(TemporalAccessor)", "java.io.Closeable#close()", + "java.util.EventObject#getSource()", "java.io.File#File(String,String)", + "java.lang.Number#intValue()", "java.io.File#length()", + "java.lang.AbstractStringBuilder#setCharAt(int,char)", "java.util.Set#removeAll(Collection)", + "java.io.File#listFiles()", "java.lang.ClassLoader#getResourceAsStream(String)", + "java.util.Date#toInstant()", "java.util.Queue#add(Object)", "java.io.File#isFile()" ] } diff --git a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.java b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.java index 0bd7bab64c6..90797502198 100644 --- a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.java +++ b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.java @@ -2,6 +2,7 @@ import java.awt.Container; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.FileInputStream; +import java.io.InputStreamReader; import java.io.StringReader; import java.io.StringWriter; import java.io.UncheckedIOException; @@ -10,6 +11,7 @@ import java.lang.IllegalStateException; import java.lang.IndexOutOfBoundsException; import java.lang.NullPointerException; import java.lang.Math; +import java.lang.Runtime; import java.lang.System; import java.math.BigDecimal; import java.nio.file.Files; @@ -23,6 +25,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedList; import java.util.Map; import java.util.Objects; import java.util.StringJoiner; From c213d56d2cbbad29b685d1d6bbfcc7a3f948909f Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Thu, 23 Mar 2023 17:56:46 -0400 Subject: [PATCH 117/143] Java: resolve some more -1 to this conflicts --- java/ql/lib/ext/java.awt.model.yml | 8 +++ java/ql/lib/ext/java.io.model.yml | 16 ++++- java/ql/lib/ext/java.lang.invoke.model.yml | 6 ++ java/ql/lib/ext/java.lang.model.yml | 65 ++++++++++++------- java/ql/lib/ext/java.lang.reflect.model.yml | 1 + java/ql/lib/ext/java.math.model.yml | 5 ++ java/ql/lib/ext/java.nio.file.model.yml | 2 + java/ql/lib/ext/java.nio.model.yml | 1 + java/ql/lib/ext/java.sql.model.yml | 4 ++ java/ql/lib/ext/java.text.model.yml | 1 + java/ql/lib/ext/java.time.format.model.yml | 1 + java/ql/lib/ext/java.time.model.yml | 5 ++ .../ext/java.util.concurrent.atomic.model.yml | 2 + .../ext/java.util.concurrent.locks.model.yml | 1 + .../ql/lib/ext/java.util.concurrent.model.yml | 5 ++ java/ql/lib/ext/java.util.function.model.yml | 1 + java/ql/lib/ext/java.util.model.yml | 12 ++++ java/ql/lib/ext/java.util.stream.model.yml | 5 +- 18 files changed, 114 insertions(+), 27 deletions(-) create mode 100644 java/ql/lib/ext/java.lang.invoke.model.yml diff --git a/java/ql/lib/ext/java.awt.model.yml b/java/ql/lib/ext/java.awt.model.yml index 97776d26e93..30cabdcf8e5 100644 --- a/java/ql/lib/ext/java.awt.model.yml +++ b/java/ql/lib/ext/java.awt.model.yml @@ -5,3 +5,11 @@ extensions: data: - ["java.awt", "Container", True, "add", "(Component)", "", "Argument[0]", "Argument[-1].Element", "value", "manual"] # ! signature as "" instead? - ["java.awt", "Container", True, "add", "(Component,Object)", "", "Argument[0]", "Argument[-1].Element", "value", "manual"] + + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + # The below APIs have numeric flow and are currently being stored as neutral models. + # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. + - ["java.awt", "Insets", "Insets", "(int,int,int,int)", "manual"] # value-numeric diff --git a/java/ql/lib/ext/java.io.model.yml b/java/ql/lib/ext/java.io.model.yml index 58ddfc1f523..4c500236fa0 100644 --- a/java/ql/lib/ext/java.io.model.yml +++ b/java/ql/lib/ext/java.io.model.yml @@ -59,11 +59,9 @@ extensions: - ["java.io", "CharArrayReader", False, "CharArrayReader", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.io", "CharArrayWriter", True, "toCharArray", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "DataInput", True, "readFully", "", "", "Argument[this]", "Argument[0]", "taint", "manual"] - - ["java.io", "DataInput", True, "readInt", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - ["java.io", "DataInput", True, "readLine", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "DataInput", True, "readUTF", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "DataInputStream", False, "DataInputStream", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - - ["java.io", "DataOutput", True, "writeInt", "(int)", "", "Argument[0]", "Argument[-1]", "taint", "manual"] - ["java.io", "File", False, "File", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.io", "File", False, "File", "", "", "Argument[1]", "Argument[this]", "taint", "manual"] - ["java.io", "File", True, "getAbsoluteFile", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] @@ -99,7 +97,21 @@ extensions: pack: codeql/java-all extensible: neutralModel data: + - ["java.io", "Closeable", "close", "()", "manual"] - ["java.io", "File", "delete", "()", "manual"] - ["java.io", "File", "exists", "()", "manual"] + - ["java.io", "File", "getParentFile", "()", "manual"] # ! little unsure about this as a neutral + - ["java.io", "File", "isFile", "()", "manual"] + - ["java.io", "File", "length", "()", "manual"] + - ["java.io", "File", "listFiles", "()", "manual"] # ! little unsure about this as a neutral - ["java.io", "File", "isDirectory", "()", "manual"] - ["java.io", "File", "mkdirs", "()", "manual"] + - ["java.io", "InputStream", "close", "()", "manual"] + - ["java.io", "OutputStream", "flush", "()", "manual"] # ! little unsure about this as a neutral, but not sure how to represent output if summary model... + + # The below APIs have numeric flow and are currently being stored as neutral models. + # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. + - ["java.io", "DataInput", "readInt", "()", "manual"] # taint-numeric + - ["java.io", "DataInput", "readLong", "()", "manual"] # taint-numeric + - ["java.io", "DataOutput", "writeInt", "(int)", "manual"] # taint-numeric + - ["java.io", "DataOutput", "writeLong", "(long)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.lang.invoke.model.yml b/java/ql/lib/ext/java.lang.invoke.model.yml new file mode 100644 index 00000000000..16259190a02 --- /dev/null +++ b/java/ql/lib/ext/java.lang.invoke.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.lang.invoke", "MethodHandles", "lookup", "()", "manual"] diff --git a/java/ql/lib/ext/java.lang.model.yml b/java/ql/lib/ext/java.lang.model.yml index ff4edca5a5c..6a581ff12a6 100644 --- a/java/ql/lib/ext/java.lang.model.yml +++ b/java/ql/lib/ext/java.lang.model.yml @@ -117,6 +117,7 @@ extensions: - ["java.lang", "System", False, "getenv", "(String)", "", "Argument[-1].MapValue", "ReturnValue", "value", "manual"] # ! neutral instead? - ["java.lang", "System", False, "getenv", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! really unsure about this...; neutral instead? -- or unmodelled - ["java.lang", "Thread", False, "Thread", "(Runnable)", "", "Argument[0]", "Argument[-1]", "taint", "manual"] # ! neutral instead? + - ["java.lang", "Thread", True, "getName", "()", "", "Argument[-1].SyntheticField[java.lang.Thread.name]", "ReturnValue", "value", "manual"] - ["java.lang", "ThreadLocal", True, "get", "()", "", "Argument[-1].SyntheticField[java.lang.ThreadLocal.value]", "ReturnValue", "value", "manual"] # ! not sure if this model is correct, and if should be neutral model instead - ["java.lang", "Throwable", False, "Throwable", "(Throwable)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "value", "manual"] - ["java.lang", "Throwable", True, "getCause", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "ReturnValue", "value", "manual"] @@ -128,11 +129,16 @@ extensions: extensible: neutralModel data: - ["java.lang", "AbstractStringBuilder", "length", "()", "manual"] + - ["java.lang", "AbstractStringBuilder", "setCharAt", "(int,char)", "manual"] # ! char manipulation not interesting? (or interesting since could set many chars... prbly switch to summary model) + - ["java.lang", "AbstractStringBuilder", "setLength", "(int)", "manual"] # ! summary? - ["java.lang", "Boolean", "equals", "(Object)", "manual"] - ["java.lang", "Boolean", "valueOf", "(boolean)", "manual"] + - ["java.lang", "CharSequence", "length", "()", "manual"] - ["java.lang", "Class", "forName", "(String)", "manual"] - ["java.lang", "Class", "getCanonicalName", "()", "manual"] - ["java.lang", "Class", "getClassLoader", "()", "manual"] + - ["java.lang", "Class", "getDeclaredConstructor", "(Class[])", "manual"] + - ["java.lang", "Class", "getDeclaredField", "(String)", "manual"] - ["java.lang", "Class", "getMethod", "(String,Class[])", "manual"] - ["java.lang", "Class", "getName", "()", "manual"] - ["java.lang", "Class", "getResource", "(String)", "manual"] @@ -141,6 +147,8 @@ extensions: - ["java.lang", "Class", "isAssignableFrom", "(Class)", "manual"] - ["java.lang", "Class", "isInstance", "(Object)", "manual"] - ["java.lang", "Class", "toString", "()", "manual"] + - ["java.lang", "ClassLoader", "getResource", "(String)", "manual"] + - ["java.lang", "ClassLoader", "getResourceAsStream", "(String)", "manual"] - ["java.lang", "Enum", "Enum", "(String,int)", "manual"] - ["java.lang", "Enum", "equals", "(Object)", "manual"] - ["java.lang", "Enum", "hashCode", "()", "manual"] @@ -154,6 +162,7 @@ extensions: - ["java.lang", "Object", "hashCode", "()", "manual"] - ["java.lang", "Object", "toString", "()", "manual"] - ["java.lang", "Runnable", "run", "()", "manual"] + - ["java.lang", "Runtime", "getRuntime", "()", "manual"] - ["java.lang", "String", "compareTo", "(String)", "manual"] - ["java.lang", "String", "contains", "(CharSequence)", "manual"] - ["java.lang", "String", "endsWith", "(String)", "manual"] @@ -164,39 +173,49 @@ extensions: - ["java.lang", "String", "indexOf", "(String)", "manual"] - ["java.lang", "String", "isEmpty", "()", "manual"] - ["java.lang", "String", "lastIndexOf", "(int)", "manual"] + - ["java.lang", "String", "lastIndexOf", "(String)", "manual"] - ["java.lang", "String", "length", "()", "manual"] - ["java.lang", "String", "startsWith", "(String)", "manual"] + - ["java.lang", "String", "valueOf", "(boolean)", "manual"] - ["java.lang", "System", "currentTimeMillis", "()", "manual"] - ["java.lang", "System", "exit", "(int)", "manual"] - ["java.lang", "System", "identityHashCode", "(Object)", "manual"] - ["java.lang", "System", "lineSeparator", "()", "manual"] # ! double-check... - ["java.lang", "System", "nanoTime", "()", "manual"] - ["java.lang", "Thread", "currentThread", "()", "manual"] + - ["java.lang", "Thread", "getContextClassLoader", "()", "manual"] # ! summary instead? - ["java.lang", "Thread", "interrupt", "()", "manual"] - ["java.lang", "Thread", "sleep", "(long)", "manual"] - ["java.lang", "Thread", "start", "()", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - - ["java.lang", "Boolean", "booleanValue", "()", "manual"] # taint-numeric - - ["java.lang", "Boolean", "parseBoolean", "(String)", "manual"] # taint-numeric - - ["java.lang", "Double", "parseDouble", "(String)", "manual"] # taint-numeric - - ["java.lang", "Integer", "Integer", "(int)", "manual"] # taint-numeric - - ["java.lang", "Integer", "intValue", "()", "manual"] # taint-numeric - - ["java.lang", "Integer", "parseInt", "(String)", "manual"] # taint-numeric - - ["java.lang", "Integer", "toHexString", "(int)", "manual"] # taint-numeric - - ["java.lang", "Integer", "toString", "()", "manual"] # taint-numeric - - ["java.lang", "Integer", "toString", "(int)", "manual"] # taint-numeric - - ["java.lang", "Integer", "valueOf", "(int)", "manual"] # taint-numeric - - ["java.lang", "Integer", "valueOf", "(String)", "manual"] # taint-numeric # ! should probably make this and others like it have a "" signature instead... - - ["java.lang", "Long", "Long", "(long)", "manual"] # taint-numeric - - ["java.lang", "Long", "intValue", "()", "manual"] # taint-numeric - - ["java.lang", "Long", "longValue", "()", "manual"] # taint-numeric - - ["java.lang", "Long", "parseLong", "(String)", "manual"] # taint-numeric - - ["java.lang", "Long", "toString", "()", "manual"] # taint-numeric - - ["java.lang", "Long", "toString", "(long)", "manual"] # taint-numeric - - ["java.lang", "Long", "valueOf", "(long)", "manual"] # taint-numeric - - ["java.lang", "Long", "valueOf", "(String)", "manual"] # taint-numeric - - ["java.lang", "Math", "max", "(int,int)", "manual"] # value-numeric - - ["java.lang", "Math", "min", "(int,int)", "manual"] # value-numeric - - ["java.lang", "String", "valueOf", "(int)", "manual"] # taint-numeric - - ["java.lang", "String", "valueOf", "(long)", "manual"] # taint-numeric + - ["java.lang", "Boolean", "booleanValue", "()", "manual"] # taint-numeric + - ["java.lang", "Boolean", "parseBoolean", "(String)", "manual"] # taint-numeric + - ["java.lang", "Double", "doubleToLongBits", "(double)", "manual"] # taint-numeric + - ["java.lang", "Double", "parseDouble", "(String)", "manual"] # taint-numeric + - ["java.lang", "Double", "valueOf", "(double)", "manual"] # taint-numeric + - ["java.lang", "Integer", "Integer", "(int)", "manual"] # taint-numeric + - ["java.lang", "Integer", "intValue", "()", "manual"] # taint-numeric + - ["java.lang", "Integer", "parseInt", "(String)", "manual"] # taint-numeric + - ["java.lang", "Integer", "toHexString", "(int)", "manual"] # taint-numeric + - ["java.lang", "Integer", "toString", "()", "manual"] # taint-numeric + - ["java.lang", "Integer", "toString", "(int)", "manual"] # taint-numeric + - ["java.lang", "Integer", "valueOf", "(int)", "manual"] # taint-numeric + - ["java.lang", "Integer", "valueOf", "(String)", "manual"] # taint-numeric # ! should probably make this and others like it have a "" signature instead... + - ["java.lang", "Long", "Long", "(long)", "manual"] # taint-numeric + - ["java.lang", "Long", "intValue", "()", "manual"] # taint-numeric + - ["java.lang", "Long", "longValue", "()", "manual"] # taint-numeric + - ["java.lang", "Long", "parseLong", "(String)", "manual"] # taint-numeric + - ["java.lang", "Long", "toString", "()", "manual"] # taint-numeric + - ["java.lang", "Long", "toString", "(long)", "manual"] # taint-numeric + - ["java.lang", "Long", "valueOf", "(long)", "manual"] # taint-numeric + - ["java.lang", "Long", "valueOf", "(String)", "manual"] # taint-numeric + - ["java.lang", "Math", "max", "(int,int)", "manual"] # value-numeric + - ["java.lang", "Math", "max", "(long,long)", "manual"] # value-numeric + - ["java.lang", "Math", "min", "(int,int)", "manual"] # value-numeric + - ["java.lang", "Math", "min", "(long,long)", "manual"] # value-numeric + - ["java.lang", "Number", "doubleValue", "()", "manual"] # taint-numeric # ! remove others that could rely on subtyping through Number instead? (e.g. Double, Integer, etc.) + - ["java.lang", "Number", "intValue", "()", "manual"] # taint-numeric + - ["java.lang", "Number", "longValue", "()", "manual"] # taint-numeric + - ["java.lang", "String", "valueOf", "(int)", "manual"] # taint-numeric + - ["java.lang", "String", "valueOf", "(long)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.lang.reflect.model.yml b/java/ql/lib/ext/java.lang.reflect.model.yml index b4f8ab4054d..97df7cde61e 100644 --- a/java/ql/lib/ext/java.lang.reflect.model.yml +++ b/java/ql/lib/ext/java.lang.reflect.model.yml @@ -4,6 +4,7 @@ extensions: extensible: summaryModel data: - ["java.lang.reflect", "Constructor", False, "newInstance", "(Object[])", "", "Argument[0].ArrayElement", "ReturnValue.Parameter", "value", "manual"] # ! unsure about input/output + - ["java.lang.reflect", "Field", False, "get", "(Object)", "", "Argument[0].Field", "ReturnValue", "value", "manual"] # ! very unsure about - ["java.lang.reflect", "Method", False, "invoke", "(Object,Object[])", "", "Argument[1].ArrayElement", "Argument[-1].Parameter[0]", "value", "manual"] # ! very unsure if this model is correct... - addsTo: diff --git a/java/ql/lib/ext/java.math.model.yml b/java/ql/lib/ext/java.math.model.yml index f071e5d4678..c80f9c87031 100644 --- a/java/ql/lib/ext/java.math.model.yml +++ b/java/ql/lib/ext/java.math.model.yml @@ -11,9 +11,14 @@ extensions: - ["java.math", "BigDecimal", "BigDecimal", "(String)", "manual"] # taint-numeric - ["java.math", "BigDecimal", "add", "(BigDecimal)", "manual"] # taint-numeric - ["java.math", "BigDecimal", "doubleValue", "()", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "intValue", "()", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "multiply", "(BigDecimal)", "manual"] # taint-numeric - ["java.math", "BigDecimal", "setScale", "(int,RoundingMode)", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "subtract", "(BigDecimal)", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "toBigInteger", "()", "manual"] # taint-numeric - ["java.math", "BigDecimal", "toString", "()", "manual"] # taint-numeric - ["java.math", "BigDecimal", "valueOf", "(double)", "manual"] # taint-numeric - ["java.math", "BigDecimal", "valueOf", "(long)", "manual"] # taint-numeric + - ["java.math", "BigInteger", "BigInteger", "(String)", "manual"] # taint-numeric - ["java.math", "BigInteger", "or", "(BigInteger)", "manual"] # taint-numeric - ["java.math", "BigInteger", "valueOf", "(long)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.nio.file.model.yml b/java/ql/lib/ext/java.nio.file.model.yml index b2ad2e0660a..690121f849d 100644 --- a/java/ql/lib/ext/java.nio.file.model.yml +++ b/java/ql/lib/ext/java.nio.file.model.yml @@ -44,7 +44,9 @@ extensions: - ["java.nio.file", "FileSystem", True, "getPathMatcher", "(String)", "", "Argument[0]", "ReturnValue", "taint", "ai-generated"] - ["java.nio.file", "FileSystem", True, "getRootDirectories", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.nio.file", "Path", True, "getParent", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + # ! should Path have subtyping of False for all methods instead? Why is `toFile` different? - ["java.nio.file", "Path", True, "normalize", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["java.nio.file", "Path", False, "getFileName", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] # ! maybe need more field flow? - ["java.nio.file", "Path", True, "of", "(String,String[])", "", "Argument[0]", "ReturnValue", "taint", "ai-generated"] - ["java.nio.file", "Path", True, "of", "(String,String[])", "", "Argument[1]", "ReturnValue", "taint", "ai-generated"] - ["java.nio.file", "Path", True, "of", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "ai-generated"] diff --git a/java/ql/lib/ext/java.nio.model.yml b/java/ql/lib/ext/java.nio.model.yml index 1192599f762..cc90940c122 100644 --- a/java/ql/lib/ext/java.nio.model.yml +++ b/java/ql/lib/ext/java.nio.model.yml @@ -11,5 +11,6 @@ extensions: pack: codeql/java-all extensible: neutralModel data: + - ["java.nio", "Buffer", "position", "()", "manual"] # ! maybe should be summary? - ["java.nio", "Buffer", "remaining", "()", "manual"] - ["java.nio", "ByteBuffer", "allocate", "(int)", "manual"] diff --git a/java/ql/lib/ext/java.sql.model.yml b/java/ql/lib/ext/java.sql.model.yml index 6a801095c4f..47874a3333d 100644 --- a/java/ql/lib/ext/java.sql.model.yml +++ b/java/ql/lib/ext/java.sql.model.yml @@ -24,16 +24,20 @@ extensions: - ["java.sql", "PreparedStatement", True, "executeQuery", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] # ! this should maybe be a neutral model, not sure if this really counts as "flow through"... - ["java.sql", "PreparedStatement", True, "setString", "(int,String)", "", "Argument[1]", "Argument[this]", "value", "manual"] - ["java.sql", "ResultSet", True, "getString", "(String)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["java.sql", "ResultSet", True, "getTimestamp", "(String)", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - addsTo: pack: codeql/java-all extensible: neutralModel data: + - ["java.sql", "Connection", "createStatement", "()", "manual"] - ["java.sql", "PreparedStatement", "executeUpdate", "()", "manual"] - ["java.sql", "ResultSet", "next", "()", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - ["java.sql", "PreparedStatement", "setInt", "(int,int)", "manual"] # value-numeric - ["java.sql", "PreparedStatement", "setLong", "(int,long)", "manual"] # value-numeric + - ["java.sql", "ResultSet", "getInt", "(int)", "manual"] # taint-numeric - ["java.sql", "ResultSet", "getInt", "(String)", "manual"] # taint-numeric - ["java.sql", "ResultSet", "getLong", "(String)", "manual"] # taint-numeric - ["java.sql", "ResultSet", "getString", "(int)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.text.model.yml b/java/ql/lib/ext/java.text.model.yml index b2237825e5a..4056b4d0c7a 100644 --- a/java/ql/lib/ext/java.text.model.yml +++ b/java/ql/lib/ext/java.text.model.yml @@ -4,6 +4,7 @@ extensions: extensible: summaryModel data: - ["java.text", "DateFormat", True, "parse", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! maybe not interesting flow and should be neutral model? + - ["java.text", "Format", True, "format", "(Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! would cover DateFormat.format below through subtyping... - ["java.text", "MessageFormat", False, "format", "(String,Object[])", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! not sure I did this right - ["java.text", "MessageFormat", False, "format", "(String,Object[])", "", "Argument[1].ArrayElement", "ReturnValue", "taint", "manual"] # ! not sure I did this right diff --git a/java/ql/lib/ext/java.time.format.model.yml b/java/ql/lib/ext/java.time.format.model.yml index 8d782400089..083e811ebb9 100644 --- a/java/ql/lib/ext/java.time.format.model.yml +++ b/java/ql/lib/ext/java.time.format.model.yml @@ -3,4 +3,5 @@ extensions: pack: codeql/java-all extensible: summaryModel data: + - ["java.time.format", "DateTimeFormatter", False, "format", "(TemporalAccessor)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! neutral? - ["java.time.format", "DateTimeFormatter", False, "ofPattern", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! neutral? diff --git a/java/ql/lib/ext/java.time.model.yml b/java/ql/lib/ext/java.time.model.yml index 8298b25ee3b..456c1d593a0 100644 --- a/java/ql/lib/ext/java.time.model.yml +++ b/java/ql/lib/ext/java.time.model.yml @@ -4,6 +4,8 @@ extensions: extensible: summaryModel data: - ["java.time", "Duration", False, "ofSeconds", "(long)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! maybe not interesting flow and should be neutral model? + - ["java.time", "Instant", False, "parse", "(CharSequence)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! mmaybe should be neutral since time-related? + - ["java.time", "LocalDate", False, "parse", "(CharSequence)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - addsTo: pack: codeql/java-all @@ -14,12 +16,15 @@ extensions: - ["java.time", "LocalDateTime", "now", "()", "manual"] - ["java.time", "ZonedDateTime", "now", "()", "manual"] - ["java.time", "ZoneId", "of", "(String)", "manual"] + - ["java.time", "ZoneId", "systemDefault", "()", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - ["java.time", "Duration", "ofMillis", "(long)", "manual"] # taint-numeric - ["java.time", "Duration", "ofMinutes", "(long)", "manual"] # taint-numeric - ["java.time", "Duration", "toMillis", "()", "manual"] # taint-numeric + - ["java.time", "Instant", "ofEpochMilli", "(long)", "manual"] # taint-numeric - ["java.time", "Instant", "toEpochMilli", "()", "manual"] # taint-numeric + - ["java.time", "LocalDate", "plusDays", "(long)", "manual"] # taint-numeric - ["java.time", "LocalDate", "of", "(int,int,int)", "manual"] # taint-numeric - ["java.time", "LocalDateTime", "of", "(int,int,int,int,int,int)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.util.concurrent.atomic.model.yml b/java/ql/lib/ext/java.util.concurrent.atomic.model.yml index f6a0edc2b63..b2da86b1aa5 100644 --- a/java/ql/lib/ext/java.util.concurrent.atomic.model.yml +++ b/java/ql/lib/ext/java.util.concurrent.atomic.model.yml @@ -12,6 +12,7 @@ extensions: extensible: neutralModel data: - ["java.util.concurrent.atomic", "AtomicBoolean", "AtomicBoolean", "(boolean)", "manual"] + - ["java.util.concurrent.atomic", "AtomicBoolean", "compareAndSet", "(boolean,boolean)", "manual"] - ["java.util.concurrent.atomic", "AtomicBoolean", "get", "()", "manual"] - ["java.util.concurrent.atomic", "AtomicBoolean", "set", "(boolean)", "manual"] @@ -23,3 +24,4 @@ extensions: - ["java.util.concurrent.atomic", "AtomicLong", "AtomicLong", "(long)", "manual"] # value-numeric # ! this is supposedly already supported per the telemetry query, LOOK INTO WHY/HOW - ["java.util.concurrent.atomic", "AtomicLong", "addAndGet", "(long)", "manual"] # taint-numeric - ["java.util.concurrent.atomic", "AtomicLong", "get", "()", "manual"] # value-numeric + - ["java.util.concurrent.atomic", "AtomicLong", "incrementAndGet", "()", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.util.concurrent.locks.model.yml b/java/ql/lib/ext/java.util.concurrent.locks.model.yml index 0a248e01262..54a86493fc1 100644 --- a/java/ql/lib/ext/java.util.concurrent.locks.model.yml +++ b/java/ql/lib/ext/java.util.concurrent.locks.model.yml @@ -3,4 +3,5 @@ extensions: pack: codeql/java-all extensible: neutralModel data: + - ["java.util.concurrent.locks", "Lock", "lock", "()", "manual"] - ["java.util.concurrent.locks", "Lock", "unlock", "()", "manual"] diff --git a/java/ql/lib/ext/java.util.concurrent.model.yml b/java/ql/lib/ext/java.util.concurrent.model.yml index 8fdd29bb262..c5598039074 100644 --- a/java/ql/lib/ext/java.util.concurrent.model.yml +++ b/java/ql/lib/ext/java.util.concurrent.model.yml @@ -21,7 +21,9 @@ extensions: - ["java.util.concurrent", "CompletableFuture", False, "completedFuture", "(Object)", "", "Argument[0]", "ReturnValue.SyntheticField[java.util.concurrent.CompletableFuture.value]", "value", "manual"] - ["java.util.concurrent", "CompletableFuture", False, "get", "()", "", "Argument[-1].SyntheticField[java.util.concurrent.CompletableFuture.value]", "ReturnValue", "value", "manual"] # ! not sure if using SyntheticField is correct here; also, should prbly remove this for `Future.get` below's subtyping to handle. - ["java.util.concurrent", "CompletableFuture", False, "join", "()", "", "Argument[-1].SyntheticField[java.util.concurrent.CompletableFuture.value]", "ReturnValue", "value", "manual"] # ! not sure if using SyntheticField is correct here + - ["java.util.concurrent", "CompletionStage", False, "toCompletableFuture", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - ["java.util.concurrent", "ConcurrentHashMap", True, "elements", "()", "", "Argument[this].MapValue", "ReturnValue.Element", "value", "manual"] + - ["java.util.concurrent", "ExecutorService", True, "submit", "(Runnable)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.util.concurrent", "Future", True, "get", "()", "", "Argument[-1].SyntheticField[java.util.concurrent.Future.value]", "ReturnValue", "value", "manual"] # ! not sure if using SyntheticField is correct here - ["java.util.concurrent", "TransferQueue", True, "transfer", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util.concurrent", "TransferQueue", True, "tryTransfer", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] @@ -32,9 +34,12 @@ extensions: extensible: neutralModel data: - ["java.util.concurrent", "CompletableFuture", "completeExceptionally", "(Throwable)", "manual"] # ! summary? + - ["java.util.concurrent", "CompletableFuture", "isDone", "()", "manual"] + - ["java.util.concurrent", "CountDownLatch", "await", "()", "manual"] # ! combine with below, "" as signature - ["java.util.concurrent", "CountDownLatch", "await", "(long,TimeUnit)", "manual"] - ["java.util.concurrent", "CountDownLatch", "countDown", "()", "manual"] - ["java.util.concurrent", "Executor", "execute", "(Runnable)", "manual"] + - ["java.util.concurrent", "ExecutorService", "shutdown", "()", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. diff --git a/java/ql/lib/ext/java.util.function.model.yml b/java/ql/lib/ext/java.util.function.model.yml index d81882b70c0..d28b699f1b8 100644 --- a/java/ql/lib/ext/java.util.function.model.yml +++ b/java/ql/lib/ext/java.util.function.model.yml @@ -10,4 +10,5 @@ extensions: extensible: neutralModel data: - ["java.util.function", "BiConsumer", "accept", "(Object,Object)", "manual"] # ! remove this model? + - ["java.util.function", "BiFunction", "apply", "(Object,Object)", "manual"] # ! remove this model? - ["java.util.function", "Function", "identity", "()", "manual"] # ! remove this model? diff --git a/java/ql/lib/ext/java.util.model.yml b/java/ql/lib/ext/java.util.model.yml index 8df603bfdda..6cd77031325 100644 --- a/java/ql/lib/ext/java.util.model.yml +++ b/java/ql/lib/ext/java.util.model.yml @@ -124,6 +124,7 @@ extensions: - ["java.util", "EnumMap", False, "EnumMap", "(Map)", "", "Argument[0].MapValue", "Argument[this].MapValue", "value", "manual"] - ["java.util", "Enumeration", True, "asIterator", "", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - ["java.util", "Enumeration", True, "nextElement", "", "", "Argument[this].Element", "ReturnValue", "value", "manual"] + - ["java.util", "EventObject", True, "getSource", "()", "", "Argument[-1].Field[java.util.EventObject.source]", "ReturnValue", "value", "manual"] # ! double-check - ["java.util", "HashMap", False, "HashMap", "(Map)", "", "Argument[0].MapKey", "Argument[this].MapKey", "value", "manual"] - ["java.util", "HashMap", False, "HashMap", "(Map)", "", "Argument[0].MapValue", "Argument[this].MapValue", "value", "manual"] - ["java.util", "HashSet", False, "HashSet", "(Collection)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"] @@ -160,6 +161,7 @@ extensions: - ["java.util", "ListIterator", True, "add", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util", "ListIterator", True, "previous", "", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - ["java.util", "ListIterator", True, "set", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] + - ["java.util", "Locale", False, "forLanguageTag", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! neutral? - ["java.util", "Map", True, "computeIfAbsent", "", "", "Argument[this].MapValue", "ReturnValue", "value", "manual"] - ["java.util", "Map", True, "computeIfAbsent", "", "", "Argument[1].ReturnValue", "Argument[this].MapValue", "value", "manual"] - ["java.util", "Map", True, "computeIfAbsent", "", "", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] @@ -377,11 +379,14 @@ extensions: - ["java.util", "Collections", "emptyList", "()", "manual"] - ["java.util", "Collections", "emptyMap", "()", "manual"] - ["java.util", "Collections", "emptySet", "()", "manual"] + - ["java.util", "Collections", "sort", "(List)", "manual"] # ! summary model instead? - ["java.util", "Collections", "sort", "(List,Comparator)", "manual"] # ! summary model instead? - ["java.util", "Comparator", "comparing", "(Function)", "manual"] # ! seems complex (functional interface), should maybe not have any model? - ["java.util", "Enumeration", "hasMoreElements", "()", "manual"] - ["java.util", "HashMap", "containsKey", "(Object)", "manual"] - ["java.util", "HashMap", "HashMap", "(int)", "manual"] + - ["java.util", "HashMap", "size", "()", "manual"] + - ["java.util", "HashSet", "HashSet", "(int)", "manual"] - ["java.util", "Iterator", "hasNext", "()", "manual"] - ["java.util", "Iterator", "remove", "()", "manual"] # ! WithoutElement comment? (double-check if it returns anything, etc.) - ["java.util", "List", "contains", "(Object)", "manual"] @@ -408,9 +413,12 @@ extensions: - ["java.util", "Set", "contains", "(Object)", "manual"] - ["java.util", "Set", "isEmpty", "()", "manual"] - ["java.util", "Set", "remove", "(Object)", "manual"] # ! WithoutElement comment? (double-check if it returns anything, etc.) + - ["java.util", "Set", "removeAll", "(Collection)", "manual"] # ! WithoutElement comment? (double-check if it returns anything, etc.) - ["java.util", "Set", "size", "()", "manual"] + - ["java.util", "UUID", "equals", "(Object)", "manual"] - ["java.util", "UUID", "randomUUID", "()", "manual"] - ["java.util", "UUID", "toString", "()", "manual"] + - ["java.util", "TimeZone", "getTimeZone", "(String)", "manual"] - ["java.util", "Vector", "size", "()", "manual"] # The below APIs are currently being stored as neutral models since `WithoutElement` has not yet been implemented for Java. @@ -421,9 +429,13 @@ extensions: # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. + - ["java.util", "Calendar", "add", "(int,int)", "manual"] # taint-numeric - ["java.util", "Calendar", "get", "(int)", "manual"] # value-numeric - ["java.util", "Calendar", "getTime", "()", "manual"] # taint-numeric - ["java.util", "Calendar", "getTimeInMillis", "()", "manual"] # taint-numeric - ["java.util", "Calendar", "set", "(int,int)", "manual"] # value-numeric + - ["java.util", "Calendar", "setTime", "(Date)", "manual"] # taint-numeric - ["java.util", "Date", "Date", "(long)", "manual"] # taint-numeric - ["java.util", "Date", "getTime", "()", "manual"] # taint-numeric + - ["java.util", "Date", "from", "(Instant)", "manual"] # taint-numeric + - ["java.util", "Date", "toInstant", "()", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.util.stream.model.yml b/java/ql/lib/ext/java.util.stream.model.yml index 01786c37b7e..f6a37dcd4ee 100644 --- a/java/ql/lib/ext/java.util.stream.model.yml +++ b/java/ql/lib/ext/java.util.stream.model.yml @@ -9,8 +9,8 @@ extensions: - ["java.util.stream", "BaseStream", True, "sequential", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - ["java.util.stream", "BaseStream", True, "spliterator", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - ["java.util.stream", "BaseStream", True, "unordered", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - - ["java.util.stream", "IntStream", False, "range", "(int,int)", "", "Argument[0..1]", "ReturnValue.Element", "value", "manual"] # ! this one is a bit odd, is it correct to have it as a summary model? - - ["java.util.stream", "Stream", True, "allMatch", "(Predicate)", "", "Argument[this].Element", "Argument[0].Parameter[0]", "value", "manual"] + - ["java.util.stream", "IntStream", False, "range", "(int,int)", "", "Argument[0..1]", "ReturnValue.Element", "value", "manual"] # ! this one is a bit odd, is it correct to have it as a summary model?; not interesting because Int stream?=neutral? + - ["java.util.stream", "Stream", True, "allMatch", "(Predicate)", "", "Argument[this].Element", "Argument[0].Parameter[0]", "value", "manual"] # ! neutral instead? - ["java.util.stream", "Stream", True, "anyMatch", "(Predicate)", "", "Argument[this].Element", "Argument[0].Parameter[0]", "value", "manual"] - ["java.util.stream", "Stream", True, "collect", "(Supplier,BiConsumer,BiConsumer)", "", "Argument[this].Element", "Argument[1].Parameter[1]", "value", "manual"] - ["java.util.stream", "Stream", True, "collect", "(Supplier,BiConsumer,BiConsumer)", "", "Argument[0].ReturnValue", "Argument[1].Parameter[0]", "value", "manual"] @@ -95,4 +95,5 @@ extensions: data: - ["java.util.stream", "Collectors", "toList", "()", "manual"] - ["java.util.stream", "Collectors", "toSet", "()", "manual"] + - ["java.util.stream", "IntStream", "mapToObj", "(IntFunction)", "manual"] - ["java.util.stream", "Stream", "count", "()", "manual"] From 275634e907e183d24f329e45d7f0fe6b217fc386 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Tue, 17 Jan 2023 16:44:52 -0500 Subject: [PATCH 118/143] Java: remove apis with ObjectString param type --- java/ql/test/ext/TopJdkApis/TopJdkApis.qll | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/java/ql/test/ext/TopJdkApis/TopJdkApis.qll b/java/ql/test/ext/TopJdkApis/TopJdkApis.qll index 8f71c8a88f3..2ec75f59c20 100644 --- a/java/ql/test/ext/TopJdkApis/TopJdkApis.qll +++ b/java/ql/test/ext/TopJdkApis/TopJdkApis.qll @@ -228,9 +228,9 @@ predicate topJdkApiName(string apiName) { "java.io.DataInput#readLong()", "java.util.Collections#sort(List)", "java.io.DataOutput#writeLong(long)", "java.util.function.BiFunction#apply(Object,Object)", "java.lang.String#lastIndexOf(String)", "java.util.Optional#filter(Predicate)", - "java.lang.StringBuilder#append(ObjectString)", "java.lang.StringBuffer#append(Object)", - "java.io.File#getParentFile()", "java.util.stream.Stream#allMatch(Predicate)", - "java.sql.ResultSet#getTimestamp(String)", "java.util.Calendar#setTime(Date)", + "java.lang.StringBuffer#append(Object)", "java.io.File#getParentFile()", + "java.util.stream.Stream#allMatch(Predicate)", "java.sql.ResultSet#getTimestamp(String)", + "java.util.Calendar#setTime(Date)", "java.util.concurrent.CompletionStage#toCompletableFuture()", "java.util.concurrent.locks.Lock#lock()", "java.lang.reflect.Field#get(Object)", "java.io.InputStream#close()", "java.math.BigInteger#BigInteger(String)", @@ -240,8 +240,7 @@ predicate topJdkApiName(string apiName) { "java.lang.AbstractStringBuilder#setLength(int)", "java.nio.Buffer#position()", "java.nio.file.Path#getFileName()", "java.util.List#toArray()", "java.lang.CharSequence#length()", "java.util.stream.Stream#distinct()", - "java.lang.String#format(ObjectString,Object[])", "java.net.URL#toURI()", - "java.util.Queue#poll()", "java.lang.Thread#getContextClassLoader()", + "java.net.URL#toURI()", "java.util.Queue#poll()", "java.lang.Thread#getContextClassLoader()", "java.lang.String#valueOf(boolean)", "java.util.Calendar#add(int,int)", "java.util.HashMap#entrySet()", "java.util.stream.IntStream#mapToObj(IntFunction)", "java.util.concurrent.atomic.AtomicLong#incrementAndGet()", From 17e09203250eae4b5fabd97bc747ed9283ecc1f2 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Thu, 23 Mar 2023 18:00:14 -0400 Subject: [PATCH 119/143] Java: resolve more conflicts --- java/ql/lib/ext/java.awt.model.yml | 3 +- java/ql/lib/ext/java.io.model.yml | 11 +- java/ql/lib/ext/java.lang.model.yml | 48 ++++--- java/ql/lib/ext/java.lang.reflect.model.yml | 13 +- java/ql/lib/ext/java.math.model.yml | 6 +- java/ql/lib/ext/java.nio.charset.model.yml | 4 +- java/ql/lib/ext/java.nio.file.model.yml | 3 +- java/ql/lib/ext/java.nio.model.yml | 2 +- java/ql/lib/ext/java.sql.model.yml | 6 +- java/ql/lib/ext/java.text.model.yml | 8 +- java/ql/lib/ext/java.time.chrono.model.yml | 4 +- java/ql/lib/ext/java.time.format.model.yml | 6 +- java/ql/lib/ext/java.time.model.yml | 11 +- .../ext/java.util.concurrent.atomic.model.yml | 2 +- .../ql/lib/ext/java.util.concurrent.model.yml | 14 +- java/ql/lib/ext/java.util.function.model.yml | 4 +- java/ql/lib/ext/java.util.logging.model.yml | 3 +- java/ql/lib/ext/java.util.model.yml | 26 ++-- java/ql/lib/ext/java.util.stream.model.yml | 9 +- java/ql/test/ext/TestModels/Test.java | 124 +++++++++++++++++- java/ql/test/ext/TopJdkApis/TopJdkApis.qll | 6 +- .../ext/TopJdkApis/TopJdkApisTest.expected | 3 + 22 files changed, 214 insertions(+), 102 deletions(-) diff --git a/java/ql/lib/ext/java.awt.model.yml b/java/ql/lib/ext/java.awt.model.yml index 30cabdcf8e5..40b8b196e8f 100644 --- a/java/ql/lib/ext/java.awt.model.yml +++ b/java/ql/lib/ext/java.awt.model.yml @@ -3,7 +3,8 @@ extensions: pack: codeql/java-all extensible: summaryModel data: - - ["java.awt", "Container", True, "add", "(Component)", "", "Argument[0]", "Argument[-1].Element", "value", "manual"] # ! signature as "" instead? + - ["java.awt", "Container", True, "add", "(Component)", "", "Argument[0]", "Argument[-1].Element", "value", "manual"] + - ["java.awt", "Container", True, "add", "(Component)", "", "Argument[0]", "ReturnValue", "value", "manual"] - ["java.awt", "Container", True, "add", "(Component,Object)", "", "Argument[0]", "Argument[-1].Element", "value", "manual"] - addsTo: diff --git a/java/ql/lib/ext/java.io.model.yml b/java/ql/lib/ext/java.io.model.yml index 4c500236fa0..eed26f37299 100644 --- a/java/ql/lib/ext/java.io.model.yml +++ b/java/ql/lib/ext/java.io.model.yml @@ -69,7 +69,9 @@ extensions: - ["java.io", "File", True, "getCanonicalFile", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "getCanonicalPath", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "getName", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["java.io", "File", False, "getPath", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] # ! True versus False (maybe it's private/hidden?).. (and neutral instead?) + - ["java.io", "File", True, "getParentFile", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["java.io", "File", True, "getPath", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["java.io", "File", True, "listFiles", "()", "", "Argument[-1]", "ReturnValue.ArrayElement", "taint", "manual"] - ["java.io", "File", True, "toPath", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "toString", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "toURI", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] @@ -90,7 +92,7 @@ extensions: - ["java.io", "OutputStream", True, "write", "(int)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.io", "Reader", True, "read", "", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["java.io", "StringReader", False, "StringReader", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - - ["java.io", "StringWriter", False, "toString", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] # ! currently supported by taintPreservingQualifierToMethod? + - ["java.io", "StringWriter", False, "toString", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] # ! keep an eye on this one for FP flow, already modeled in `taintPreservingQualifierToMethod` predicate? - ["java.io", "UncheckedIOException", False, "UncheckedIOException", "(IOException)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.Throwable.cause]", "value", "manual"] - ["java.io", "Writer", True, "write", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - addsTo: @@ -98,16 +100,15 @@ extensions: extensible: neutralModel data: - ["java.io", "Closeable", "close", "()", "manual"] + - ["java.io", "DataOutput", "writeBoolean", "(boolean)", "manual"] - ["java.io", "File", "delete", "()", "manual"] - ["java.io", "File", "exists", "()", "manual"] - - ["java.io", "File", "getParentFile", "()", "manual"] # ! little unsure about this as a neutral - ["java.io", "File", "isFile", "()", "manual"] - ["java.io", "File", "length", "()", "manual"] - - ["java.io", "File", "listFiles", "()", "manual"] # ! little unsure about this as a neutral - ["java.io", "File", "isDirectory", "()", "manual"] - ["java.io", "File", "mkdirs", "()", "manual"] - ["java.io", "InputStream", "close", "()", "manual"] - - ["java.io", "OutputStream", "flush", "()", "manual"] # ! little unsure about this as a neutral, but not sure how to represent output if summary model... + - ["java.io", "OutputStream", "flush", "()", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. diff --git a/java/ql/lib/ext/java.lang.model.yml b/java/ql/lib/ext/java.lang.model.yml index 6a581ff12a6..7cfc9ce68bc 100644 --- a/java/ql/lib/ext/java.lang.model.yml +++ b/java/ql/lib/ext/java.lang.model.yml @@ -108,30 +108,33 @@ extensions: - ["java.lang", "String", False, "valueOf", "(char)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.lang", "String", False, "valueOf", "(char[])", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.lang", "String", False, "valueOf", "(char[],int,int)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - # ! why do below have subtype=True for constructors? - ["java.lang", "StringBuffer", True, "StringBuffer", "(CharSequence)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "StringBuffer", True, "StringBuffer", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "StringBuilder", True, "StringBuilder", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "StringBuilder", False, "delete", "(int,int)", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - ["java.lang", "System", False, "arraycopy", "", "", "Argument[0]", "Argument[2]", "taint", "manual"] - - ["java.lang", "System", False, "getenv", "(String)", "", "Argument[-1].MapValue", "ReturnValue", "value", "manual"] # ! neutral instead? - - ["java.lang", "System", False, "getenv", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! really unsure about this...; neutral instead? -- or unmodelled - - ["java.lang", "Thread", False, "Thread", "(Runnable)", "", "Argument[0]", "Argument[-1]", "taint", "manual"] # ! neutral instead? + - ["java.lang", "Thread", False, "Thread", "(Runnable)", "", "Argument[0]", "Argument[-1]", "taint", "manual"] + - ["java.lang", "Thread", False, "Thread", "(String)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.Thread.name]", "value", "manual"] - ["java.lang", "Thread", True, "getName", "()", "", "Argument[-1].SyntheticField[java.lang.Thread.name]", "ReturnValue", "value", "manual"] - - ["java.lang", "ThreadLocal", True, "get", "()", "", "Argument[-1].SyntheticField[java.lang.ThreadLocal.value]", "ReturnValue", "value", "manual"] # ! not sure if this model is correct, and if should be neutral model instead + - ["java.lang", "ThreadLocal", True, "get", "()", "", "Argument[-1].SyntheticField[java.lang.ThreadLocal.value]", "ReturnValue", "value", "manual"] + - ["java.lang", "ThreadLocal", True, "set", "(Object)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.ThreadLocal.value]", "value", "manual"] - ["java.lang", "Throwable", False, "Throwable", "(Throwable)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "value", "manual"] + - ["java.lang", "Throwable", False, "Throwable", "(String)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "Throwable", True, "getCause", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "ReturnValue", "value", "manual"] - ["java.lang", "Throwable", True, "getMessage", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "value", "manual"] - - ["java.lang", "Throwable", True, "getLocalizedMessage", "()", "", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "value", "manual"] # ! should the field used be different? - - ["java.lang", "Throwable", True, "toString", "()", "", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "taint", "manual"] # ! little unsure about this one... + - ["java.lang", "Throwable", True, "getLocalizedMessage", "()", "", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "value", "manual"] + - ["java.lang", "Throwable", True, "toString", "()", "", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "taint", "manual"] # ! watch for FPs + - addsTo: pack: codeql/java-all extensible: neutralModel data: - ["java.lang", "AbstractStringBuilder", "length", "()", "manual"] - - ["java.lang", "AbstractStringBuilder", "setCharAt", "(int,char)", "manual"] # ! char manipulation not interesting? (or interesting since could set many chars... prbly switch to summary model) - - ["java.lang", "AbstractStringBuilder", "setLength", "(int)", "manual"] # ! summary? + - ["java.lang", "AbstractStringBuilder", "setCharAt", "(int,char)", "manual"] + - ["java.lang", "AbstractStringBuilder", "setLength", "(int)", "manual"] + - ["java.lang", "Boolean", "booleanValue", "()", "manual"] - ["java.lang", "Boolean", "equals", "(Object)", "manual"] + - ["java.lang", "Boolean", "parseBoolean", "(String)", "manual"] - ["java.lang", "Boolean", "valueOf", "(boolean)", "manual"] - ["java.lang", "CharSequence", "length", "()", "manual"] - ["java.lang", "Class", "forName", "(String)", "manual"] @@ -179,18 +182,17 @@ extensions: - ["java.lang", "String", "valueOf", "(boolean)", "manual"] - ["java.lang", "System", "currentTimeMillis", "()", "manual"] - ["java.lang", "System", "exit", "(int)", "manual"] + - ["java.lang", "System", "getenv", "(String)", "manual"] - ["java.lang", "System", "identityHashCode", "(Object)", "manual"] - - ["java.lang", "System", "lineSeparator", "()", "manual"] # ! double-check... + - ["java.lang", "System", "lineSeparator", "()", "manual"] - ["java.lang", "System", "nanoTime", "()", "manual"] - ["java.lang", "Thread", "currentThread", "()", "manual"] - - ["java.lang", "Thread", "getContextClassLoader", "()", "manual"] # ! summary instead? + - ["java.lang", "Thread", "getContextClassLoader", "()", "manual"] - ["java.lang", "Thread", "interrupt", "()", "manual"] - ["java.lang", "Thread", "sleep", "(long)", "manual"] - ["java.lang", "Thread", "start", "()", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - - ["java.lang", "Boolean", "booleanValue", "()", "manual"] # taint-numeric - - ["java.lang", "Boolean", "parseBoolean", "(String)", "manual"] # taint-numeric - ["java.lang", "Double", "doubleToLongBits", "(double)", "manual"] # taint-numeric - ["java.lang", "Double", "parseDouble", "(String)", "manual"] # taint-numeric - ["java.lang", "Double", "valueOf", "(double)", "manual"] # taint-numeric @@ -198,23 +200,17 @@ extensions: - ["java.lang", "Integer", "intValue", "()", "manual"] # taint-numeric - ["java.lang", "Integer", "parseInt", "(String)", "manual"] # taint-numeric - ["java.lang", "Integer", "toHexString", "(int)", "manual"] # taint-numeric - - ["java.lang", "Integer", "toString", "()", "manual"] # taint-numeric - - ["java.lang", "Integer", "toString", "(int)", "manual"] # taint-numeric - - ["java.lang", "Integer", "valueOf", "(int)", "manual"] # taint-numeric - - ["java.lang", "Integer", "valueOf", "(String)", "manual"] # taint-numeric # ! should probably make this and others like it have a "" signature instead... + - ["java.lang", "Integer", "toString", "", "manual"] # taint-numeric + - ["java.lang", "Integer", "valueOf", "", "manual"] # taint-numeric - ["java.lang", "Long", "Long", "(long)", "manual"] # taint-numeric - ["java.lang", "Long", "intValue", "()", "manual"] # taint-numeric - ["java.lang", "Long", "longValue", "()", "manual"] # taint-numeric - ["java.lang", "Long", "parseLong", "(String)", "manual"] # taint-numeric - - ["java.lang", "Long", "toString", "()", "manual"] # taint-numeric - - ["java.lang", "Long", "toString", "(long)", "manual"] # taint-numeric - - ["java.lang", "Long", "valueOf", "(long)", "manual"] # taint-numeric - - ["java.lang", "Long", "valueOf", "(String)", "manual"] # taint-numeric - - ["java.lang", "Math", "max", "(int,int)", "manual"] # value-numeric - - ["java.lang", "Math", "max", "(long,long)", "manual"] # value-numeric - - ["java.lang", "Math", "min", "(int,int)", "manual"] # value-numeric - - ["java.lang", "Math", "min", "(long,long)", "manual"] # value-numeric - - ["java.lang", "Number", "doubleValue", "()", "manual"] # taint-numeric # ! remove others that could rely on subtyping through Number instead? (e.g. Double, Integer, etc.) + - ["java.lang", "Long", "toString", "", "manual"] # taint-numeric + - ["java.lang", "Long", "valueOf", "", "manual"] # taint-numeric + - ["java.lang", "Math", "max", "", "manual"] # value-numeric + - ["java.lang", "Math", "min", "", "manual"] # value-numeric + - ["java.lang", "Number", "doubleValue", "()", "manual"] # taint-numeric - ["java.lang", "Number", "intValue", "()", "manual"] # taint-numeric - ["java.lang", "Number", "longValue", "()", "manual"] # taint-numeric - ["java.lang", "String", "valueOf", "(int)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.lang.reflect.model.yml b/java/ql/lib/ext/java.lang.reflect.model.yml index 97df7cde61e..a709a0fc8b6 100644 --- a/java/ql/lib/ext/java.lang.reflect.model.yml +++ b/java/ql/lib/ext/java.lang.reflect.model.yml @@ -1,14 +1,9 @@ extensions: - - addsTo: - pack: codeql/java-all - extensible: summaryModel - data: - - ["java.lang.reflect", "Constructor", False, "newInstance", "(Object[])", "", "Argument[0].ArrayElement", "ReturnValue.Parameter", "value", "manual"] # ! unsure about input/output - - ["java.lang.reflect", "Field", False, "get", "(Object)", "", "Argument[0].Field", "ReturnValue", "value", "manual"] # ! very unsure about - - ["java.lang.reflect", "Method", False, "invoke", "(Object,Object[])", "", "Argument[1].ArrayElement", "Argument[-1].Parameter[0]", "value", "manual"] # ! very unsure if this model is correct... - - addsTo: pack: codeql/java-all extensible: neutralModel data: - - ["java.lang.reflect", "Method", "getName", "()", "manual"] # ! seems uninteresting flow to me, but maybe double-check + - ["java.lang.reflect", "Constructor", "newInstance", "(Object[])", "manual"] + - ["java.lang.reflect", "Field", "get", "(Object)", "manual"] + - ["java.lang.reflect", "Method", "getName", "()", "manual"] + - ["java.lang.reflect", "Method", "invoke", "(Object,Object[])", "manual"] diff --git a/java/ql/lib/ext/java.math.model.yml b/java/ql/lib/ext/java.math.model.yml index c80f9c87031..b3ee529339f 100644 --- a/java/ql/lib/ext/java.math.model.yml +++ b/java/ql/lib/ext/java.math.model.yml @@ -7,8 +7,7 @@ extensions: # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - - ["java.math", "BigDecimal", "BigDecimal", "(int)", "manual"] # taint-numeric - - ["java.math", "BigDecimal", "BigDecimal", "(String)", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "BigDecimal", "", "manual"] # taint-numeric - ["java.math", "BigDecimal", "add", "(BigDecimal)", "manual"] # taint-numeric - ["java.math", "BigDecimal", "doubleValue", "()", "manual"] # taint-numeric - ["java.math", "BigDecimal", "intValue", "()", "manual"] # taint-numeric @@ -17,8 +16,7 @@ extensions: - ["java.math", "BigDecimal", "subtract", "(BigDecimal)", "manual"] # taint-numeric - ["java.math", "BigDecimal", "toBigInteger", "()", "manual"] # taint-numeric - ["java.math", "BigDecimal", "toString", "()", "manual"] # taint-numeric - - ["java.math", "BigDecimal", "valueOf", "(double)", "manual"] # taint-numeric - - ["java.math", "BigDecimal", "valueOf", "(long)", "manual"] # taint-numeric + - ["java.math", "BigDecimal", "valueOf", "", "manual"] # taint-numeric - ["java.math", "BigInteger", "BigInteger", "(String)", "manual"] # taint-numeric - ["java.math", "BigInteger", "or", "(BigInteger)", "manual"] # taint-numeric - ["java.math", "BigInteger", "valueOf", "(long)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.nio.charset.model.yml b/java/ql/lib/ext/java.nio.charset.model.yml index e961a06256e..16e8943f99c 100644 --- a/java/ql/lib/ext/java.nio.charset.model.yml +++ b/java/ql/lib/ext/java.nio.charset.model.yml @@ -1,6 +1,6 @@ extensions: - addsTo: pack: codeql/java-all - extensible: summaryModel + extensible: neutralModel data: - - ["java.nio.charset", "Charset", False, "name", "()", "", "Argument[-1].SyntheticField[java.nio.charset.Charset.canonicalName]", "ReturnValue", "value", "manual"] + - ["java.nio.charset", "Charset", "name", "()", "manual"] diff --git a/java/ql/lib/ext/java.nio.file.model.yml b/java/ql/lib/ext/java.nio.file.model.yml index 690121f849d..ce955985e28 100644 --- a/java/ql/lib/ext/java.nio.file.model.yml +++ b/java/ql/lib/ext/java.nio.file.model.yml @@ -44,9 +44,8 @@ extensions: - ["java.nio.file", "FileSystem", True, "getPathMatcher", "(String)", "", "Argument[0]", "ReturnValue", "taint", "ai-generated"] - ["java.nio.file", "FileSystem", True, "getRootDirectories", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.nio.file", "Path", True, "getParent", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - # ! should Path have subtyping of False for all methods instead? Why is `toFile` different? - ["java.nio.file", "Path", True, "normalize", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["java.nio.file", "Path", False, "getFileName", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] # ! maybe need more field flow? + - ["java.nio.file", "Path", True, "getFileName", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - ["java.nio.file", "Path", True, "of", "(String,String[])", "", "Argument[0]", "ReturnValue", "taint", "ai-generated"] - ["java.nio.file", "Path", True, "of", "(String,String[])", "", "Argument[1]", "ReturnValue", "taint", "ai-generated"] - ["java.nio.file", "Path", True, "of", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "ai-generated"] diff --git a/java/ql/lib/ext/java.nio.model.yml b/java/ql/lib/ext/java.nio.model.yml index cc90940c122..d64d4809c5c 100644 --- a/java/ql/lib/ext/java.nio.model.yml +++ b/java/ql/lib/ext/java.nio.model.yml @@ -11,6 +11,6 @@ extensions: pack: codeql/java-all extensible: neutralModel data: - - ["java.nio", "Buffer", "position", "()", "manual"] # ! maybe should be summary? + - ["java.nio", "Buffer", "position", "()", "manual"] - ["java.nio", "Buffer", "remaining", "()", "manual"] - ["java.nio", "ByteBuffer", "allocate", "(int)", "manual"] diff --git a/java/ql/lib/ext/java.sql.model.yml b/java/ql/lib/ext/java.sql.model.yml index 47874a3333d..f5b15706476 100644 --- a/java/ql/lib/ext/java.sql.model.yml +++ b/java/ql/lib/ext/java.sql.model.yml @@ -21,10 +21,8 @@ extensions: extensible: summaryModel data: - ["java.sql", "Connection", True, "nativeSQL", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["java.sql", "PreparedStatement", True, "executeQuery", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] # ! this should maybe be a neutral model, not sure if this really counts as "flow through"... - ["java.sql", "PreparedStatement", True, "setString", "(int,String)", "", "Argument[1]", "Argument[this]", "value", "manual"] - ["java.sql", "ResultSet", True, "getString", "(String)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["java.sql", "ResultSet", True, "getTimestamp", "(String)", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - addsTo: pack: codeql/java-all @@ -32,7 +30,10 @@ extensions: data: - ["java.sql", "Connection", "createStatement", "()", "manual"] - ["java.sql", "PreparedStatement", "executeUpdate", "()", "manual"] + - ["java.sql", "PreparedStatement", "executeQuery", "()", "manual"] - ["java.sql", "ResultSet", "next", "()", "manual"] + - ["java.sql", "Statement", "close", "()", "manual"] + # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - ["java.sql", "PreparedStatement", "setInt", "(int,int)", "manual"] # value-numeric @@ -41,5 +42,6 @@ extensions: - ["java.sql", "ResultSet", "getInt", "(String)", "manual"] # taint-numeric - ["java.sql", "ResultSet", "getLong", "(String)", "manual"] # taint-numeric - ["java.sql", "ResultSet", "getString", "(int)", "manual"] # taint-numeric + - ["java.sql", "ResultSet", "getTimestamp", "(String)", "manual"] # taint-numeric - ["java.sql", "Timestamp", "Timestamp", "(long)", "manual"] # taint-numeric - ["java.sql", "Timestamp", "getTime", "()", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.text.model.yml b/java/ql/lib/ext/java.text.model.yml index 4056b4d0c7a..e179f9f5d6f 100644 --- a/java/ql/lib/ext/java.text.model.yml +++ b/java/ql/lib/ext/java.text.model.yml @@ -3,10 +3,9 @@ extensions: pack: codeql/java-all extensible: summaryModel data: - - ["java.text", "DateFormat", True, "parse", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! maybe not interesting flow and should be neutral model? - - ["java.text", "Format", True, "format", "(Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! would cover DateFormat.format below through subtyping... - - ["java.text", "MessageFormat", False, "format", "(String,Object[])", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! not sure I did this right - - ["java.text", "MessageFormat", False, "format", "(String,Object[])", "", "Argument[1].ArrayElement", "ReturnValue", "taint", "manual"] # ! not sure I did this right + - ["java.text", "Format", True, "format", "(Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["java.text", "MessageFormat", False, "format", "(String,Object[])", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["java.text", "MessageFormat", False, "format", "(String,Object[])", "", "Argument[1].ArrayElement", "ReturnValue", "taint", "manual"] - addsTo: pack: codeql/java-all @@ -15,4 +14,5 @@ extensions: # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - ["java.text", "DateFormat", "format", "(Date)", "manual"] # taint-numeric + - ["java.text", "DateFormat", "parse", "(String)", "manual"] # taint-numeric - ["java.text", "SimpleDateFormat", "SimpleDateFormat", "(String)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.time.chrono.model.yml b/java/ql/lib/ext/java.time.chrono.model.yml index 9dd5ca401d3..b222058d932 100644 --- a/java/ql/lib/ext/java.time.chrono.model.yml +++ b/java/ql/lib/ext/java.time.chrono.model.yml @@ -1,6 +1,6 @@ extensions: - addsTo: pack: codeql/java-all - extensible: summaryModel + extensible: neutralModel data: - - ["java.time.chrono", "ChronoZonedDateTime", False, "toInstant", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] # ! neutral? + - ["java.time.chrono", "ChronoZonedDateTime", "toInstant", "()", "manual"] diff --git a/java/ql/lib/ext/java.time.format.model.yml b/java/ql/lib/ext/java.time.format.model.yml index 083e811ebb9..5cfb255733c 100644 --- a/java/ql/lib/ext/java.time.format.model.yml +++ b/java/ql/lib/ext/java.time.format.model.yml @@ -1,7 +1,7 @@ extensions: - addsTo: pack: codeql/java-all - extensible: summaryModel + extensible: neutralModel data: - - ["java.time.format", "DateTimeFormatter", False, "format", "(TemporalAccessor)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! neutral? - - ["java.time.format", "DateTimeFormatter", False, "ofPattern", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! neutral? + - ["java.time.format", "DateTimeFormatter", "format", "(TemporalAccessor)", "manual"] + - ["java.time.format", "DateTimeFormatter", "ofPattern", "(String)", "manual"] diff --git a/java/ql/lib/ext/java.time.model.yml b/java/ql/lib/ext/java.time.model.yml index 456c1d593a0..7f12490964d 100644 --- a/java/ql/lib/ext/java.time.model.yml +++ b/java/ql/lib/ext/java.time.model.yml @@ -1,12 +1,4 @@ extensions: - - addsTo: - pack: codeql/java-all - extensible: summaryModel - data: - - ["java.time", "Duration", False, "ofSeconds", "(long)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! maybe not interesting flow and should be neutral model? - - ["java.time", "Instant", False, "parse", "(CharSequence)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! mmaybe should be neutral since time-related? - - ["java.time", "LocalDate", False, "parse", "(CharSequence)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - addsTo: pack: codeql/java-all extensible: neutralModel @@ -22,9 +14,12 @@ extensions: # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. - ["java.time", "Duration", "ofMillis", "(long)", "manual"] # taint-numeric - ["java.time", "Duration", "ofMinutes", "(long)", "manual"] # taint-numeric + - ["java.time", "Duration", "ofSeconds", "(long)", "manual"] # taint-numeric - ["java.time", "Duration", "toMillis", "()", "manual"] # taint-numeric - ["java.time", "Instant", "ofEpochMilli", "(long)", "manual"] # taint-numeric + - ["java.time", "Instant", "parse", "(CharSequence)", "manual"] # taint-numeric - ["java.time", "Instant", "toEpochMilli", "()", "manual"] # taint-numeric - ["java.time", "LocalDate", "plusDays", "(long)", "manual"] # taint-numeric - ["java.time", "LocalDate", "of", "(int,int,int)", "manual"] # taint-numeric + - ["java.time", "LocalDate", "parse", "(CharSequence)", "manual"] # taint-numeric - ["java.time", "LocalDateTime", "of", "(int,int,int,int,int,int)", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.util.concurrent.atomic.model.yml b/java/ql/lib/ext/java.util.concurrent.atomic.model.yml index b2da86b1aa5..fcfa403d5e5 100644 --- a/java/ql/lib/ext/java.util.concurrent.atomic.model.yml +++ b/java/ql/lib/ext/java.util.concurrent.atomic.model.yml @@ -21,7 +21,7 @@ extensions: - ["java.util.concurrent.atomic", "AtomicInteger", "AtomicInteger", "(int)", "manual"] # value-numeric - ["java.util.concurrent.atomic", "AtomicInteger", "get", "()", "manual"] # value-numeric - ["java.util.concurrent.atomic", "AtomicInteger", "incrementAndGet", "()", "manual"] # taint-numeric - - ["java.util.concurrent.atomic", "AtomicLong", "AtomicLong", "(long)", "manual"] # value-numeric # ! this is supposedly already supported per the telemetry query, LOOK INTO WHY/HOW + - ["java.util.concurrent.atomic", "AtomicLong", "AtomicLong", "(long)", "manual"] # value-numeric - ["java.util.concurrent.atomic", "AtomicLong", "addAndGet", "(long)", "manual"] # taint-numeric - ["java.util.concurrent.atomic", "AtomicLong", "get", "()", "manual"] # value-numeric - ["java.util.concurrent.atomic", "AtomicLong", "incrementAndGet", "()", "manual"] # taint-numeric diff --git a/java/ql/lib/ext/java.util.concurrent.model.yml b/java/ql/lib/ext/java.util.concurrent.model.yml index c5598039074..b050467260e 100644 --- a/java/ql/lib/ext/java.util.concurrent.model.yml +++ b/java/ql/lib/ext/java.util.concurrent.model.yml @@ -17,14 +17,13 @@ extensions: - ["java.util.concurrent", "BlockingQueue", True, "poll", "(long,TimeUnit)", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - ["java.util.concurrent", "BlockingQueue", True, "put", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util.concurrent", "BlockingQueue", True, "take", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - - ["java.util.concurrent", "CompletableFuture", False, "complete", "(Object)", "", "Argument[0]", "Argument[-1].SyntheticField[java.util.concurrent.CompletableFuture.value]", "value", "manual"] # ! not sure about CompleteableFuture ones - - ["java.util.concurrent", "CompletableFuture", False, "completedFuture", "(Object)", "", "Argument[0]", "ReturnValue.SyntheticField[java.util.concurrent.CompletableFuture.value]", "value", "manual"] - - ["java.util.concurrent", "CompletableFuture", False, "get", "()", "", "Argument[-1].SyntheticField[java.util.concurrent.CompletableFuture.value]", "ReturnValue", "value", "manual"] # ! not sure if using SyntheticField is correct here; also, should prbly remove this for `Future.get` below's subtyping to handle. - - ["java.util.concurrent", "CompletableFuture", False, "join", "()", "", "Argument[-1].SyntheticField[java.util.concurrent.CompletableFuture.value]", "ReturnValue", "value", "manual"] # ! not sure if using SyntheticField is correct here + - ["java.util.concurrent", "CompletableFuture", False, "complete", "(Object)", "", "Argument[0]", "Argument[-1].SyntheticField[java.util.concurrent.Future.value]", "value", "manual"] + - ["java.util.concurrent", "CompletableFuture", False, "completedFuture", "(Object)", "", "Argument[0]", "ReturnValue.SyntheticField[java.util.concurrent.Future.value]", "value", "manual"] + - ["java.util.concurrent", "CompletableFuture", False, "join", "()", "", "Argument[-1].SyntheticField[java.util.concurrent.Future.value]", "ReturnValue", "value", "manual"] - ["java.util.concurrent", "CompletionStage", False, "toCompletableFuture", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - ["java.util.concurrent", "ConcurrentHashMap", True, "elements", "()", "", "Argument[this].MapValue", "ReturnValue.Element", "value", "manual"] - ["java.util.concurrent", "ExecutorService", True, "submit", "(Runnable)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["java.util.concurrent", "Future", True, "get", "()", "", "Argument[-1].SyntheticField[java.util.concurrent.Future.value]", "ReturnValue", "value", "manual"] # ! not sure if using SyntheticField is correct here + - ["java.util.concurrent", "Future", True, "get", "()", "", "Argument[-1].SyntheticField[java.util.concurrent.Future.value]", "ReturnValue", "value", "manual"] - ["java.util.concurrent", "TransferQueue", True, "transfer", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util.concurrent", "TransferQueue", True, "tryTransfer", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util.concurrent", "TransferQueue", True, "tryTransfer", "(Object,long,TimeUnit)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] @@ -33,10 +32,9 @@ extensions: pack: codeql/java-all extensible: neutralModel data: - - ["java.util.concurrent", "CompletableFuture", "completeExceptionally", "(Throwable)", "manual"] # ! summary? + - ["java.util.concurrent", "CompletableFuture", "completeExceptionally", "(Throwable)", "manual"] - ["java.util.concurrent", "CompletableFuture", "isDone", "()", "manual"] - - ["java.util.concurrent", "CountDownLatch", "await", "()", "manual"] # ! combine with below, "" as signature - - ["java.util.concurrent", "CountDownLatch", "await", "(long,TimeUnit)", "manual"] + - ["java.util.concurrent", "CountDownLatch", "await", "", "manual"] - ["java.util.concurrent", "CountDownLatch", "countDown", "()", "manual"] - ["java.util.concurrent", "Executor", "execute", "(Runnable)", "manual"] - ["java.util.concurrent", "ExecutorService", "shutdown", "()", "manual"] diff --git a/java/ql/lib/ext/java.util.function.model.yml b/java/ql/lib/ext/java.util.function.model.yml index d28b699f1b8..8cdab4149cd 100644 --- a/java/ql/lib/ext/java.util.function.model.yml +++ b/java/ql/lib/ext/java.util.function.model.yml @@ -9,6 +9,4 @@ extensions: pack: codeql/java-all extensible: neutralModel data: - - ["java.util.function", "BiConsumer", "accept", "(Object,Object)", "manual"] # ! remove this model? - - ["java.util.function", "BiFunction", "apply", "(Object,Object)", "manual"] # ! remove this model? - - ["java.util.function", "Function", "identity", "()", "manual"] # ! remove this model? + - ["java.util.function", "Function", "identity", "()", "manual"] diff --git a/java/ql/lib/ext/java.util.logging.model.yml b/java/ql/lib/ext/java.util.logging.model.yml index 45afcb2bfa8..58f80d47c18 100644 --- a/java/ql/lib/ext/java.util.logging.model.yml +++ b/java/ql/lib/ext/java.util.logging.model.yml @@ -41,7 +41,8 @@ extensions: pack: codeql/java-all extensible: summaryModel data: - - ["java.util.logging", "Logger", False, "getLogger", "(String)", "", "Argument[0]", "ReturnValue.SyntheticField[java.util.logging.Logger.name]", "value", "manual"] # ! not sure if using SyntheticField here is correct... + - ["java.util.logging", "Logger", False, "getLogger", "(String)", "", "Argument[0]", "ReturnValue.SyntheticField[java.util.logging.Logger.name]", "value", "manual"] + - ["java.util.logging", "Logger", False, "getName", "()", "", "Argument[-1].SyntheticField[java.util.logging.Logger.name]", "ReturnValue", "value", "manual"] - ["java.util.logging", "LogRecord", False, "LogRecord", "", "", "Argument[1]", "Argument[this]", "taint", "manual"] - addsTo: diff --git a/java/ql/lib/ext/java.util.model.yml b/java/ql/lib/ext/java.util.model.yml index 6cd77031325..30b5964baed 100644 --- a/java/ql/lib/ext/java.util.model.yml +++ b/java/ql/lib/ext/java.util.model.yml @@ -124,7 +124,8 @@ extensions: - ["java.util", "EnumMap", False, "EnumMap", "(Map)", "", "Argument[0].MapValue", "Argument[this].MapValue", "value", "manual"] - ["java.util", "Enumeration", True, "asIterator", "", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - ["java.util", "Enumeration", True, "nextElement", "", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - - ["java.util", "EventObject", True, "getSource", "()", "", "Argument[-1].Field[java.util.EventObject.source]", "ReturnValue", "value", "manual"] # ! double-check + - ["java.util", "EventObject", False, "EventObject", "(Object)", "", "Argument[0]", "Argument[-1].Field[java.util.EventObject.source]", "value", "manual"] + - ["java.util", "EventObject", True, "getSource", "()", "", "Argument[-1].Field[java.util.EventObject.source]", "ReturnValue", "value", "manual"] - ["java.util", "HashMap", False, "HashMap", "(Map)", "", "Argument[0].MapKey", "Argument[this].MapKey", "value", "manual"] - ["java.util", "HashMap", False, "HashMap", "(Map)", "", "Argument[0].MapValue", "Argument[this].MapValue", "value", "manual"] - ["java.util", "HashSet", False, "HashSet", "(Collection)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"] @@ -161,7 +162,6 @@ extensions: - ["java.util", "ListIterator", True, "add", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util", "ListIterator", True, "previous", "", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - ["java.util", "ListIterator", True, "set", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - - ["java.util", "Locale", False, "forLanguageTag", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] # ! neutral? - ["java.util", "Map", True, "computeIfAbsent", "", "", "Argument[this].MapValue", "ReturnValue", "value", "manual"] - ["java.util", "Map", True, "computeIfAbsent", "", "", "Argument[1].ReturnValue", "Argument[this].MapValue", "value", "manual"] - ["java.util", "Map", True, "computeIfAbsent", "", "", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] @@ -178,7 +178,6 @@ extensions: - ["java.util", "Map", True, "getOrDefault", "", "", "Argument[1]", "ReturnValue", "value", "manual"] - ["java.util", "Map", True, "keySet", "()", "", "Argument[this].MapKey", "ReturnValue.Element", "value", "manual"] - ["java.util", "Map", True, "merge", "(Object,Object,BiFunction)", "", "Argument[1]", "Argument[this].MapValue", "value", "manual"] - # ! difference between formatting of below versus `List.of` above? - ["java.util", "Map", False, "of", "", "", "Argument[0]", "ReturnValue.MapKey", "value", "manual"] - ["java.util", "Map", False, "of", "", "", "Argument[10]", "ReturnValue.MapKey", "value", "manual"] - ["java.util", "Map", False, "of", "", "", "Argument[11]", "ReturnValue.MapValue", "value", "manual"] @@ -350,7 +349,6 @@ extensions: - ["java.util", "TreeMap", False, "TreeMap", "(SortedMap)", "", "Argument[0].MapValue", "Argument[this].MapValue", "value", "manual"] - ["java.util", "TreeSet", False, "TreeSet", "(Collection)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"] - ["java.util", "TreeSet", False, "TreeSet", "(SortedSet)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"] - - ["java.util", "UUID", False, "fromString", "(String)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.util", "Vector", False, "Vector", "(Collection)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"] - ["java.util", "Vector", True, "addElement", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util", "Vector", True, "copyInto", "(Object[])", "", "Argument[this].Element", "Argument[0].ArrayElement", "value", "manual"] @@ -370,34 +368,30 @@ extensions: - ["java.util", "ArrayList", "ArrayList", "(int)", "manual"] - ["java.util", "ArrayList", "isEmpty", "()", "manual"] - ["java.util", "ArrayList", "size", "()", "manual"] - - ["java.util", "Arrays", "toString", "(Object[])", "manual"] # ! should this have a summary model after all? (or unwanted model due to too much FP flow?) + - ["java.util", "Arrays", "toString", "(Object[])", "manual"] - ["java.util", "Calendar", "getInstance", "()", "manual"] - ["java.util", "Collection", "contains", "(Object)", "manual"] - ["java.util", "Collection", "isEmpty", "()", "manual"] - - ["java.util", "Collection", "removeIf", "(Predicate)", "manual"] # ! WithoutElement comment? (double-check if it returns anything, etc.) - ["java.util", "Collection", "size", "()", "manual"] - ["java.util", "Collections", "emptyList", "()", "manual"] - ["java.util", "Collections", "emptyMap", "()", "manual"] - ["java.util", "Collections", "emptySet", "()", "manual"] - - ["java.util", "Collections", "sort", "(List)", "manual"] # ! summary model instead? - - ["java.util", "Collections", "sort", "(List,Comparator)", "manual"] # ! summary model instead? - - ["java.util", "Comparator", "comparing", "(Function)", "manual"] # ! seems complex (functional interface), should maybe not have any model? + - ["java.util", "Collections", "sort", "", "manual"] - ["java.util", "Enumeration", "hasMoreElements", "()", "manual"] - ["java.util", "HashMap", "containsKey", "(Object)", "manual"] - ["java.util", "HashMap", "HashMap", "(int)", "manual"] - ["java.util", "HashMap", "size", "()", "manual"] - ["java.util", "HashSet", "HashSet", "(int)", "manual"] - ["java.util", "Iterator", "hasNext", "()", "manual"] - - ["java.util", "Iterator", "remove", "()", "manual"] # ! WithoutElement comment? (double-check if it returns anything, etc.) - ["java.util", "List", "contains", "(Object)", "manual"] - ["java.util", "List", "equals", "(Object)", "manual"] - ["java.util", "List", "hashCode", "()", "manual"] - ["java.util", "List", "indexOf", "(Object)", "manual"] - ["java.util", "List", "isEmpty", "()", "manual"] - ["java.util", "List", "of", "()", "manual"] - - ["java.util", "List", "sort", "(Comparator)", "manual"] # ! summary model instead? - - ["java.util", "List", "remove", "(Object)", "manual"] # ! WithoutElement comment? (actually, see above, is this already modeled for a different signature?) + - ["java.util", "List", "sort", "(Comparator)", "manual"] - ["java.util", "List", "size", "()", "manual"] + - ["java.util", "Locale", "forLanguageTag", "(String)", "manual"] - ["java.util", "Map", "containsKey", "(Object)", "manual"] - ["java.util", "Map", "isEmpty", "()", "manual"] - ["java.util", "Map", "size", "()", "manual"] @@ -412,10 +406,9 @@ extensions: - ["java.util", "Random", "nextInt", "(int)", "manual"] - ["java.util", "Set", "contains", "(Object)", "manual"] - ["java.util", "Set", "isEmpty", "()", "manual"] - - ["java.util", "Set", "remove", "(Object)", "manual"] # ! WithoutElement comment? (double-check if it returns anything, etc.) - - ["java.util", "Set", "removeAll", "(Collection)", "manual"] # ! WithoutElement comment? (double-check if it returns anything, etc.) - ["java.util", "Set", "size", "()", "manual"] - ["java.util", "UUID", "equals", "(Object)", "manual"] + - ["java.util", "UUID", "fromString", "(String)", "manual"] - ["java.util", "UUID", "randomUUID", "()", "manual"] - ["java.util", "UUID", "toString", "()", "manual"] - ["java.util", "TimeZone", "getTimeZone", "(String)", "manual"] @@ -423,9 +416,14 @@ extensions: # The below APIs are currently being stored as neutral models since `WithoutElement` has not yet been implemented for Java. # When `WithoutElement` is implemented, these should be changed to summary models of the form `Argument[this].WithoutElement -> Argument[this]`. + - ["java.util", "Collection", "removeIf", "(Predicate)", "manual"] + - ["java.util", "Iterator", "remove", "()", "manual"] - ["java.util", "List", "clear", "()", "manual"] + - ["java.util", "List", "remove", "(Object)", "manual"] - ["java.util", "Map", "clear", "()", "manual"] - ["java.util", "Set", "clear", "()", "manual"] + - ["java.util", "Set", "remove", "(Object)", "manual"] + - ["java.util", "Set", "removeAll", "(Collection)", "manual"] # The below APIs have numeric flow and are currently being stored as neutral models. # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. diff --git a/java/ql/lib/ext/java.util.stream.model.yml b/java/ql/lib/ext/java.util.stream.model.yml index f6a37dcd4ee..7ef65fd8a83 100644 --- a/java/ql/lib/ext/java.util.stream.model.yml +++ b/java/ql/lib/ext/java.util.stream.model.yml @@ -9,8 +9,7 @@ extensions: - ["java.util.stream", "BaseStream", True, "sequential", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - ["java.util.stream", "BaseStream", True, "spliterator", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - ["java.util.stream", "BaseStream", True, "unordered", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - - ["java.util.stream", "IntStream", False, "range", "(int,int)", "", "Argument[0..1]", "ReturnValue.Element", "value", "manual"] # ! this one is a bit odd, is it correct to have it as a summary model?; not interesting because Int stream?=neutral? - - ["java.util.stream", "Stream", True, "allMatch", "(Predicate)", "", "Argument[this].Element", "Argument[0].Parameter[0]", "value", "manual"] # ! neutral instead? + - ["java.util.stream", "Stream", True, "allMatch", "(Predicate)", "", "Argument[this].Element", "Argument[0].Parameter[0]", "value", "manual"] - ["java.util.stream", "Stream", True, "anyMatch", "(Predicate)", "", "Argument[this].Element", "Argument[0].Parameter[0]", "value", "manual"] - ["java.util.stream", "Stream", True, "collect", "(Supplier,BiConsumer,BiConsumer)", "", "Argument[this].Element", "Argument[1].Parameter[1]", "value", "manual"] - ["java.util.stream", "Stream", True, "collect", "(Supplier,BiConsumer,BiConsumer)", "", "Argument[0].ReturnValue", "Argument[1].Parameter[0]", "value", "manual"] @@ -95,5 +94,9 @@ extensions: data: - ["java.util.stream", "Collectors", "toList", "()", "manual"] - ["java.util.stream", "Collectors", "toSet", "()", "manual"] - - ["java.util.stream", "IntStream", "mapToObj", "(IntFunction)", "manual"] - ["java.util.stream", "Stream", "count", "()", "manual"] + + # The below APIs have numeric flow and are currently being stored as neutral models. + # These may be changed to summary models with kinds "value-numeric" and "taint-numeric" (or similar) in the future. + - ["java.util.stream", "IntStream", "mapToObj", "(IntFunction)", "manual"] # taint-numeric + - ["java.util.stream", "IntStream", "range", "(int,int)", "manual"] # taint-numeric diff --git a/java/ql/test/ext/TestModels/Test.java b/java/ql/test/ext/TestModels/Test.java index a64f4ec71c0..8b510971e5d 100644 --- a/java/ql/test/ext/TestModels/Test.java +++ b/java/ql/test/ext/TestModels/Test.java @@ -1,14 +1,24 @@ -import java.io.IOException; -import java.io.File; +import java.awt.*; +import java.io.*; import java.math.BigDecimal; +import java.net.URL; +import java.nio.file.Path; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.text.Format; +import java.text.MessageFormat; +import java.util.EventObject; +import java.util.Locale; +import java.util.ResourceBundle; import java.util.StringJoiner; +import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; import java.util.function.Supplier; +import java.util.logging.Logger; +import java.util.regex.Pattern; import java.util.stream.Collectors; public class Test { @@ -81,5 +91,115 @@ public class Test { StringJoiner sj2 = (StringJoiner)source(); sink(sj2.add("test")); // $hasTaintFlow } + + // top 300-500 JDK APIs tests + { + + // java.awt + Container container = new Container(); + sink(container.add((Component)source())); // $hasValueFlow + + // java.io + File f1 = (File)source(); + sink(f1.getParentFile()); // $hasTaintFlow + + File f2 = (File)source(); + sink(f2.getPath()); // $hasTaintFlow + + File f3 = (File)source(); + sink(f3.listFiles()); // $hasTaintFlow + + FileInputStream fis = new FileInputStream((File)source()); + sink(fis); // $hasTaintFlow + + StringWriter sw = (StringWriter)source(); + sink(sw.toString()); // $hasTaintFlow + + Exception e = new UncheckedIOException((IOException)source()); + sink((Throwable)e.getCause()); // $hasValueFlow + + // java.net + URL url = (URL)source(); + sink(url.toURI()); // $hasTaintFlow + + // java.nio.file + Path p = (Path)source(); + sink(p.getFileName()); // $hasTaintFlow + + // java.util.concurrent.atomic + AtomicReference ar = new AtomicReference(); + ar.set(source()); + sink(ar.get()); // $hasValueFlow + + // java.util.concurrent + // `ThreadPoolExecutor` implements the `java.util.concurrent.ExecutorService` interface + ThreadPoolExecutor tpe = new ThreadPoolExecutor(0, 0, 0, null, null); + sink(tpe.submit((Runnable)source())); // $hasTaintFlow + + CompletionStage cs = (CompletionStage)source(); + sink(cs.toCompletableFuture()); // $hasTaintFlow + + CompletableFuture cf1 = new CompletableFuture(); + cf1.complete(source()); + sink(cf1.get()); // $hasValueFlow + sink(cf1.join()); // $hasValueFlow + + CompletableFuture cf2 = CompletableFuture.completedFuture(source()); + sink(cf2.get()); // $hasValueFlow + sink(cf2.join()); // $hasValueFlow + + // java.util.logging + Logger logger = Logger.getLogger((String)source()); + sink(logger.getName()); // $hasValueFlow + + // java.util.regex + Pattern pattern = Pattern.compile((String)source()); + sink(pattern); // $hasTaintFlow + + // java.util + EventObject eventObj = new EventObject(source()); + sink(eventObj.getSource()); // $hasValueFlow + + // java.text + Format mf1 = new MessageFormat("test"); + sink(mf1.format(source())); // $hasTaintFlow + + String mf2 = MessageFormat.format((String)source(), null); + sink(mf2); // $hasTaintFlow + + String mf3 = MessageFormat.format("test", source()); + sink(mf3); // $hasTaintFlow + + // java.lang + AssertionError assertErr = new AssertionError(source()); + sink((String)assertErr.getMessage()); // $hasValueFlow + + sink(Test.class.cast(source())); // $hasTaintFlow + + Exception excep1 = new Exception((String)source(), (Throwable)source()); + sink((String)excep1.getMessage()); // $hasValueFlow + sink((Throwable)excep1.getCause()); // $hasValueFlow + + Exception excep2 = new NullPointerException((String)source()); + sink((String)excep2.getMessage()); // $hasValueFlow + + StringBuilder sb = (StringBuilder)source(); + sink(sb.delete(0, 1)); // $hasTaintFlow + + Thread thread1 = new Thread((Runnable)source()); + sink(thread1); // $hasTaintFlow + + Thread thread2 = new Thread((String)source()); + sink(thread2.getName()); // $hasValueFlow + + ThreadLocal threadloc = new ThreadLocal(); + threadloc.set(source()); + sink(threadloc.get()); // $hasValueFlow + + Throwable th = new Throwable((String)source()); + sink((String)th.getLocalizedMessage()); // $hasValueFlow + sink(th.toString()); // $hasTaintFlow + } } + } diff --git a/java/ql/test/ext/TopJdkApis/TopJdkApis.qll b/java/ql/test/ext/TopJdkApis/TopJdkApis.qll index 2ec75f59c20..14fd65a75bd 100644 --- a/java/ql/test/ext/TopJdkApis/TopJdkApis.qll +++ b/java/ql/test/ext/TopJdkApis/TopJdkApis.qll @@ -273,7 +273,8 @@ predicate topJdkApiName(string apiName) { "java.lang.Number#intValue()", "java.io.File#length()", "java.lang.AbstractStringBuilder#setCharAt(int,char)", "java.util.Set#removeAll(Collection)", "java.io.File#listFiles()", "java.lang.ClassLoader#getResourceAsStream(String)", - "java.util.Date#toInstant()", "java.util.Queue#add(Object)", "java.io.File#isFile()" + "java.util.Date#toInstant()", "java.util.Queue#add(Object)", "java.io.File#isFile()", + "java.sql.Statement#close()", "java.io.DataOutput#writeBoolean(boolean)" ] } @@ -309,6 +310,9 @@ class TopJdkApi extends SummarizedCallableBase { * `java.lang.System#getProperty(String)`: needs to be modeled by regular CodeQL matching the get and set keys to reduce FPs * `java.lang.System#setProperty(String,String)`: needs to be modeled by regular CodeQL matching the get and set keys to reduce FPs * `java.lang.Throwable#printStackTrace()`: should probably not be a general step, but there might be specialised queries that care + * `java.util.Comparator#comparing(Function)`: lambda flow + * `java.util.function.BiConsumer#accept(Object,Object)`: specialized lambda flow + * `java.util.function.BiFunction#apply(Object,Object)`: specialized lambda flow * `java.util.function.Consumer#accept(Object)`: specialized lambda flow * `java.util.function.Function#apply(Object)`: specialized lambda flow * `java.util.function.Supplier#get()`: lambda flow diff --git a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected index abf8d09a27f..45dbe5a2b4d 100644 --- a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected +++ b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected @@ -2,6 +2,9 @@ | java.lang.System#getProperty(String) | no manual model | | java.lang.System#setProperty(String,String) | no manual model | | java.lang.Throwable#printStackTrace() | no manual model | +| java.util.Comparator#comparing(Function) | no manual model | +| java.util.function.BiConsumer#accept(Object,Object) | no manual model | +| java.util.function.BiFunction#apply(Object,Object) | no manual model | | java.util.function.Consumer#accept(Object) | no manual model | | java.util.function.Function#apply(Object) | no manual model | | java.util.function.Supplier#get() | no manual model | From ab4ab7812d742f2ced1005fd448597dbd985996e Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Mon, 23 Jan 2023 15:51:33 -0500 Subject: [PATCH 120/143] Java: add change note --- java/ql/lib/change-notes/2023-01-23-add-top-jdk-models.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 java/ql/lib/change-notes/2023-01-23-add-top-jdk-models.md diff --git a/java/ql/lib/change-notes/2023-01-23-add-top-jdk-models.md b/java/ql/lib/change-notes/2023-01-23-add-top-jdk-models.md new file mode 100644 index 00000000000..a74fb161e58 --- /dev/null +++ b/java/ql/lib/change-notes/2023-01-23-add-top-jdk-models.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added more dataflow models for frequently-used JDK APIs. From bdd7f18e35043672efa45cbbe4e362d51e5ef902 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Mon, 20 Mar 2023 14:34:07 -0400 Subject: [PATCH 121/143] Java: remove some comments --- java/ql/lib/ext/java.io.model.yml | 2 +- java/ql/lib/ext/java.lang.model.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/ql/lib/ext/java.io.model.yml b/java/ql/lib/ext/java.io.model.yml index eed26f37299..ea8e7331267 100644 --- a/java/ql/lib/ext/java.io.model.yml +++ b/java/ql/lib/ext/java.io.model.yml @@ -92,7 +92,7 @@ extensions: - ["java.io", "OutputStream", True, "write", "(int)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.io", "Reader", True, "read", "", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["java.io", "StringReader", False, "StringReader", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - - ["java.io", "StringWriter", False, "toString", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] # ! keep an eye on this one for FP flow, already modeled in `taintPreservingQualifierToMethod` predicate? + - ["java.io", "StringWriter", False, "toString", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - ["java.io", "UncheckedIOException", False, "UncheckedIOException", "(IOException)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.Throwable.cause]", "value", "manual"] - ["java.io", "Writer", True, "write", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - addsTo: diff --git a/java/ql/lib/ext/java.lang.model.yml b/java/ql/lib/ext/java.lang.model.yml index 7cfc9ce68bc..58846dfa8b3 100644 --- a/java/ql/lib/ext/java.lang.model.yml +++ b/java/ql/lib/ext/java.lang.model.yml @@ -123,7 +123,7 @@ extensions: - ["java.lang", "Throwable", True, "getCause", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "ReturnValue", "value", "manual"] - ["java.lang", "Throwable", True, "getMessage", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "value", "manual"] - ["java.lang", "Throwable", True, "getLocalizedMessage", "()", "", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "value", "manual"] - - ["java.lang", "Throwable", True, "toString", "()", "", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "taint", "manual"] # ! watch for FPs + - ["java.lang", "Throwable", True, "toString", "()", "", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "taint", "manual"] - addsTo: pack: codeql/java-all From 882237e13e79be62c86a84dd105797722a89bc3d Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Mon, 23 Jan 2023 21:33:07 -0500 Subject: [PATCH 122/143] Java: update test cases affected by Duration.ofMillis and AtomicReference.set models --- .../SupportedExternalApis/SupportedExternalApis.expected | 1 + .../SupportedExternalApis/SupportedExternalApis.java | 4 ++-- .../Telemetry/UnsupportedExternalAPIs/Test.java | 7 ++++--- .../UnsupportedExternalAPIs.expected | 3 +-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/java/ql/test/query-tests/Telemetry/SupportedExternalApis/SupportedExternalApis.expected b/java/ql/test/query-tests/Telemetry/SupportedExternalApis/SupportedExternalApis.expected index 8a20a6c6c7b..3f5b3663281 100644 --- a/java/ql/test/query-tests/Telemetry/SupportedExternalApis/SupportedExternalApis.expected +++ b/java/ql/test/query-tests/Telemetry/SupportedExternalApis/SupportedExternalApis.expected @@ -6,5 +6,6 @@ | java.net.URL#openConnection() | 1 | | java.net.URL#openStream() | 1 | | java.net.URLConnection#getInputStream() | 1 | +| java.time.Duration#ofMillis(long) | 1 | | java.util.Map#put(Object,Object) | 1 | | org.apache.commons.io.FileUtils#deleteDirectory(File) | 1 | diff --git a/java/ql/test/query-tests/Telemetry/SupportedExternalApis/SupportedExternalApis.java b/java/ql/test/query-tests/Telemetry/SupportedExternalApis/SupportedExternalApis.java index 7dd289acbaa..6445e97b473 100644 --- a/java/ql/test/query-tests/Telemetry/SupportedExternalApis/SupportedExternalApis.java +++ b/java/ql/test/query-tests/Telemetry/SupportedExternalApis/SupportedExternalApis.java @@ -16,7 +16,7 @@ class SupportedExternalApis { Map map = new HashMap<>(); // uninteresting (parameterless constructor) map.put("foo", new Object()); // supported summary - Duration d = java.time.Duration.ofMillis(1000); // not supported + Duration d = java.time.Duration.ofMillis(1000); // supported neutral URL github = new URL("https://www.github.com/"); // supported summary InputStream stream = github.openConnection().getInputStream(); // supported source (getInputStream), supported sink (openConnection) @@ -24,6 +24,6 @@ class SupportedExternalApis { new FileWriter(new File("foo")); // supported sink (FileWriter), supported summary (File) new URL("http://foo").openStream(); // supported sink (openStream), supported summary (URL) - FileUtils.deleteDirectory(new File("foo")); // supported negative summary (deleteDirectory), supported summary (File) + FileUtils.deleteDirectory(new File("foo")); // supported neutral (deleteDirectory), supported summary (File) } } diff --git a/java/ql/test/query-tests/Telemetry/UnsupportedExternalAPIs/Test.java b/java/ql/test/query-tests/Telemetry/UnsupportedExternalAPIs/Test.java index f0e3926c7e9..b398a791836 100644 --- a/java/ql/test/query-tests/Telemetry/UnsupportedExternalAPIs/Test.java +++ b/java/ql/test/query-tests/Telemetry/UnsupportedExternalAPIs/Test.java @@ -11,12 +11,13 @@ class ExternalApiUsage { Map map = new HashMap<>(); map.put("foo", new Object()); - Duration d = java.time.Duration.ofMillis(1000); // not supported + Duration d = java.time.Duration.ofMillis(1000); // supported as a neutral model long l = "foo".length(); // supported as a neutral model - AtomicReference ref = new AtomicReference<>(); // not supported - ref.set("foo"); + AtomicReference ref = new AtomicReference<>(); // uninteresting (parameterless constructor) + ref.set("foo"); // supported as a summary model + ref.toString(); // not supported String.class.isAssignableFrom(Object.class); // parameter with generic type, supported as a neutral model diff --git a/java/ql/test/query-tests/Telemetry/UnsupportedExternalAPIs/UnsupportedExternalAPIs.expected b/java/ql/test/query-tests/Telemetry/UnsupportedExternalAPIs/UnsupportedExternalAPIs.expected index 7bab3b2d75a..6419b137690 100644 --- a/java/ql/test/query-tests/Telemetry/UnsupportedExternalAPIs/UnsupportedExternalAPIs.expected +++ b/java/ql/test/query-tests/Telemetry/UnsupportedExternalAPIs/UnsupportedExternalAPIs.expected @@ -1,2 +1 @@ -| java.time.Duration#ofMillis(long) | 1 | -| java.util.concurrent.atomic.AtomicReference#set(Object) | 1 | +| java.util.concurrent.atomic.AtomicReference#toString() | 1 | From 79ce46a22115f467b693dafa9a76d99c568c2dc9 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Mon, 20 Mar 2023 14:35:30 -0400 Subject: [PATCH 123/143] Java: remove FileInputStream summary model since causing issues in DCA --- java/ql/lib/ext/java.io.model.yml | 2 +- java/ql/test/ext/TestModels/Test.java | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/java/ql/lib/ext/java.io.model.yml b/java/ql/lib/ext/java.io.model.yml index ea8e7331267..cc4855dcef8 100644 --- a/java/ql/lib/ext/java.io.model.yml +++ b/java/ql/lib/ext/java.io.model.yml @@ -75,7 +75,6 @@ extensions: - ["java.io", "File", True, "toPath", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "toString", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "toURI", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["java.io", "FileInputStream", False, "FileInputStream", "(File)", "", "Argument[0]", "Argument[-1]", "taint", "manual"] - ["java.io", "FilterOutputStream", True, "FilterOutputStream", "(OutputStream)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.io", "InputStream", True, "read", "(byte[])", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["java.io", "InputStream", True, "read", "(byte[],int,int)", "", "Argument[this]", "Argument[0]", "taint", "manual"] @@ -107,6 +106,7 @@ extensions: - ["java.io", "File", "length", "()", "manual"] - ["java.io", "File", "isDirectory", "()", "manual"] - ["java.io", "File", "mkdirs", "()", "manual"] + - ["java.io", "FileInputStream", "FileInputStream", "(File)", "manual"] - ["java.io", "InputStream", "close", "()", "manual"] - ["java.io", "OutputStream", "flush", "()", "manual"] diff --git a/java/ql/test/ext/TestModels/Test.java b/java/ql/test/ext/TestModels/Test.java index 8b510971e5d..fe9c64666a0 100644 --- a/java/ql/test/ext/TestModels/Test.java +++ b/java/ql/test/ext/TestModels/Test.java @@ -109,9 +109,6 @@ public class Test { File f3 = (File)source(); sink(f3.listFiles()); // $hasTaintFlow - FileInputStream fis = new FileInputStream((File)source()); - sink(fis); // $hasTaintFlow - StringWriter sw = (StringWriter)source(); sink(sw.toString()); // $hasTaintFlow From 170d9e35bef14f1286bede9b3deadb70e9f826f9 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Wed, 15 Feb 2023 17:58:20 -0500 Subject: [PATCH 124/143] Java: update change note date --- ...-23-add-top-jdk-models.md => 2023-02-15-add-top-jdk-models.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename java/ql/lib/change-notes/{2023-01-23-add-top-jdk-models.md => 2023-02-15-add-top-jdk-models.md} (100%) diff --git a/java/ql/lib/change-notes/2023-01-23-add-top-jdk-models.md b/java/ql/lib/change-notes/2023-02-15-add-top-jdk-models.md similarity index 100% rename from java/ql/lib/change-notes/2023-01-23-add-top-jdk-models.md rename to java/ql/lib/change-notes/2023-02-15-add-top-jdk-models.md From 56d14820e42008765a8e2a8c4afe2945b5b0d47b Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Mon, 20 Mar 2023 14:36:55 -0400 Subject: [PATCH 125/143] Java: change taint to value for Class.cast --- java/ql/lib/ext/java.lang.model.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/ql/lib/ext/java.lang.model.yml b/java/ql/lib/ext/java.lang.model.yml index 58846dfa8b3..be215b25c6e 100644 --- a/java/ql/lib/ext/java.lang.model.yml +++ b/java/ql/lib/ext/java.lang.model.yml @@ -52,7 +52,7 @@ extensions: - ["java.lang", "CharSequence", True, "charAt", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.lang", "CharSequence", True, "subSequence", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.lang", "CharSequence", True, "toString", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["java.lang", "Class", False, "cast", "(Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["java.lang", "Class", False, "cast", "(Object)", "", "Argument[0]", "ReturnValue", "value", "manual"] - ["java.lang", "Exception", False, "Exception", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "Exception", False, "Exception", "(String,Throwable)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "Exception", False, "Exception", "(String,Throwable)", "", "Argument[1]", "Argument[-1].SyntheticField[java.lang.Throwable.cause]", "value", "manual"] From db545e4981f7d198a196296d90bf249aaf6fb67f Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Mon, 20 Mar 2023 14:38:06 -0400 Subject: [PATCH 126/143] Java: switch StringBuilder.delete to AbstractStringBuilder.delete --- java/ql/lib/ext/java.lang.model.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/ql/lib/ext/java.lang.model.yml b/java/ql/lib/ext/java.lang.model.yml index be215b25c6e..52b4aa248aa 100644 --- a/java/ql/lib/ext/java.lang.model.yml +++ b/java/ql/lib/ext/java.lang.model.yml @@ -37,6 +37,7 @@ extensions: - ["java.lang", "AbstractStringBuilder", True, "AbstractStringBuilder", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "AbstractStringBuilder", True, "append", "", "", "Argument[this]", "ReturnValue", "value", "manual"] - ["java.lang", "AbstractStringBuilder", True, "append", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["java.lang", "AbstractStringBuilder", True, "delete", "(int,int)", "", "Argument[-1]", "ReturnValue", "value", "manual"] - ["java.lang", "AbstractStringBuilder", True, "getChars", "", "", "Argument[this]", "Argument[2]", "taint", "manual"] - ["java.lang", "AbstractStringBuilder", True, "insert", "", "", "Argument[this]", "ReturnValue", "value", "manual"] - ["java.lang", "AbstractStringBuilder", True, "insert", "", "", "Argument[1]", "Argument[this]", "taint", "manual"] @@ -111,7 +112,6 @@ extensions: - ["java.lang", "StringBuffer", True, "StringBuffer", "(CharSequence)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "StringBuffer", True, "StringBuffer", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "StringBuilder", True, "StringBuilder", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - - ["java.lang", "StringBuilder", False, "delete", "(int,int)", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - ["java.lang", "System", False, "arraycopy", "", "", "Argument[0]", "Argument[2]", "taint", "manual"] - ["java.lang", "Thread", False, "Thread", "(Runnable)", "", "Argument[0]", "Argument[-1]", "taint", "manual"] - ["java.lang", "Thread", False, "Thread", "(String)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.Thread.name]", "value", "manual"] From a7da6c802998507c1520298fc148326fafe13dfd Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Tue, 14 Mar 2023 22:01:42 -0400 Subject: [PATCH 127/143] Java: update cast and delete tests --- java/ql/test/ext/TestModels/Test.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/ql/test/ext/TestModels/Test.java b/java/ql/test/ext/TestModels/Test.java index fe9c64666a0..6c33b9f2310 100644 --- a/java/ql/test/ext/TestModels/Test.java +++ b/java/ql/test/ext/TestModels/Test.java @@ -171,7 +171,7 @@ public class Test { AssertionError assertErr = new AssertionError(source()); sink((String)assertErr.getMessage()); // $hasValueFlow - sink(Test.class.cast(source())); // $hasTaintFlow + sink(Test.class.cast(source())); // $hasValueFlow Exception excep1 = new Exception((String)source(), (Throwable)source()); sink((String)excep1.getMessage()); // $hasValueFlow @@ -181,7 +181,7 @@ public class Test { sink((String)excep2.getMessage()); // $hasValueFlow StringBuilder sb = (StringBuilder)source(); - sink(sb.delete(0, 1)); // $hasTaintFlow + sink(sb.delete(0, 1)); // $hasValueFlow Thread thread1 = new Thread((Runnable)source()); sink(thread1); // $hasTaintFlow From 702ca19c3c93c7b3fc2cfbca6db9795f15e11928 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Tue, 14 Mar 2023 22:20:19 -0400 Subject: [PATCH 128/143] Java: added comment about second order sql injection --- java/ql/lib/ext/java.sql.model.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/ql/lib/ext/java.sql.model.yml b/java/ql/lib/ext/java.sql.model.yml index f5b15706476..7c8174fca43 100644 --- a/java/ql/lib/ext/java.sql.model.yml +++ b/java/ql/lib/ext/java.sql.model.yml @@ -41,7 +41,7 @@ extensions: - ["java.sql", "ResultSet", "getInt", "(int)", "manual"] # taint-numeric - ["java.sql", "ResultSet", "getInt", "(String)", "manual"] # taint-numeric - ["java.sql", "ResultSet", "getLong", "(String)", "manual"] # taint-numeric - - ["java.sql", "ResultSet", "getString", "(int)", "manual"] # taint-numeric + - ["java.sql", "ResultSet", "getString", "(int)", "manual"] # taint-numeric, potentially interesting for second order SQL injection - ["java.sql", "ResultSet", "getTimestamp", "(String)", "manual"] # taint-numeric - ["java.sql", "Timestamp", "Timestamp", "(long)", "manual"] # taint-numeric - ["java.sql", "Timestamp", "getTime", "()", "manual"] # taint-numeric From e0c0c973a7e35cf7ad45c6cc2a77d9825b9c8d34 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Tue, 14 Mar 2023 22:40:23 -0400 Subject: [PATCH 129/143] Java: remove Format and MessageFormat --- java/ql/lib/ext/java.text.model.yml | 8 -------- java/ql/test/ext/TestModels/Test.java | 12 ------------ java/ql/test/ext/TopJdkApis/TopJdkApis.qll | 2 ++ java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected | 2 ++ 4 files changed, 4 insertions(+), 20 deletions(-) diff --git a/java/ql/lib/ext/java.text.model.yml b/java/ql/lib/ext/java.text.model.yml index e179f9f5d6f..86099195f46 100644 --- a/java/ql/lib/ext/java.text.model.yml +++ b/java/ql/lib/ext/java.text.model.yml @@ -1,12 +1,4 @@ extensions: - - addsTo: - pack: codeql/java-all - extensible: summaryModel - data: - - ["java.text", "Format", True, "format", "(Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["java.text", "MessageFormat", False, "format", "(String,Object[])", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["java.text", "MessageFormat", False, "format", "(String,Object[])", "", "Argument[1].ArrayElement", "ReturnValue", "taint", "manual"] - - addsTo: pack: codeql/java-all extensible: neutralModel diff --git a/java/ql/test/ext/TestModels/Test.java b/java/ql/test/ext/TestModels/Test.java index 6c33b9f2310..305ef30d797 100644 --- a/java/ql/test/ext/TestModels/Test.java +++ b/java/ql/test/ext/TestModels/Test.java @@ -7,8 +7,6 @@ import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.text.Format; -import java.text.MessageFormat; import java.util.EventObject; import java.util.Locale; import java.util.ResourceBundle; @@ -157,16 +155,6 @@ public class Test { EventObject eventObj = new EventObject(source()); sink(eventObj.getSource()); // $hasValueFlow - // java.text - Format mf1 = new MessageFormat("test"); - sink(mf1.format(source())); // $hasTaintFlow - - String mf2 = MessageFormat.format((String)source(), null); - sink(mf2); // $hasTaintFlow - - String mf3 = MessageFormat.format("test", source()); - sink(mf3); // $hasTaintFlow - // java.lang AssertionError assertErr = new AssertionError(source()); sink((String)assertErr.getMessage()); // $hasValueFlow diff --git a/java/ql/test/ext/TopJdkApis/TopJdkApis.qll b/java/ql/test/ext/TopJdkApis/TopJdkApis.qll index 14fd65a75bd..b0a8902b12b 100644 --- a/java/ql/test/ext/TopJdkApis/TopJdkApis.qll +++ b/java/ql/test/ext/TopJdkApis/TopJdkApis.qll @@ -310,6 +310,8 @@ class TopJdkApi extends SummarizedCallableBase { * `java.lang.System#getProperty(String)`: needs to be modeled by regular CodeQL matching the get and set keys to reduce FPs * `java.lang.System#setProperty(String,String)`: needs to be modeled by regular CodeQL matching the get and set keys to reduce FPs * `java.lang.Throwable#printStackTrace()`: should probably not be a general step, but there might be specialised queries that care + * `java.text.Format#format(Object)`: similar issue as `Object.toString`; depends on the object being passed as the argument + * `java.text.MessageFormat#format(String,Object[])`: similar issue as `Object.toString`; depends on the object being passed as the argument * `java.util.Comparator#comparing(Function)`: lambda flow * `java.util.function.BiConsumer#accept(Object,Object)`: specialized lambda flow * `java.util.function.BiFunction#apply(Object,Object)`: specialized lambda flow diff --git a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected index 45dbe5a2b4d..2e0ace91209 100644 --- a/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected +++ b/java/ql/test/ext/TopJdkApis/TopJdkApisTest.expected @@ -2,6 +2,8 @@ | java.lang.System#getProperty(String) | no manual model | | java.lang.System#setProperty(String,String) | no manual model | | java.lang.Throwable#printStackTrace() | no manual model | +| java.text.Format#format(Object) | no manual model | +| java.text.MessageFormat#format(String,Object[]) | no manual model | | java.util.Comparator#comparing(Function) | no manual model | | java.util.function.BiConsumer#accept(Object,Object) | no manual model | | java.util.function.BiFunction#apply(Object,Object) | no manual model | From 62d64d5828f4eafffe4a34c1f8da431343fca65f Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Tue, 14 Mar 2023 23:02:22 -0400 Subject: [PATCH 130/143] Java: add comments for reflection-related models --- java/ql/lib/ext/java.lang.model.yml | 6 +++--- java/ql/lib/ext/java.lang.reflect.model.yml | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/java/ql/lib/ext/java.lang.model.yml b/java/ql/lib/ext/java.lang.model.yml index 52b4aa248aa..f22abab705f 100644 --- a/java/ql/lib/ext/java.lang.model.yml +++ b/java/ql/lib/ext/java.lang.model.yml @@ -140,9 +140,9 @@ extensions: - ["java.lang", "Class", "forName", "(String)", "manual"] - ["java.lang", "Class", "getCanonicalName", "()", "manual"] - ["java.lang", "Class", "getClassLoader", "()", "manual"] - - ["java.lang", "Class", "getDeclaredConstructor", "(Class[])", "manual"] - - ["java.lang", "Class", "getDeclaredField", "(String)", "manual"] - - ["java.lang", "Class", "getMethod", "(String,Class[])", "manual"] + - ["java.lang", "Class", "getDeclaredConstructor", "(Class[])", "manual"] # This model may be changed to a taint step for an unsafe reflection query in the future. + - ["java.lang", "Class", "getDeclaredField", "(String)", "manual"] # This model may be changed to a taint step for an unsafe reflection query in the future. + - ["java.lang", "Class", "getMethod", "(String,Class[])", "manual"] # This model may be changed to a taint step for an unsafe reflection query in the future. - ["java.lang", "Class", "getName", "()", "manual"] - ["java.lang", "Class", "getResource", "(String)", "manual"] - ["java.lang", "Class", "getResourceAsStream", "(String)", "manual"] diff --git a/java/ql/lib/ext/java.lang.reflect.model.yml b/java/ql/lib/ext/java.lang.reflect.model.yml index a709a0fc8b6..9430807d00b 100644 --- a/java/ql/lib/ext/java.lang.reflect.model.yml +++ b/java/ql/lib/ext/java.lang.reflect.model.yml @@ -3,6 +3,7 @@ extensions: pack: codeql/java-all extensible: neutralModel data: + # The below models may be changed to taint steps for an unsafe reflection query in the future. - ["java.lang.reflect", "Constructor", "newInstance", "(Object[])", "manual"] - ["java.lang.reflect", "Field", "get", "(Object)", "manual"] - ["java.lang.reflect", "Method", "getName", "()", "manual"] From 29999d7bc8972eb03a086f4073264162495bb6a6 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Mon, 20 Mar 2023 14:39:11 -0400 Subject: [PATCH 131/143] Java: add WithoutElement comment --- java/ql/lib/ext/java.lang.model.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/java/ql/lib/ext/java.lang.model.yml b/java/ql/lib/ext/java.lang.model.yml index f22abab705f..d5e263f6f0b 100644 --- a/java/ql/lib/ext/java.lang.model.yml +++ b/java/ql/lib/ext/java.lang.model.yml @@ -37,6 +37,7 @@ extensions: - ["java.lang", "AbstractStringBuilder", True, "AbstractStringBuilder", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "AbstractStringBuilder", True, "append", "", "", "Argument[this]", "ReturnValue", "value", "manual"] - ["java.lang", "AbstractStringBuilder", True, "append", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] + # When `WithoutElement` is implemented for Java, `java.lang.AbstractStringBuilder#delete` might require a `taint` step of the form `Argument[-1].WithoutElement -> Argument[-1]` in addition to the below `value` step. - ["java.lang", "AbstractStringBuilder", True, "delete", "(int,int)", "", "Argument[-1]", "ReturnValue", "value", "manual"] - ["java.lang", "AbstractStringBuilder", True, "getChars", "", "", "Argument[this]", "Argument[2]", "taint", "manual"] - ["java.lang", "AbstractStringBuilder", True, "insert", "", "", "Argument[this]", "ReturnValue", "value", "manual"] From 0f3a0a1e81fdd7669aff53f42f355aa5674df03c Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Mon, 20 Mar 2023 14:40:12 -0400 Subject: [PATCH 132/143] Java: remove ArrayElement from listFiles --- java/ql/lib/ext/java.io.model.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/ql/lib/ext/java.io.model.yml b/java/ql/lib/ext/java.io.model.yml index cc4855dcef8..b11e732a6d7 100644 --- a/java/ql/lib/ext/java.io.model.yml +++ b/java/ql/lib/ext/java.io.model.yml @@ -71,7 +71,7 @@ extensions: - ["java.io", "File", True, "getName", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "getParentFile", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "getPath", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - - ["java.io", "File", True, "listFiles", "()", "", "Argument[-1]", "ReturnValue.ArrayElement", "taint", "manual"] + - ["java.io", "File", True, "listFiles", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "toPath", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "toString", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "toURI", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] From 3d0d4111c0bdde11f746b225baff6cd9382f5a7a Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Mon, 20 Mar 2023 11:10:52 -0400 Subject: [PATCH 133/143] Java: add test for ResourceBundle.getString --- java/ql/test/ext/TestModels/Test.java | 12 ++++++++++-- java/ql/test/ext/TestModels/test.ext.yml | 6 ++++++ 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 java/ql/test/ext/TestModels/test.ext.yml diff --git a/java/ql/test/ext/TestModels/Test.java b/java/ql/test/ext/TestModels/Test.java index 305ef30d797..0f52da636e6 100644 --- a/java/ql/test/ext/TestModels/Test.java +++ b/java/ql/test/ext/TestModels/Test.java @@ -1,3 +1,5 @@ +package generatedtest; // for java.util.ResourceBundle.getString test + import java.awt.*; import java.io.*; import java.math.BigDecimal; @@ -8,7 +10,6 @@ import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.EventObject; -import java.util.Locale; import java.util.ResourceBundle; import java.util.StringJoiner; import java.util.concurrent.*; @@ -25,6 +26,8 @@ public class Test { Object source() { return null; } + Object newWithMapValueDefault(Object element) { return null; } // for java.util.ResourceBundle.getString test + public void test() throws Exception { // top 100 JDK APIs tests @@ -155,6 +158,12 @@ public class Test { EventObject eventObj = new EventObject(source()); sink(eventObj.getSource()); // $hasValueFlow + // "java.util;ResourceBundle;true;getString;(String);;Argument[-1].MapValue;ReturnValue;value;manual" + String out = null; + ResourceBundle in = (ResourceBundle)newWithMapValueDefault(source()); + out = in.getString(null); + sink(out); // $ hasValueFlow + // java.lang AssertionError assertErr = new AssertionError(source()); sink((String)assertErr.getMessage()); // $hasValueFlow @@ -186,5 +195,4 @@ public class Test { sink(th.toString()); // $hasTaintFlow } } - } diff --git a/java/ql/test/ext/TestModels/test.ext.yml b/java/ql/test/ext/TestModels/test.ext.yml new file mode 100644 index 00000000000..4fff7d575a3 --- /dev/null +++ b/java/ql/test/ext/TestModels/test.ext.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/java-tests + extensible: summaryModel + data: + - ["generatedtest", "Test", False, "newWithMapValueDefault", "(Object)", "", "Argument[0]", "ReturnValue.MapValue", "value", "manual"] From 8046ec2f78aaec76d55515ebbeed6d27f26341e1 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Thu, 23 Mar 2023 18:01:28 -0400 Subject: [PATCH 134/143] Java: update -1 to this --- java/ql/lib/ext/java.awt.model.yml | 4 +-- java/ql/lib/ext/java.io.model.yml | 10 +++---- java/ql/lib/ext/java.lang.model.yml | 28 +++++++++---------- java/ql/lib/ext/java.nio.file.model.yml | 2 +- .../ext/java.util.concurrent.atomic.model.yml | 2 +- .../ql/lib/ext/java.util.concurrent.model.yml | 8 +++--- java/ql/lib/ext/java.util.logging.model.yml | 2 +- java/ql/lib/ext/java.util.model.yml | 6 ++-- 8 files changed, 31 insertions(+), 31 deletions(-) diff --git a/java/ql/lib/ext/java.awt.model.yml b/java/ql/lib/ext/java.awt.model.yml index 40b8b196e8f..4bbbc3738cf 100644 --- a/java/ql/lib/ext/java.awt.model.yml +++ b/java/ql/lib/ext/java.awt.model.yml @@ -3,9 +3,9 @@ extensions: pack: codeql/java-all extensible: summaryModel data: - - ["java.awt", "Container", True, "add", "(Component)", "", "Argument[0]", "Argument[-1].Element", "value", "manual"] + - ["java.awt", "Container", True, "add", "(Component)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.awt", "Container", True, "add", "(Component)", "", "Argument[0]", "ReturnValue", "value", "manual"] - - ["java.awt", "Container", True, "add", "(Component,Object)", "", "Argument[0]", "Argument[-1].Element", "value", "manual"] + - ["java.awt", "Container", True, "add", "(Component,Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - addsTo: pack: codeql/java-all diff --git a/java/ql/lib/ext/java.io.model.yml b/java/ql/lib/ext/java.io.model.yml index b11e732a6d7..a14f4fe7782 100644 --- a/java/ql/lib/ext/java.io.model.yml +++ b/java/ql/lib/ext/java.io.model.yml @@ -69,9 +69,9 @@ extensions: - ["java.io", "File", True, "getCanonicalFile", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "getCanonicalPath", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "getName", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["java.io", "File", True, "getParentFile", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - - ["java.io", "File", True, "getPath", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - - ["java.io", "File", True, "listFiles", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["java.io", "File", True, "getParentFile", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["java.io", "File", True, "getPath", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["java.io", "File", True, "listFiles", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "toPath", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "toString", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.io", "File", True, "toURI", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] @@ -91,8 +91,8 @@ extensions: - ["java.io", "OutputStream", True, "write", "(int)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.io", "Reader", True, "read", "", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["java.io", "StringReader", False, "StringReader", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - - ["java.io", "StringWriter", False, "toString", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] - - ["java.io", "UncheckedIOException", False, "UncheckedIOException", "(IOException)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.Throwable.cause]", "value", "manual"] + - ["java.io", "StringWriter", False, "toString", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["java.io", "UncheckedIOException", False, "UncheckedIOException", "(IOException)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "value", "manual"] - ["java.io", "Writer", True, "write", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - addsTo: pack: codeql/java-all diff --git a/java/ql/lib/ext/java.lang.model.yml b/java/ql/lib/ext/java.lang.model.yml index d5e263f6f0b..f1b84ae70b6 100644 --- a/java/ql/lib/ext/java.lang.model.yml +++ b/java/ql/lib/ext/java.lang.model.yml @@ -37,8 +37,8 @@ extensions: - ["java.lang", "AbstractStringBuilder", True, "AbstractStringBuilder", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "AbstractStringBuilder", True, "append", "", "", "Argument[this]", "ReturnValue", "value", "manual"] - ["java.lang", "AbstractStringBuilder", True, "append", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - # When `WithoutElement` is implemented for Java, `java.lang.AbstractStringBuilder#delete` might require a `taint` step of the form `Argument[-1].WithoutElement -> Argument[-1]` in addition to the below `value` step. - - ["java.lang", "AbstractStringBuilder", True, "delete", "(int,int)", "", "Argument[-1]", "ReturnValue", "value", "manual"] + # When `WithoutElement` is implemented for Java, `java.lang.AbstractStringBuilder#delete` might require a `taint` step of the form `Argument[this].WithoutElement -> Argument[this]` in addition to the below `value` step. + - ["java.lang", "AbstractStringBuilder", True, "delete", "(int,int)", "", "Argument[this]", "ReturnValue", "value", "manual"] - ["java.lang", "AbstractStringBuilder", True, "getChars", "", "", "Argument[this]", "Argument[2]", "taint", "manual"] - ["java.lang", "AbstractStringBuilder", True, "insert", "", "", "Argument[this]", "ReturnValue", "value", "manual"] - ["java.lang", "AbstractStringBuilder", True, "insert", "", "", "Argument[1]", "Argument[this]", "taint", "manual"] @@ -50,21 +50,21 @@ extensions: - ["java.lang", "AbstractStringBuilder", True, "toString", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.lang", "Appendable", True, "append", "", "", "Argument[this]", "ReturnValue", "value", "manual"] - ["java.lang", "Appendable", True, "append", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - - ["java.lang", "AssertionError", False, "AssertionError", "(Object)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "value", "manual"] + - ["java.lang", "AssertionError", False, "AssertionError", "(Object)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "CharSequence", True, "charAt", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.lang", "CharSequence", True, "subSequence", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.lang", "CharSequence", True, "toString", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.lang", "Class", False, "cast", "(Object)", "", "Argument[0]", "ReturnValue", "value", "manual"] - ["java.lang", "Exception", False, "Exception", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - - ["java.lang", "Exception", False, "Exception", "(String,Throwable)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - - ["java.lang", "Exception", False, "Exception", "(String,Throwable)", "", "Argument[1]", "Argument[-1].SyntheticField[java.lang.Throwable.cause]", "value", "manual"] + - ["java.lang", "Exception", False, "Exception", "(String,Throwable)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] + - ["java.lang", "Exception", False, "Exception", "(String,Throwable)", "", "Argument[1]", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "value", "manual"] - ["java.lang", "IllegalArgumentException", False, "IllegalArgumentException", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "IllegalStateException", False, "IllegalStateException", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "IndexOutOfBoundsException", False, "IndexOutOfBoundsException", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "Iterable", True, "forEach", "(Consumer)", "", "Argument[this].Element", "Argument[0].Parameter[0]", "value", "manual"] - ["java.lang", "Iterable", True, "iterator", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - ["java.lang", "Iterable", True, "spliterator", "()", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - - ["java.lang", "NullPointerException", False, "NullPointerException", "(String)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "value", "manual"] + - ["java.lang", "NullPointerException", False, "NullPointerException", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "Object", True, "clone", "", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - ["java.lang", "Object", True, "clone", "", "", "Argument[this].MapKey", "ReturnValue.MapKey", "value", "manual"] - ["java.lang", "Object", True, "clone", "", "", "Argument[this].MapValue", "ReturnValue.MapValue", "value", "manual"] @@ -114,17 +114,17 @@ extensions: - ["java.lang", "StringBuffer", True, "StringBuffer", "(String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "StringBuilder", True, "StringBuilder", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.lang", "System", False, "arraycopy", "", "", "Argument[0]", "Argument[2]", "taint", "manual"] - - ["java.lang", "Thread", False, "Thread", "(Runnable)", "", "Argument[0]", "Argument[-1]", "taint", "manual"] - - ["java.lang", "Thread", False, "Thread", "(String)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.Thread.name]", "value", "manual"] - - ["java.lang", "Thread", True, "getName", "()", "", "Argument[-1].SyntheticField[java.lang.Thread.name]", "ReturnValue", "value", "manual"] - - ["java.lang", "ThreadLocal", True, "get", "()", "", "Argument[-1].SyntheticField[java.lang.ThreadLocal.value]", "ReturnValue", "value", "manual"] - - ["java.lang", "ThreadLocal", True, "set", "(Object)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.ThreadLocal.value]", "value", "manual"] + - ["java.lang", "Thread", False, "Thread", "(Runnable)", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["java.lang", "Thread", False, "Thread", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Thread.name]", "value", "manual"] + - ["java.lang", "Thread", True, "getName", "()", "", "Argument[this].SyntheticField[java.lang.Thread.name]", "ReturnValue", "value", "manual"] + - ["java.lang", "ThreadLocal", True, "get", "()", "", "Argument[this].SyntheticField[java.lang.ThreadLocal.value]", "ReturnValue", "value", "manual"] + - ["java.lang", "ThreadLocal", True, "set", "(Object)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.ThreadLocal.value]", "value", "manual"] - ["java.lang", "Throwable", False, "Throwable", "(Throwable)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "value", "manual"] - - ["java.lang", "Throwable", False, "Throwable", "(String)", "", "Argument[0]", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "value", "manual"] + - ["java.lang", "Throwable", False, "Throwable", "(String)", "", "Argument[0]", "Argument[this].SyntheticField[java.lang.Throwable.message]", "value", "manual"] - ["java.lang", "Throwable", True, "getCause", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.cause]", "ReturnValue", "value", "manual"] - ["java.lang", "Throwable", True, "getMessage", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "value", "manual"] - - ["java.lang", "Throwable", True, "getLocalizedMessage", "()", "", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "value", "manual"] - - ["java.lang", "Throwable", True, "toString", "()", "", "Argument[-1].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "taint", "manual"] + - ["java.lang", "Throwable", True, "getLocalizedMessage", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "value", "manual"] + - ["java.lang", "Throwable", True, "toString", "()", "", "Argument[this].SyntheticField[java.lang.Throwable.message]", "ReturnValue", "taint", "manual"] - addsTo: pack: codeql/java-all diff --git a/java/ql/lib/ext/java.nio.file.model.yml b/java/ql/lib/ext/java.nio.file.model.yml index ce955985e28..2991c20a6b3 100644 --- a/java/ql/lib/ext/java.nio.file.model.yml +++ b/java/ql/lib/ext/java.nio.file.model.yml @@ -45,7 +45,7 @@ extensions: - ["java.nio.file", "FileSystem", True, "getRootDirectories", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] - ["java.nio.file", "Path", True, "getParent", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.nio.file", "Path", True, "normalize", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["java.nio.file", "Path", True, "getFileName", "", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["java.nio.file", "Path", True, "getFileName", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.nio.file", "Path", True, "of", "(String,String[])", "", "Argument[0]", "ReturnValue", "taint", "ai-generated"] - ["java.nio.file", "Path", True, "of", "(String,String[])", "", "Argument[1]", "ReturnValue", "taint", "ai-generated"] - ["java.nio.file", "Path", True, "of", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "ai-generated"] diff --git a/java/ql/lib/ext/java.util.concurrent.atomic.model.yml b/java/ql/lib/ext/java.util.concurrent.atomic.model.yml index fcfa403d5e5..b92ed441ade 100644 --- a/java/ql/lib/ext/java.util.concurrent.atomic.model.yml +++ b/java/ql/lib/ext/java.util.concurrent.atomic.model.yml @@ -5,7 +5,7 @@ extensions: data: - ["java.util.concurrent.atomic", "AtomicReference", False, "AtomicReference", "(Object)", "", "Argument[0]", "Argument[this].SyntheticField[java.util.concurrent.atomic.AtomicReference.value]", "value", "manual"] - ["java.util.concurrent.atomic", "AtomicReference", False, "get", "()", "", "Argument[this].SyntheticField[java.util.concurrent.atomic.AtomicReference.value]", "ReturnValue", "value", "manual"] - - ["java.util.concurrent.atomic", "AtomicReference", False, "set", "(Object)", "", "Argument[0]", "Argument[-1].SyntheticField[java.util.concurrent.atomic.AtomicReference.value]", "value", "manual"] + - ["java.util.concurrent.atomic", "AtomicReference", False, "set", "(Object)", "", "Argument[0]", "Argument[this].SyntheticField[java.util.concurrent.atomic.AtomicReference.value]", "value", "manual"] - addsTo: pack: codeql/java-all diff --git a/java/ql/lib/ext/java.util.concurrent.model.yml b/java/ql/lib/ext/java.util.concurrent.model.yml index b050467260e..723035f408e 100644 --- a/java/ql/lib/ext/java.util.concurrent.model.yml +++ b/java/ql/lib/ext/java.util.concurrent.model.yml @@ -17,13 +17,13 @@ extensions: - ["java.util.concurrent", "BlockingQueue", True, "poll", "(long,TimeUnit)", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - ["java.util.concurrent", "BlockingQueue", True, "put", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util.concurrent", "BlockingQueue", True, "take", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - - ["java.util.concurrent", "CompletableFuture", False, "complete", "(Object)", "", "Argument[0]", "Argument[-1].SyntheticField[java.util.concurrent.Future.value]", "value", "manual"] + - ["java.util.concurrent", "CompletableFuture", False, "complete", "(Object)", "", "Argument[0]", "Argument[this].SyntheticField[java.util.concurrent.Future.value]", "value", "manual"] - ["java.util.concurrent", "CompletableFuture", False, "completedFuture", "(Object)", "", "Argument[0]", "ReturnValue.SyntheticField[java.util.concurrent.Future.value]", "value", "manual"] - - ["java.util.concurrent", "CompletableFuture", False, "join", "()", "", "Argument[-1].SyntheticField[java.util.concurrent.Future.value]", "ReturnValue", "value", "manual"] - - ["java.util.concurrent", "CompletionStage", False, "toCompletableFuture", "()", "", "Argument[-1]", "ReturnValue", "taint", "manual"] + - ["java.util.concurrent", "CompletableFuture", False, "join", "()", "", "Argument[this].SyntheticField[java.util.concurrent.Future.value]", "ReturnValue", "value", "manual"] + - ["java.util.concurrent", "CompletionStage", False, "toCompletableFuture", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.util.concurrent", "ConcurrentHashMap", True, "elements", "()", "", "Argument[this].MapValue", "ReturnValue.Element", "value", "manual"] - ["java.util.concurrent", "ExecutorService", True, "submit", "(Runnable)", "", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["java.util.concurrent", "Future", True, "get", "()", "", "Argument[-1].SyntheticField[java.util.concurrent.Future.value]", "ReturnValue", "value", "manual"] + - ["java.util.concurrent", "Future", True, "get", "()", "", "Argument[this].SyntheticField[java.util.concurrent.Future.value]", "ReturnValue", "value", "manual"] - ["java.util.concurrent", "TransferQueue", True, "transfer", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util.concurrent", "TransferQueue", True, "tryTransfer", "(Object)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] - ["java.util.concurrent", "TransferQueue", True, "tryTransfer", "(Object,long,TimeUnit)", "", "Argument[0]", "Argument[this].Element", "value", "manual"] diff --git a/java/ql/lib/ext/java.util.logging.model.yml b/java/ql/lib/ext/java.util.logging.model.yml index 58f80d47c18..b3f4188ed97 100644 --- a/java/ql/lib/ext/java.util.logging.model.yml +++ b/java/ql/lib/ext/java.util.logging.model.yml @@ -42,7 +42,7 @@ extensions: extensible: summaryModel data: - ["java.util.logging", "Logger", False, "getLogger", "(String)", "", "Argument[0]", "ReturnValue.SyntheticField[java.util.logging.Logger.name]", "value", "manual"] - - ["java.util.logging", "Logger", False, "getName", "()", "", "Argument[-1].SyntheticField[java.util.logging.Logger.name]", "ReturnValue", "value", "manual"] + - ["java.util.logging", "Logger", False, "getName", "()", "", "Argument[this].SyntheticField[java.util.logging.Logger.name]", "ReturnValue", "value", "manual"] - ["java.util.logging", "LogRecord", False, "LogRecord", "", "", "Argument[1]", "Argument[this]", "taint", "manual"] - addsTo: diff --git a/java/ql/lib/ext/java.util.model.yml b/java/ql/lib/ext/java.util.model.yml index 30b5964baed..5df5b1bf4bc 100644 --- a/java/ql/lib/ext/java.util.model.yml +++ b/java/ql/lib/ext/java.util.model.yml @@ -124,8 +124,8 @@ extensions: - ["java.util", "EnumMap", False, "EnumMap", "(Map)", "", "Argument[0].MapValue", "Argument[this].MapValue", "value", "manual"] - ["java.util", "Enumeration", True, "asIterator", "", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"] - ["java.util", "Enumeration", True, "nextElement", "", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - - ["java.util", "EventObject", False, "EventObject", "(Object)", "", "Argument[0]", "Argument[-1].Field[java.util.EventObject.source]", "value", "manual"] - - ["java.util", "EventObject", True, "getSource", "()", "", "Argument[-1].Field[java.util.EventObject.source]", "ReturnValue", "value", "manual"] + - ["java.util", "EventObject", False, "EventObject", "(Object)", "", "Argument[0]", "Argument[this].Field[java.util.EventObject.source]", "value", "manual"] + - ["java.util", "EventObject", True, "getSource", "()", "", "Argument[this].Field[java.util.EventObject.source]", "ReturnValue", "value", "manual"] - ["java.util", "HashMap", False, "HashMap", "(Map)", "", "Argument[0].MapKey", "Argument[this].MapKey", "value", "manual"] - ["java.util", "HashMap", False, "HashMap", "(Map)", "", "Argument[0].MapValue", "Argument[this].MapValue", "value", "manual"] - ["java.util", "HashSet", False, "HashSet", "(Collection)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"] @@ -292,7 +292,7 @@ extensions: - ["java.util", "Queue", True, "peek", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - ["java.util", "Queue", True, "poll", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - ["java.util", "Queue", True, "remove", "()", "", "Argument[this].Element", "ReturnValue", "value", "manual"] - - ["java.util", "ResourceBundle", True, "getString", "(String)", "", "Argument[-1].MapValue", "ReturnValue", "value", "manual"] + - ["java.util", "ResourceBundle", True, "getString", "(String)", "", "Argument[this].MapValue", "ReturnValue", "value", "manual"] - ["java.util", "Scanner", True, "Scanner", "", "", "Argument[0]", "Argument[this]", "taint", "manual"] - ["java.util", "Scanner", True, "findInLine", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.util", "Scanner", True, "findWithinHorizon", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] From 128a6a39516fecf72af549eeed7cb272aa4e6dcb Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Tue, 21 Mar 2023 10:22:02 -0400 Subject: [PATCH 135/143] Java: temp revert of neutral filtering --- java/ql/lib/semmle/code/java/dataflow/FlowSummary.qll | 3 +-- .../code/java/dataflow/internal/DataFlowDispatch.qll | 4 ++-- java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll | 11 +++++------ .../lib/semmle/code/java/dispatch/VirtualDispatch.qll | 4 ++-- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/java/ql/lib/semmle/code/java/dataflow/FlowSummary.qll b/java/ql/lib/semmle/code/java/dataflow/FlowSummary.qll index 6d6af4f82b4..90f1e91a9cf 100644 --- a/java/ql/lib/semmle/code/java/dataflow/FlowSummary.qll +++ b/java/ql/lib/semmle/code/java/dataflow/FlowSummary.qll @@ -171,8 +171,7 @@ class SummarizedCallableBase extends TSummarizedCallableBase { class SummarizedCallable = Impl::Public::SummarizedCallable; -class NeutralCallable = Impl::Public::NeutralCallable; - +// class NeutralCallable = Impl::Public::NeutralCallable; /** * An adapter class to add the flow summaries specified on `SyntheticCallable` * to `SummarizedCallable`. diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowDispatch.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowDispatch.qll index 875fbd43921..a90ea1ece3e 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowDispatch.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowDispatch.qll @@ -11,8 +11,8 @@ private module DispatchImpl { private predicate hasHighConfidenceTarget(Call c) { exists(SummarizedCallable sc | sc.getACall() = c and not sc.isAutoGenerated()) or - exists(NeutralCallable nc | nc.getACall() = c and nc.isManual()) - or + // exists(NeutralCallable nc | nc.getACall() = c and nc.isManual()) + // or exists(Callable srcTgt | srcTgt = VirtualDispatch::viableCallable(c) and not VirtualDispatch::lowConfidenceDispatchTarget(c, srcTgt) diff --git a/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll b/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll index d4c0d7e5ab5..29a71855c04 100644 --- a/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll +++ b/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll @@ -236,12 +236,11 @@ private VirtualMethodAccess objectToString(ObjNode n) { result.getQualifier() = n.asExpr() and sink(n) } -/** - * Holds if `ma` is an `Object.toString()` call taking possibly improved type - * bounds into account. - */ -predicate objectToStringCall(VirtualMethodAccess ma) { ma = objectToString(_) } - +// /** +// * Holds if `ma` is an `Object.toString()` call taking possibly improved type +// * bounds into account. +// */ +// predicate objectToStringCall(VirtualMethodAccess ma) { ma = objectToString(_) } /** * Holds if the qualifier of the `Object.toString()` call `ma` might have type `t`. */ diff --git a/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll b/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll index 4b880542229..b429a6689ef 100644 --- a/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll +++ b/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll @@ -93,8 +93,8 @@ private module Dispatch { exists(RefType t | qualUnionType(ma, t, false) | lowConfidenceDispatchType(t.getSourceDeclaration()) ) - ) and - not ObjFlow::objectToStringCall(ma) + ) //and + //not ObjFlow::objectToStringCall(ma) } private predicate lowConfidenceDispatchType(SrcRefType t) { From 222e6f0b8234d5111bb365a65b6998d9488cf230 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Thu, 23 Mar 2023 17:42:35 -0400 Subject: [PATCH 136/143] Java: undo temp revert of neutral filtering --- java/ql/lib/semmle/code/java/dataflow/FlowSummary.qll | 3 ++- .../code/java/dataflow/internal/DataFlowDispatch.qll | 4 ++-- java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll | 11 ++++++----- .../lib/semmle/code/java/dispatch/VirtualDispatch.qll | 4 ++-- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/java/ql/lib/semmle/code/java/dataflow/FlowSummary.qll b/java/ql/lib/semmle/code/java/dataflow/FlowSummary.qll index 90f1e91a9cf..6d6af4f82b4 100644 --- a/java/ql/lib/semmle/code/java/dataflow/FlowSummary.qll +++ b/java/ql/lib/semmle/code/java/dataflow/FlowSummary.qll @@ -171,7 +171,8 @@ class SummarizedCallableBase extends TSummarizedCallableBase { class SummarizedCallable = Impl::Public::SummarizedCallable; -// class NeutralCallable = Impl::Public::NeutralCallable; +class NeutralCallable = Impl::Public::NeutralCallable; + /** * An adapter class to add the flow summaries specified on `SyntheticCallable` * to `SummarizedCallable`. diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowDispatch.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowDispatch.qll index a90ea1ece3e..875fbd43921 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowDispatch.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowDispatch.qll @@ -11,8 +11,8 @@ private module DispatchImpl { private predicate hasHighConfidenceTarget(Call c) { exists(SummarizedCallable sc | sc.getACall() = c and not sc.isAutoGenerated()) or - // exists(NeutralCallable nc | nc.getACall() = c and nc.isManual()) - // or + exists(NeutralCallable nc | nc.getACall() = c and nc.isManual()) + or exists(Callable srcTgt | srcTgt = VirtualDispatch::viableCallable(c) and not VirtualDispatch::lowConfidenceDispatchTarget(c, srcTgt) diff --git a/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll b/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll index 29a71855c04..d4c0d7e5ab5 100644 --- a/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll +++ b/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll @@ -236,11 +236,12 @@ private VirtualMethodAccess objectToString(ObjNode n) { result.getQualifier() = n.asExpr() and sink(n) } -// /** -// * Holds if `ma` is an `Object.toString()` call taking possibly improved type -// * bounds into account. -// */ -// predicate objectToStringCall(VirtualMethodAccess ma) { ma = objectToString(_) } +/** + * Holds if `ma` is an `Object.toString()` call taking possibly improved type + * bounds into account. + */ +predicate objectToStringCall(VirtualMethodAccess ma) { ma = objectToString(_) } + /** * Holds if the qualifier of the `Object.toString()` call `ma` might have type `t`. */ diff --git a/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll b/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll index b429a6689ef..4b880542229 100644 --- a/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll +++ b/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll @@ -93,8 +93,8 @@ private module Dispatch { exists(RefType t | qualUnionType(ma, t, false) | lowConfidenceDispatchType(t.getSourceDeclaration()) ) - ) //and - //not ObjFlow::objectToStringCall(ma) + ) and + not ObjFlow::objectToStringCall(ma) } private predicate lowConfidenceDispatchType(SrcRefType t) { From b8ceb7112d9835e0f41bf4c4ac5b9938dbb56323 Mon Sep 17 00:00:00 2001 From: Jami Cogswell Date: Thu, 23 Mar 2023 18:07:06 -0400 Subject: [PATCH 137/143] Java: update ordering of Path.getFileName model --- java/ql/lib/ext/java.nio.file.model.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/ql/lib/ext/java.nio.file.model.yml b/java/ql/lib/ext/java.nio.file.model.yml index 2991c20a6b3..6c5c2d13f96 100644 --- a/java/ql/lib/ext/java.nio.file.model.yml +++ b/java/ql/lib/ext/java.nio.file.model.yml @@ -43,9 +43,9 @@ extensions: - ["java.nio.file", "FileSystem", True, "getPath", "(String,String[])", "", "Argument[1]", "ReturnValue", "taint", "ai-generated"] - ["java.nio.file", "FileSystem", True, "getPathMatcher", "(String)", "", "Argument[0]", "ReturnValue", "taint", "ai-generated"] - ["java.nio.file", "FileSystem", True, "getRootDirectories", "", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["java.nio.file", "Path", True, "getFileName", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.nio.file", "Path", True, "getParent", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.nio.file", "Path", True, "normalize", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - - ["java.nio.file", "Path", True, "getFileName", "", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["java.nio.file", "Path", True, "of", "(String,String[])", "", "Argument[0]", "ReturnValue", "taint", "ai-generated"] - ["java.nio.file", "Path", True, "of", "(String,String[])", "", "Argument[1]", "ReturnValue", "taint", "ai-generated"] - ["java.nio.file", "Path", True, "of", "(URI)", "", "Argument[0]", "ReturnValue", "taint", "ai-generated"] From fbda6dc5c6f2a2aa89f7f62e838ef246694514bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Mar 2023 04:01:51 +0000 Subject: [PATCH 138/143] Bump actions/stale from 7 to 8 Bumps [actions/stale](https://github.com/actions/stale) from 7 to 8. - [Release notes](https://github.com/actions/stale/releases) - [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/stale/compare/v7...v8) --- updated-dependencies: - dependency-name: actions/stale dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/close-stale.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/close-stale.yml b/.github/workflows/close-stale.yml index 6bdee05d6a1..9805fb44f48 100644 --- a/.github/workflows/close-stale.yml +++ b/.github/workflows/close-stale.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/stale@v7 + - uses: actions/stale@v8 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-issue-message: 'This issue is stale because it has been open 14 days with no activity. Comment or remove the `Stale` label in order to avoid having this issue closed in 7 days.' From 3e4f35151a4327119b449dc7e985c41d0afd13a8 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 24 Mar 2023 09:02:31 +0100 Subject: [PATCH 139/143] C++: Rename `SslContextCallMake` to `SslContextCallGlobal` This is in line with changes made to the dataflow library --- ...boost-deprecated-dataflow-configurations.md | 2 +- .../cpp/security/boostorg/asio/protocols.qll | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/cpp/ql/lib/change-notes/2023-03-20-boost-deprecated-dataflow-configurations.md b/cpp/ql/lib/change-notes/2023-03-20-boost-deprecated-dataflow-configurations.md index b4389ba5b59..a9d2a4d2c80 100644 --- a/cpp/ql/lib/change-notes/2023-03-20-boost-deprecated-dataflow-configurations.md +++ b/cpp/ql/lib/change-notes/2023-03-20-boost-deprecated-dataflow-configurations.md @@ -1,4 +1,4 @@ --- category: deprecated --- -* The `SslContextCallAbstractConfig`, `SslContextCallConfig`, `SslContextCallBannedProtocolConfig`, `SslContextCallTls12ProtocolConfig`, `SslContextCallTls13ProtocolConfig`, `SslContextCallTlsProtocolConfig`, `SslContextFlowsToSetOptionConfig`, `SslOptionConfig` dataflow configurations from `BoostorgAsio` have been deprecated. Please use `SslContextCallConfigSig`, `SslContextCallMake`, `SslContextCallFlow`, `SslContextCallBannedProtocolFlow`, `SslContextCallTls12ProtocolFlow`, `SslContextCallTls13ProtocolFlow`, `SslContextCallTlsProtocolFlow`, `SslContextFlowsToSetOptionFlow`. +* The `SslContextCallAbstractConfig`, `SslContextCallConfig`, `SslContextCallBannedProtocolConfig`, `SslContextCallTls12ProtocolConfig`, `SslContextCallTls13ProtocolConfig`, `SslContextCallTlsProtocolConfig`, `SslContextFlowsToSetOptionConfig`, `SslOptionConfig` dataflow configurations from `BoostorgAsio` have been deprecated. Please use `SslContextCallConfigSig`, `SslContextCallGlobal`, `SslContextCallFlow`, `SslContextCallBannedProtocolFlow`, `SslContextCallTls12ProtocolFlow`, `SslContextCallTls13ProtocolFlow`, `SslContextCallTlsProtocolFlow`, `SslContextFlowsToSetOptionFlow`. diff --git a/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll b/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll index e53be5980b1..63b11597487 100644 --- a/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll +++ b/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll @@ -394,7 +394,7 @@ module BoostorgAsio { * Constructs a standard data flow computation for protocol values to the first argument * of a context constructor. */ - module SslContextCallMake { + module SslContextCallGlobal { private module C implements DataFlow::ConfigSig { import Config } @@ -402,6 +402,11 @@ module BoostorgAsio { import DataFlow::Global } + /** DEPRECATED: Use `SslContextCallGlobal` instead. */ + deprecated module SslContextCallMake { + import SslContextCallGlobal + } + /** * Any protocol value that flows to the first argument of a context constructor. */ @@ -428,7 +433,7 @@ module BoostorgAsio { } } - module SslContextCallFlow = SslContextCallMake; + module SslContextCallFlow = SslContextCallGlobal; /** * A banned protocol value that flows to the first argument of a context constructor. @@ -458,7 +463,8 @@ module BoostorgAsio { } } - module SslContextCallBannedProtocolFlow = SslContextCallMake; + module SslContextCallBannedProtocolFlow = + SslContextCallGlobal; /** * A TLS 1.2 protocol value that flows to the first argument of a context constructor. @@ -488,7 +494,7 @@ module BoostorgAsio { } } - module SslContextCallTls12ProtocolFlow = SslContextCallMake; + module SslContextCallTls12ProtocolFlow = SslContextCallGlobal; /** * A TLS 1.3 protocol value that flows to the first argument of a context constructor. @@ -518,7 +524,7 @@ module BoostorgAsio { } } - module SslContextCallTls13ProtocolFlow = SslContextCallMake; + module SslContextCallTls13ProtocolFlow = SslContextCallGlobal; /** * A generic TLS protocol value that flows to the first argument of a context constructor. @@ -548,7 +554,7 @@ module BoostorgAsio { } } - module SslContextCallTlsProtocolFlow = SslContextCallMake; + module SslContextCallTlsProtocolFlow = SslContextCallGlobal; /** * A context constructor call that flows to a call to `SetOptions()`. From b816c79248531a7e6a9c95afb1cfd10dee81c691 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 17 Mar 2023 10:49:27 +0100 Subject: [PATCH 140/143] Ruby: Include all assignments in data flow paths --- ruby/ql/lib/codeql/ruby/dataflow/SSA.qll | 4 +- .../dataflow/internal/DataFlowPrivate.qll | 15 +- .../dataflow/array-flow/array-flow.expected | 3980 ++++++++++++----- .../flow-summaries/semantics.expected | 526 ++- .../dataflow/global/Flow.expected | 16 +- .../dataflow/hash-flow/hash-flow.expected | 840 +++- .../dataflow/local/DataflowStep.expected | 264 +- .../dataflow/local/InlineFlowTest.expected | 116 +- .../dataflow/local/TaintStep.expected | 264 +- .../dataflow/params/params-flow.expected | 20 +- .../pathname-flow/pathame-flow.expected | 160 +- .../dataflow/string-flow/string-flow.expected | 400 +- .../dataflow/summaries/Summaries.expected | 196 +- .../type-tracker/TypeTracker.expected | 30 +- .../active_record/ActiveRecord.expected | 10 +- .../active_resource/ActiveResource.expected | 10 +- .../active_storage/ActiveStorage.expected | 4 +- .../ActiveSupportDataFlow.expected | 720 ++- .../frameworks/files/Files.expected | 12 +- .../frameworks/pathname/Pathname.expected | 20 +- .../test/library-tests/variables/ssa.expected | 360 +- .../TemplateInjection.expected | 28 +- .../cwe-022-ZipSlip/ZipSlip.expected | 20 +- .../ManuallyCheckHttpVerb.expected | 20 +- .../security/cwe-022/PathInjection.expected | 60 +- .../CommandInjection.expected | 30 +- .../cwe-078/KernelOpen/KernelOpen.expected | 22 +- .../security/cwe-079/ReflectedXSS.expected | 10 +- .../security/cwe-079/StoredXSS.expected | 6 +- .../security/cwe-089/SqlInjection.expected | 22 +- .../CodeInjection/CodeInjection.expected | 40 +- .../UnsafeCodeConstruction.expected | 12 +- .../security/cwe-117/LogInjection.expected | 24 +- .../PolynomialReDoS.expected | 58 +- .../RegExpInjection.expected | 20 +- .../cwe-209/StackTraceExposure.expected | 4 +- .../cwe-312/CleartextLogging.expected | 60 +- .../cwe-312/CleartextStorage.expected | 56 +- .../UnsafeDeserialization.expected | 4 +- .../UnsafeDeserialization.expected | 38 +- .../HardcodedDataInterpretedAsCode.expected | 8 +- .../cwe-598/SensitiveGetQuery.expected | 4 +- .../cwe-611/libxml-backend/Xxe.expected | 10 +- .../security/cwe-611/xxe/Xxe.expected | 50 +- .../cwe-732/WeakFilePermissions.expected | 14 +- .../cwe-798/HardcodedCredentials.expected | 10 +- .../ConditionalBypass.expected | 8 +- .../cwe-829/InsecureDownload.expected | 8 +- .../cwe-912/HttpToFileAccess.expected | 8 +- .../cwe-918/ServerSideRequestForgery.expected | 4 +- .../DecompressionApi.expected | 4 +- 51 files changed, 5859 insertions(+), 2770 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll b/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll index 241b2bb763a..97bb3407b57 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll @@ -216,9 +216,9 @@ module Ssa { ) } - final override string toString() { result = Definition.super.toString() } + final override string toString() { result = write.toString() } - final override Location getLocation() { result = this.getControlFlowNode().getLocation() } + final override Location getLocation() { result = write.getLocation() } } /** diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index cfce508e706..cd84298c41a 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -528,10 +528,7 @@ import Cached /** Holds if `n` should be hidden from path explanations. */ predicate nodeIsHidden(Node n) { exists(SsaImpl::DefinitionExt def | def = n.(SsaDefinitionExtNode).getDefinitionExt() | - def instanceof Ssa::PhiNode or - def instanceof SsaImpl::PhiReadNode or - def instanceof Ssa::CapturedEntryDefinition or - def instanceof Ssa::CapturedCallDefinition + not def instanceof Ssa::WriteDefinition ) or n = LocalFlow::getParameterDefNode(_) @@ -1333,7 +1330,15 @@ private module PostUpdateNodes { private import PostUpdateNodes /** A node that performs a type cast. */ -class CastNode extends Node instanceof ReturningNode { } +class CastNode extends Node { + CastNode() { + // ensure that actual return nodes are included in the path graph + this instanceof ReturningNode + or + // ensure that all variable assignments are included in the path graph + this.(SsaDefinitionExtNode).getDefinitionExt() instanceof Ssa::WriteDefinition + } +} class DataFlowExpr = CfgNodes::ExprCfgNode; 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 399a65de525..2e813207b6a 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,103 +1,135 @@ failures edges -| array_flow.rb:2:9:2:20 | * ... [element 0] : | array_flow.rb:3:10:3:10 | a [element 0] : | -| array_flow.rb:2:9:2:20 | * ... [element 0] : | array_flow.rb:3:10:3:10 | a [element 0] : | -| array_flow.rb:2:9:2:20 | * ... [element 0] : | array_flow.rb:5:10:5:10 | a [element 0] : | -| array_flow.rb:2:9:2:20 | * ... [element 0] : | array_flow.rb:5:10:5:10 | a [element 0] : | +| array_flow.rb:2:5:2:5 | a [element 0] : | array_flow.rb:3:10:3:10 | a [element 0] : | +| array_flow.rb:2:5:2:5 | a [element 0] : | array_flow.rb:3:10:3:10 | a [element 0] : | +| array_flow.rb:2:5:2:5 | a [element 0] : | array_flow.rb:5:10:5:10 | a [element 0] : | +| array_flow.rb:2:5:2:5 | a [element 0] : | array_flow.rb:5:10:5:10 | a [element 0] : | +| array_flow.rb:2:9:2:20 | * ... [element 0] : | array_flow.rb:2:5:2:5 | a [element 0] : | +| array_flow.rb:2:9:2:20 | * ... [element 0] : | array_flow.rb:2:5:2:5 | a [element 0] : | | array_flow.rb:2:10:2:20 | call to source : | array_flow.rb:2:9:2:20 | * ... [element 0] : | | array_flow.rb:2:10:2:20 | call to source : | array_flow.rb:2:9:2:20 | * ... [element 0] : | | array_flow.rb:3:10:3:10 | a [element 0] : | array_flow.rb:3:10:3:13 | ...[...] | | array_flow.rb:3:10:3:10 | a [element 0] : | array_flow.rb:3:10:3:13 | ...[...] | | array_flow.rb:5:10:5:10 | a [element 0] : | array_flow.rb:5:10:5:13 | ...[...] | | array_flow.rb:5:10:5:10 | a [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 [element 1] : | -| array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:11:10:11:10 | a [element 1] : | -| array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:13:10:13:10 | a [element 1] : | -| array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:13:10:13:10 | a [element 1] : | +| array_flow.rb:9:5:9:5 | a [element 1] : | array_flow.rb:11:10:11:10 | a [element 1] : | +| array_flow.rb:9:5:9:5 | a [element 1] : | array_flow.rb:11:10:11:10 | a [element 1] : | +| array_flow.rb:9:5:9:5 | a [element 1] : | array_flow.rb:13:10:13:10 | a [element 1] : | +| array_flow.rb:9:5:9:5 | a [element 1] : | array_flow.rb:13:10:13:10 | a [element 1] : | +| array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:9:5:9:5 | a [element 1] : | +| array_flow.rb:9:13:9:21 | call to source : | array_flow.rb:9:5:9:5 | a [element 1] : | | array_flow.rb:11:10:11:10 | a [element 1] : | array_flow.rb:11:10:11:13 | ...[...] | | array_flow.rb:11:10:11:10 | a [element 1] : | array_flow.rb:11:10:11:13 | ...[...] | | array_flow.rb:13:10:13:10 | a [element 1] : | array_flow.rb:13:10:13:13 | ...[...] | | array_flow.rb:13:10:13:10 | a [element 1] : | array_flow.rb:13:10:13:13 | ...[...] | -| array_flow.rb:17:9:17:33 | call to new [element] : | array_flow.rb:18:10:18:10 | a [element] : | -| array_flow.rb:17:9:17:33 | call to new [element] : | array_flow.rb:18:10:18:10 | a [element] : | -| array_flow.rb:17:9:17:33 | call to new [element] : | array_flow.rb:19:10:19:10 | a [element] : | -| array_flow.rb:17:9:17:33 | call to new [element] : | array_flow.rb:19:10:19:10 | a [element] : | -| array_flow.rb:17:9:17:33 | call to new [element] : | array_flow.rb:21:19:21:19 | a [element] : | -| array_flow.rb:17:9:17:33 | call to new [element] : | array_flow.rb:21:19:21:19 | a [element] : | +| array_flow.rb:17:5:17:5 | a [element] : | array_flow.rb:18:10:18:10 | a [element] : | +| array_flow.rb:17:5:17:5 | a [element] : | array_flow.rb:18:10:18:10 | a [element] : | +| array_flow.rb:17:5:17:5 | a [element] : | array_flow.rb:19:10:19:10 | a [element] : | +| array_flow.rb:17:5:17:5 | a [element] : | array_flow.rb:19:10:19:10 | a [element] : | +| array_flow.rb:17:5:17:5 | a [element] : | array_flow.rb:21:19:21:19 | a [element] : | +| array_flow.rb:17:5:17:5 | a [element] : | array_flow.rb:21:19:21:19 | a [element] : | +| array_flow.rb:17:9:17:33 | call to new [element] : | array_flow.rb:17:5:17:5 | a [element] : | +| array_flow.rb:17:9:17:33 | call to new [element] : | array_flow.rb:17:5:17:5 | a [element] : | | array_flow.rb:17:22:17:32 | call to source : | array_flow.rb:17:9:17:33 | call to new [element] : | | array_flow.rb:17:22:17:32 | call to source : | array_flow.rb:17:9:17:33 | call to new [element] : | | array_flow.rb:18:10:18:10 | a [element] : | array_flow.rb:18:10:18:13 | ...[...] | | array_flow.rb:18:10:18:10 | a [element] : | array_flow.rb:18:10:18:13 | ...[...] | | array_flow.rb:19:10:19:10 | a [element] : | array_flow.rb:19:10:19:13 | ...[...] | | array_flow.rb:19:10:19:10 | a [element] : | array_flow.rb:19:10:19:13 | ...[...] | -| array_flow.rb:21:9:21:20 | call to new [element] : | array_flow.rb:22:10:22:10 | b [element] : | -| array_flow.rb:21:9:21:20 | call to new [element] : | array_flow.rb:22:10:22:10 | b [element] : | -| array_flow.rb:21:9:21:20 | call to new [element] : | array_flow.rb:23:10:23:10 | b [element] : | -| array_flow.rb:21:9:21:20 | call to new [element] : | array_flow.rb:23:10:23:10 | b [element] : | +| array_flow.rb:21:5:21:5 | b [element] : | array_flow.rb:22:10:22:10 | b [element] : | +| array_flow.rb:21:5:21:5 | b [element] : | array_flow.rb:22:10:22:10 | b [element] : | +| array_flow.rb:21:5:21:5 | b [element] : | array_flow.rb:23:10:23:10 | b [element] : | +| array_flow.rb:21:5:21:5 | b [element] : | array_flow.rb:23:10:23:10 | b [element] : | +| array_flow.rb:21:9:21:20 | call to new [element] : | array_flow.rb:21:5:21:5 | b [element] : | +| array_flow.rb:21:9:21:20 | call to new [element] : | array_flow.rb:21:5:21:5 | b [element] : | | array_flow.rb:21:19:21:19 | a [element] : | array_flow.rb:21:9:21:20 | call to new [element] : | | array_flow.rb:21:19:21:19 | a [element] : | array_flow.rb:21:9:21:20 | call to new [element] : | | array_flow.rb:22:10:22:10 | b [element] : | array_flow.rb:22:10:22:13 | ...[...] | | array_flow.rb:22:10:22:10 | b [element] : | array_flow.rb:22:10:22:13 | ...[...] | | array_flow.rb:23:10:23:10 | b [element] : | array_flow.rb:23:10:23:13 | ...[...] | | array_flow.rb:23:10:23:10 | b [element] : | array_flow.rb:23:10:23:13 | ...[...] | -| array_flow.rb:25:9:27:7 | call to new [element] : | array_flow.rb:28:10:28:10 | c [element] : | -| array_flow.rb:25:9:27:7 | call to new [element] : | array_flow.rb:28:10:28:10 | c [element] : | -| array_flow.rb:25:9:27:7 | call to new [element] : | array_flow.rb:29:10:29:10 | c [element] : | -| array_flow.rb:25:9:27:7 | call to new [element] : | array_flow.rb:29:10:29:10 | c [element] : | +| array_flow.rb:25:5:25:5 | c [element] : | array_flow.rb:28:10:28:10 | c [element] : | +| array_flow.rb:25:5:25:5 | c [element] : | array_flow.rb:28:10:28:10 | c [element] : | +| array_flow.rb:25:5:25:5 | c [element] : | array_flow.rb:29:10:29:10 | c [element] : | +| array_flow.rb:25:5:25:5 | c [element] : | array_flow.rb:29:10:29:10 | c [element] : | +| array_flow.rb:25:9:27:7 | call to new [element] : | array_flow.rb:25:5:25:5 | c [element] : | +| array_flow.rb:25:9:27:7 | call to new [element] : | array_flow.rb:25:5:25:5 | c [element] : | | array_flow.rb:26:9:26:19 | call to source : | array_flow.rb:25:9:27:7 | call to new [element] : | | array_flow.rb:26:9:26:19 | call to source : | array_flow.rb:25:9:27:7 | call to new [element] : | | array_flow.rb:28:10:28:10 | c [element] : | array_flow.rb:28:10:28:13 | ...[...] | | array_flow.rb:28:10:28:10 | c [element] : | array_flow.rb:28:10:28:13 | ...[...] | | array_flow.rb:29:10:29:10 | c [element] : | array_flow.rb:29:10:29:13 | ...[...] | | array_flow.rb:29:10:29:10 | c [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 [element 0] : | -| array_flow.rb:33:10:33:18 | call to source : | array_flow.rb:34:27:34:27 | a [element 0] : | -| array_flow.rb:34:9:34:28 | call to try_convert [element 0] : | array_flow.rb:35:10:35:10 | b [element 0] : | -| array_flow.rb:34:9:34:28 | call to try_convert [element 0] : | array_flow.rb:35:10:35:10 | b [element 0] : | +| array_flow.rb:33:5:33:5 | a [element 0] : | array_flow.rb:34:27:34:27 | a [element 0] : | +| array_flow.rb:33:5:33:5 | a [element 0] : | array_flow.rb:34:27:34:27 | a [element 0] : | +| array_flow.rb:33:10:33:18 | call to source : | array_flow.rb:33:5:33:5 | a [element 0] : | +| array_flow.rb:33:10:33:18 | call to source : | array_flow.rb:33:5:33:5 | a [element 0] : | +| array_flow.rb:34:5:34:5 | b [element 0] : | array_flow.rb:35:10:35:10 | b [element 0] : | +| array_flow.rb:34:5:34:5 | b [element 0] : | array_flow.rb:35:10:35:10 | b [element 0] : | +| array_flow.rb:34:9:34:28 | call to try_convert [element 0] : | array_flow.rb:34:5:34:5 | b [element 0] : | +| array_flow.rb:34:9:34:28 | call to try_convert [element 0] : | array_flow.rb:34:5:34:5 | b [element 0] : | | array_flow.rb:34:27:34:27 | a [element 0] : | array_flow.rb:34:9:34:28 | call to try_convert [element 0] : | | array_flow.rb:34:27:34:27 | a [element 0] : | array_flow.rb:34:9:34:28 | call to try_convert [element 0] : | | array_flow.rb:35:10:35:10 | b [element 0] : | array_flow.rb:35:10:35:13 | ...[...] | | array_flow.rb:35:10:35:10 | b [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 [element 0] : | -| array_flow.rb:40:10:40:20 | call to source : | array_flow.rb:42:9:42:9 | a [element 0] : | -| array_flow.rb:41:16:41:26 | call to source : | array_flow.rb:42:13:42:13 | b [element 2] : | -| array_flow.rb:41:16:41:26 | call to source : | array_flow.rb:42:13:42:13 | b [element 2] : | +| array_flow.rb:40:5:40:5 | a [element 0] : | array_flow.rb:42:9:42:9 | a [element 0] : | +| array_flow.rb:40:5:40:5 | a [element 0] : | array_flow.rb:42:9:42:9 | a [element 0] : | +| array_flow.rb:40:10:40:20 | call to source : | array_flow.rb:40:5:40:5 | a [element 0] : | +| array_flow.rb:40:10:40:20 | call to source : | array_flow.rb:40:5:40:5 | a [element 0] : | +| array_flow.rb:41:5:41:5 | b [element 2] : | array_flow.rb:42:13:42:13 | b [element 2] : | +| array_flow.rb:41:5:41:5 | b [element 2] : | array_flow.rb:42:13:42:13 | b [element 2] : | +| array_flow.rb:41:16:41:26 | call to source : | array_flow.rb:41:5:41:5 | b [element 2] : | +| array_flow.rb:41:16:41:26 | call to source : | array_flow.rb:41:5:41:5 | b [element 2] : | +| array_flow.rb:42:5:42:5 | c [element] : | array_flow.rb:43:10:43:10 | c [element] : | +| array_flow.rb:42:5:42:5 | c [element] : | array_flow.rb:43:10:43:10 | c [element] : | +| array_flow.rb:42:5:42:5 | c [element] : | array_flow.rb:44:10:44:10 | c [element] : | +| array_flow.rb:42:5:42:5 | c [element] : | array_flow.rb:44:10:44:10 | c [element] : | | array_flow.rb:42:9:42:9 | a [element 0] : | array_flow.rb:42:9:42:13 | ... & ... [element] : | | array_flow.rb:42:9:42:9 | a [element 0] : | array_flow.rb:42:9:42:13 | ... & ... [element] : | -| array_flow.rb:42:9:42:13 | ... & ... [element] : | array_flow.rb:43:10:43:10 | c [element] : | -| array_flow.rb:42:9:42:13 | ... & ... [element] : | array_flow.rb:43:10:43:10 | c [element] : | -| array_flow.rb:42:9:42:13 | ... & ... [element] : | array_flow.rb:44:10:44:10 | c [element] : | -| array_flow.rb:42:9:42:13 | ... & ... [element] : | array_flow.rb:44:10:44:10 | c [element] : | +| array_flow.rb:42:9:42:13 | ... & ... [element] : | array_flow.rb:42:5:42:5 | c [element] : | +| array_flow.rb:42:9:42:13 | ... & ... [element] : | array_flow.rb:42:5:42:5 | c [element] : | | array_flow.rb:42:13:42:13 | b [element 2] : | array_flow.rb:42:9:42:13 | ... & ... [element] : | | array_flow.rb:42:13:42:13 | b [element 2] : | array_flow.rb:42:9:42:13 | ... & ... [element] : | | array_flow.rb:43:10:43:10 | c [element] : | array_flow.rb:43:10:43:13 | ...[...] | | array_flow.rb:43:10:43:10 | c [element] : | array_flow.rb:43:10:43:13 | ...[...] | | array_flow.rb:44:10:44:10 | c [element] : | array_flow.rb:44:10:44:13 | ...[...] | | array_flow.rb:44:10:44:10 | c [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 [element 0] : | -| array_flow.rb:48:10:48:18 | call to source : | array_flow.rb:49:9:49:9 | a [element 0] : | +| array_flow.rb:48:5:48:5 | a [element 0] : | array_flow.rb:49:9:49:9 | a [element 0] : | +| array_flow.rb:48:5:48:5 | a [element 0] : | array_flow.rb:49:9:49:9 | a [element 0] : | +| array_flow.rb:48:10:48:18 | call to source : | array_flow.rb:48:5:48:5 | a [element 0] : | +| array_flow.rb:48:10:48:18 | call to source : | array_flow.rb:48:5:48:5 | a [element 0] : | +| array_flow.rb:49:5:49:5 | b [element] : | array_flow.rb:50:10:50:10 | b [element] : | +| array_flow.rb:49:5:49:5 | b [element] : | array_flow.rb:50:10:50:10 | b [element] : | +| array_flow.rb:49:5:49:5 | b [element] : | array_flow.rb:51:10:51:10 | b [element] : | +| array_flow.rb:49:5:49:5 | b [element] : | array_flow.rb:51:10:51:10 | b [element] : | | array_flow.rb:49:9:49:9 | a [element 0] : | array_flow.rb:49:9:49:13 | ... * ... [element] : | | array_flow.rb:49:9:49:9 | a [element 0] : | array_flow.rb:49:9:49:13 | ... * ... [element] : | -| array_flow.rb:49:9:49:13 | ... * ... [element] : | array_flow.rb:50:10:50:10 | b [element] : | -| array_flow.rb:49:9:49:13 | ... * ... [element] : | array_flow.rb:50:10:50:10 | b [element] : | -| array_flow.rb:49:9:49:13 | ... * ... [element] : | array_flow.rb:51:10:51:10 | b [element] : | -| array_flow.rb:49:9:49:13 | ... * ... [element] : | array_flow.rb:51:10:51:10 | b [element] : | +| array_flow.rb:49:9:49:13 | ... * ... [element] : | array_flow.rb:49:5:49:5 | b [element] : | +| array_flow.rb:49:9:49:13 | ... * ... [element] : | array_flow.rb:49:5:49:5 | b [element] : | | array_flow.rb:50:10:50:10 | b [element] : | array_flow.rb:50:10:50:13 | ...[...] | | array_flow.rb:50:10:50:10 | b [element] : | array_flow.rb:50:10:50:13 | ...[...] | | array_flow.rb:51:10:51:10 | b [element] : | array_flow.rb:51:10:51:13 | ...[...] | | array_flow.rb:51:10:51:10 | b [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 [element 0] : | -| array_flow.rb:55:10:55:20 | call to source : | array_flow.rb:57:9:57:9 | a [element 0] : | -| array_flow.rb:56:13:56:23 | call to source : | array_flow.rb:57:13:57:13 | b [element 1] : | -| array_flow.rb:56:13:56:23 | call to source : | array_flow.rb:57:13:57:13 | b [element 1] : | +| array_flow.rb:55:5:55:5 | a [element 0] : | array_flow.rb:57:9:57:9 | a [element 0] : | +| array_flow.rb:55:5:55:5 | a [element 0] : | array_flow.rb:57:9:57:9 | a [element 0] : | +| array_flow.rb:55:10:55:20 | call to source : | array_flow.rb:55:5:55:5 | a [element 0] : | +| array_flow.rb:55:10:55:20 | call to source : | array_flow.rb:55:5:55:5 | a [element 0] : | +| array_flow.rb:56:5:56:5 | b [element 1] : | array_flow.rb:57:13:57:13 | b [element 1] : | +| array_flow.rb:56:5:56:5 | b [element 1] : | array_flow.rb:57:13:57:13 | b [element 1] : | +| array_flow.rb:56:13:56:23 | call to source : | array_flow.rb:56:5:56:5 | b [element 1] : | +| array_flow.rb:56:13:56:23 | call to source : | array_flow.rb:56:5:56:5 | b [element 1] : | +| array_flow.rb:57:5:57:5 | c [element 0] : | array_flow.rb:58:10:58:10 | c [element 0] : | +| array_flow.rb:57:5:57:5 | c [element 0] : | array_flow.rb:58:10:58:10 | c [element 0] : | +| array_flow.rb:57:5:57:5 | c [element] : | array_flow.rb:58:10:58:10 | c [element] : | +| array_flow.rb:57:5:57:5 | c [element] : | array_flow.rb:58:10:58:10 | c [element] : | +| array_flow.rb:57:5:57:5 | c [element] : | array_flow.rb:59:10:59:10 | c [element] : | +| array_flow.rb:57:5:57:5 | c [element] : | array_flow.rb:59:10:59:10 | c [element] : | | array_flow.rb:57:9:57:9 | a [element 0] : | array_flow.rb:57:9:57:13 | ... + ... [element 0] : | | array_flow.rb:57:9:57:9 | a [element 0] : | array_flow.rb:57:9:57:13 | ... + ... [element 0] : | -| array_flow.rb:57:9:57:13 | ... + ... [element 0] : | array_flow.rb:58:10:58:10 | c [element 0] : | -| array_flow.rb:57:9:57:13 | ... + ... [element 0] : | array_flow.rb:58:10:58:10 | c [element 0] : | -| array_flow.rb:57:9:57:13 | ... + ... [element] : | array_flow.rb:58:10:58:10 | c [element] : | -| array_flow.rb:57:9:57:13 | ... + ... [element] : | array_flow.rb:58:10:58:10 | c [element] : | -| array_flow.rb:57:9:57:13 | ... + ... [element] : | array_flow.rb:59:10:59:10 | c [element] : | -| array_flow.rb:57:9:57:13 | ... + ... [element] : | array_flow.rb:59:10:59:10 | c [element] : | +| array_flow.rb:57:9:57:13 | ... + ... [element 0] : | array_flow.rb:57:5:57:5 | c [element 0] : | +| array_flow.rb:57:9:57:13 | ... + ... [element 0] : | array_flow.rb:57:5:57:5 | c [element 0] : | +| array_flow.rb:57:9:57:13 | ... + ... [element] : | array_flow.rb:57:5:57:5 | c [element] : | +| array_flow.rb:57:9:57:13 | ... + ... [element] : | array_flow.rb:57:5:57:5 | c [element] : | | array_flow.rb:57:13:57:13 | b [element 1] : | array_flow.rb:57:9:57:13 | ... + ... [element] : | | array_flow.rb:57:13:57:13 | b [element 1] : | array_flow.rb:57:9:57:13 | ... + ... [element] : | | array_flow.rb:58:10:58:10 | c [element 0] : | array_flow.rb:58:10:58:13 | ...[...] | @@ -106,40 +138,51 @@ edges | array_flow.rb:58:10:58:10 | c [element] : | array_flow.rb:58:10:58:13 | ...[...] | | array_flow.rb:59:10:59:10 | c [element] : | array_flow.rb:59:10:59:13 | ...[...] | | array_flow.rb:59:10:59:10 | c [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 [element 0] : | -| array_flow.rb:63:10:63:20 | call to source : | array_flow.rb:65:9:65:9 | a [element 0] : | +| array_flow.rb:63:5:63:5 | a [element 0] : | array_flow.rb:65:9:65:9 | a [element 0] : | +| array_flow.rb:63:5:63:5 | a [element 0] : | array_flow.rb:65:9:65:9 | a [element 0] : | +| array_flow.rb:63:10:63:20 | call to source : | array_flow.rb:63:5:63:5 | a [element 0] : | +| array_flow.rb:63:10:63:20 | call to source : | array_flow.rb:63:5:63:5 | a [element 0] : | +| array_flow.rb:65:5:65:5 | c [element] : | array_flow.rb:66:10:66:10 | c [element] : | +| array_flow.rb:65:5:65:5 | c [element] : | array_flow.rb:66:10:66:10 | c [element] : | +| array_flow.rb:65:5:65:5 | c [element] : | array_flow.rb:67:10:67:10 | c [element] : | +| array_flow.rb:65:5:65:5 | c [element] : | array_flow.rb:67:10:67:10 | c [element] : | | array_flow.rb:65:9:65:9 | a [element 0] : | array_flow.rb:65:9:65:13 | ... - ... [element] : | | array_flow.rb:65:9:65:9 | a [element 0] : | array_flow.rb:65:9:65:13 | ... - ... [element] : | -| array_flow.rb:65:9:65:13 | ... - ... [element] : | array_flow.rb:66:10:66:10 | c [element] : | -| array_flow.rb:65:9:65:13 | ... - ... [element] : | array_flow.rb:66:10:66:10 | c [element] : | -| array_flow.rb:65:9:65:13 | ... - ... [element] : | array_flow.rb:67:10:67:10 | c [element] : | -| array_flow.rb:65:9:65:13 | ... - ... [element] : | array_flow.rb:67:10:67:10 | c [element] : | +| array_flow.rb:65:9:65:13 | ... - ... [element] : | array_flow.rb:65:5:65:5 | c [element] : | +| array_flow.rb:65:9:65:13 | ... - ... [element] : | array_flow.rb:65:5:65:5 | c [element] : | | array_flow.rb:66:10:66:10 | c [element] : | array_flow.rb:66:10:66:13 | ...[...] | | array_flow.rb:66:10:66:10 | c [element] : | array_flow.rb:66:10:66:13 | ...[...] | | array_flow.rb:67:10:67:10 | c [element] : | array_flow.rb:67:10:67:13 | ...[...] | | array_flow.rb:67:10:67:10 | c [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 [element 0] : | -| array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:72:9:72:9 | a [element 0] : | -| array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:73:10:73:10 | a [element 0] : | -| array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:73:10:73:10 | a [element 0] : | +| array_flow.rb:71:5:71:5 | a [element 0] : | array_flow.rb:72:9:72:9 | a [element 0] : | +| array_flow.rb:71:5:71:5 | a [element 0] : | array_flow.rb:72:9:72:9 | a [element 0] : | +| array_flow.rb:71:5:71:5 | a [element 0] : | array_flow.rb:73:10:73:10 | a [element 0] : | +| array_flow.rb:71:5:71:5 | a [element 0] : | array_flow.rb:73:10:73:10 | a [element 0] : | +| array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:71:5:71:5 | a [element 0] : | +| array_flow.rb:71:10:71:20 | call to source : | array_flow.rb:71:5:71:5 | a [element 0] : | +| array_flow.rb:72:5:72:5 | b : | array_flow.rb:75:10:75:10 | b : | +| array_flow.rb:72:5:72:5 | b : | array_flow.rb:76:10:76:10 | b : | +| array_flow.rb:72:5:72:5 | b [element 0] : | array_flow.rb:75:10:75:10 | b [element 0] : | +| array_flow.rb:72:5:72:5 | b [element 0] : | array_flow.rb:75:10:75:10 | b [element 0] : | +| array_flow.rb:72:5:72:5 | b [element] : | array_flow.rb:75:10:75:10 | b [element] : | +| array_flow.rb:72:5:72:5 | b [element] : | array_flow.rb:75:10:75:10 | b [element] : | +| array_flow.rb:72:5:72:5 | b [element] : | array_flow.rb:76:10:76:10 | b [element] : | +| array_flow.rb:72:5:72:5 | b [element] : | array_flow.rb:76:10:76:10 | b [element] : | | array_flow.rb:72:9:72:9 | [post] a [element] : | array_flow.rb:73:10:73:10 | a [element] : | | array_flow.rb:72:9:72:9 | [post] a [element] : | array_flow.rb:73:10:73:10 | a [element] : | | array_flow.rb:72:9:72:9 | [post] a [element] : | array_flow.rb:74:10:74:10 | a [element] : | | array_flow.rb:72:9:72:9 | [post] a [element] : | array_flow.rb:74:10:74:10 | a [element] : | | array_flow.rb:72:9:72:9 | a [element 0] : | array_flow.rb:72:9:72:24 | ... << ... [element 0] : | | array_flow.rb:72:9:72:9 | a [element 0] : | array_flow.rb:72:9:72:24 | ... << ... [element 0] : | -| array_flow.rb:72:9:72:24 | ... << ... [element 0] : | array_flow.rb:75:10:75:10 | b [element 0] : | -| array_flow.rb:72:9:72:24 | ... << ... [element 0] : | array_flow.rb:75:10:75:10 | b [element 0] : | -| array_flow.rb:72:9:72:24 | ... << ... [element] : | array_flow.rb:75:10:75:10 | b [element] : | -| array_flow.rb:72:9:72:24 | ... << ... [element] : | array_flow.rb:75:10:75:10 | b [element] : | -| array_flow.rb:72:9:72:24 | ... << ... [element] : | array_flow.rb:76:10:76:10 | b [element] : | -| array_flow.rb:72:9:72:24 | ... << ... [element] : | array_flow.rb:76:10:76:10 | b [element] : | +| array_flow.rb:72:9:72:24 | ... << ... [element 0] : | array_flow.rb:72:5:72:5 | b [element 0] : | +| array_flow.rb:72:9:72:24 | ... << ... [element 0] : | array_flow.rb:72:5:72:5 | b [element 0] : | +| array_flow.rb:72:9:72:24 | ... << ... [element] : | array_flow.rb:72:5:72:5 | b [element] : | +| array_flow.rb:72:9:72:24 | ... << ... [element] : | array_flow.rb:72:5:72:5 | b [element] : | +| array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:72:5:72:5 | b : | | array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:72:9:72:9 | [post] a [element] : | | array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:72:9:72:9 | [post] a [element] : | | array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:72:9:72:24 | ... << ... [element] : | | array_flow.rb:72:14:72:24 | call to source : | array_flow.rb:72:9:72:24 | ... << ... [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 [element 0] : | array_flow.rb:73:10:73:13 | ...[...] | | array_flow.rb:73:10:73:10 | a [element 0] : | array_flow.rb:73:10:73:13 | ...[...] | | array_flow.rb:73:10:73:10 | a [element] : | array_flow.rb:73:10:73:13 | ...[...] | @@ -154,70 +197,96 @@ edges | array_flow.rb:76:10:76:10 | b : | array_flow.rb:76:10:76:13 | ...[...] | | array_flow.rb:76:10:76:10 | b [element] : | array_flow.rb:76:10:76:13 | ...[...] | | array_flow.rb:76:10:76:10 | b [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 [element 1] : | -| array_flow.rb:80:13:80:21 | call to source : | array_flow.rb:81:15:81:15 | a [element 1] : | -| array_flow.rb:81:15:81:15 | a [element 1] : | array_flow.rb:83:10:83:10 | c | -| array_flow.rb:81:15:81:15 | a [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 [element 1] : | -| array_flow.rb:88:13:88:22 | call to source : | array_flow.rb:89:9:89:9 | a [element 1] : | +| array_flow.rb:80:5:80:5 | a [element 1] : | array_flow.rb:81:15:81:15 | a [element 1] : | +| array_flow.rb:80:5:80:5 | a [element 1] : | array_flow.rb:81:15:81:15 | a [element 1] : | +| array_flow.rb:80:13:80:21 | call to source : | array_flow.rb:80:5:80:5 | a [element 1] : | +| array_flow.rb:80:13:80:21 | call to source : | array_flow.rb:80:5:80:5 | a [element 1] : | +| array_flow.rb:81:8:81:8 | c : | array_flow.rb:83:10:83:10 | c | +| array_flow.rb:81:8:81:8 | c : | array_flow.rb:83:10:83:10 | c | +| array_flow.rb:81:15:81:15 | __synth__0 [element 1] : | array_flow.rb:81:8:81:8 | c : | +| array_flow.rb:81:15:81:15 | __synth__0 [element 1] : | array_flow.rb:81:8:81:8 | c : | +| array_flow.rb:81:15:81:15 | a [element 1] : | array_flow.rb:81:15:81:15 | __synth__0 [element 1] : | +| array_flow.rb:81:15:81:15 | a [element 1] : | array_flow.rb:81:15:81:15 | __synth__0 [element 1] : | +| array_flow.rb:88:5:88:5 | a [element 1] : | array_flow.rb:89:9:89:9 | a [element 1] : | +| array_flow.rb:88:5:88:5 | a [element 1] : | array_flow.rb:89:9:89:9 | a [element 1] : | +| array_flow.rb:88:13:88:22 | call to source : | array_flow.rb:88:5:88:5 | a [element 1] : | +| array_flow.rb:88:13:88:22 | call to source : | array_flow.rb:88:5:88:5 | a [element 1] : | +| array_flow.rb:89:5:89:5 | b [element 1] : | array_flow.rb:91:10:91:10 | b [element 1] : | +| array_flow.rb:89:5:89:5 | b [element 1] : | array_flow.rb:91:10:91:10 | b [element 1] : | +| array_flow.rb:89:5:89:5 | b [element 1] : | array_flow.rb:92:10:92:10 | b [element 1] : | +| array_flow.rb:89:5:89:5 | b [element 1] : | array_flow.rb:92:10:92:10 | b [element 1] : | | array_flow.rb:89:9:89:9 | a [element 1] : | array_flow.rb:89:9:89:15 | ...[...] [element 1] : | | array_flow.rb:89:9:89:9 | a [element 1] : | array_flow.rb:89:9:89:15 | ...[...] [element 1] : | -| array_flow.rb:89:9:89:15 | ...[...] [element 1] : | array_flow.rb:91:10:91:10 | b [element 1] : | -| array_flow.rb:89:9:89:15 | ...[...] [element 1] : | array_flow.rb:91:10:91:10 | b [element 1] : | -| array_flow.rb:89:9:89:15 | ...[...] [element 1] : | array_flow.rb:92:10:92:10 | b [element 1] : | -| array_flow.rb:89:9:89:15 | ...[...] [element 1] : | array_flow.rb:92:10:92:10 | b [element 1] : | +| array_flow.rb:89:9:89:15 | ...[...] [element 1] : | array_flow.rb:89:5:89:5 | b [element 1] : | +| array_flow.rb:89:9:89:15 | ...[...] [element 1] : | array_flow.rb:89:5:89:5 | b [element 1] : | | array_flow.rb:91:10:91:10 | b [element 1] : | array_flow.rb:91:10:91:13 | ...[...] | | array_flow.rb:91:10:91:10 | b [element 1] : | array_flow.rb:91:10:91:13 | ...[...] | | array_flow.rb:92:10:92:10 | b [element 1] : | array_flow.rb:92:10:92:13 | ...[...] | | array_flow.rb:92:10:92:10 | b [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 [element 1] : | -| array_flow.rb:96:13:96:22 | call to source : | array_flow.rb:97:9:97:9 | a [element 1] : | +| array_flow.rb:96:5:96:5 | a [element 1] : | array_flow.rb:97:9:97:9 | a [element 1] : | +| array_flow.rb:96:5:96:5 | a [element 1] : | array_flow.rb:97:9:97:9 | a [element 1] : | +| array_flow.rb:96:13:96:22 | call to source : | array_flow.rb:96:5:96:5 | a [element 1] : | +| array_flow.rb:96:13:96:22 | call to source : | array_flow.rb:96:5:96:5 | a [element 1] : | +| array_flow.rb:97:5:97:5 | b [element 1] : | array_flow.rb:99:10:99:10 | b [element 1] : | +| array_flow.rb:97:5:97:5 | b [element 1] : | array_flow.rb:99:10:99:10 | b [element 1] : | +| array_flow.rb:97:5:97:5 | b [element 1] : | array_flow.rb:101:10:101:10 | b [element 1] : | +| array_flow.rb:97:5:97:5 | b [element 1] : | array_flow.rb:101:10:101:10 | b [element 1] : | | array_flow.rb:97:9:97:9 | a [element 1] : | array_flow.rb:97:9:97:15 | ...[...] [element 1] : | | array_flow.rb:97:9:97:9 | a [element 1] : | array_flow.rb:97:9:97:15 | ...[...] [element 1] : | -| array_flow.rb:97:9:97:15 | ...[...] [element 1] : | array_flow.rb:99:10:99:10 | b [element 1] : | -| array_flow.rb:97:9:97:15 | ...[...] [element 1] : | array_flow.rb:99:10:99:10 | b [element 1] : | -| array_flow.rb:97:9:97:15 | ...[...] [element 1] : | array_flow.rb:101:10:101:10 | b [element 1] : | -| array_flow.rb:97:9:97:15 | ...[...] [element 1] : | array_flow.rb:101:10:101:10 | b [element 1] : | +| array_flow.rb:97:9:97:15 | ...[...] [element 1] : | array_flow.rb:97:5:97:5 | b [element 1] : | +| array_flow.rb:97:9:97:15 | ...[...] [element 1] : | array_flow.rb:97:5:97:5 | b [element 1] : | | array_flow.rb:99:10:99:10 | b [element 1] : | array_flow.rb:99:10:99:13 | ...[...] | | array_flow.rb:99:10:99:10 | b [element 1] : | array_flow.rb:99:10:99:13 | ...[...] | | array_flow.rb:101:10:101:10 | b [element 1] : | array_flow.rb:101:10:101:13 | ...[...] | | array_flow.rb:101:10:101:10 | b [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 [element 1] : | -| array_flow.rb:103:13:103:24 | call to source : | array_flow.rb:104:9:104:9 | a [element 1] : | +| array_flow.rb:103:5:103:5 | a [element 1] : | array_flow.rb:104:9:104:9 | a [element 1] : | +| array_flow.rb:103:5:103:5 | a [element 1] : | array_flow.rb:104:9:104:9 | a [element 1] : | +| array_flow.rb:103:13:103:24 | call to source : | array_flow.rb:103:5:103:5 | a [element 1] : | +| array_flow.rb:103:13:103:24 | call to source : | array_flow.rb:103:5:103:5 | a [element 1] : | +| array_flow.rb:104:5:104:5 | b [element 1] : | array_flow.rb:106:10:106:10 | b [element 1] : | +| array_flow.rb:104:5:104:5 | b [element 1] : | array_flow.rb:106:10:106:10 | b [element 1] : | | array_flow.rb:104:9:104:9 | a [element 1] : | array_flow.rb:104:9:104:16 | ...[...] [element 1] : | | array_flow.rb:104:9:104:9 | a [element 1] : | array_flow.rb:104:9:104:16 | ...[...] [element 1] : | -| array_flow.rb:104:9:104:16 | ...[...] [element 1] : | array_flow.rb:106:10:106:10 | b [element 1] : | -| array_flow.rb:104:9:104:16 | ...[...] [element 1] : | array_flow.rb:106:10:106:10 | b [element 1] : | +| array_flow.rb:104:9:104:16 | ...[...] [element 1] : | array_flow.rb:104:5:104:5 | b [element 1] : | +| array_flow.rb:104:9:104:16 | ...[...] [element 1] : | array_flow.rb:104:5:104:5 | b [element 1] : | | array_flow.rb:106:10:106:10 | b [element 1] : | array_flow.rb:106:10:106:13 | ...[...] | | array_flow.rb:106:10:106:10 | b [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 [element 1] : | -| array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:110:9:110:9 | a [element 1] : | -| array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:114:9:114:9 | a [element 1] : | -| array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:114:9:114:9 | a [element 1] : | -| array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:110:9:110:9 | a [element 3] : | -| array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:110:9:110:9 | a [element 3] : | -| array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:114:9:114:9 | a [element 3] : | -| array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:114:9:114:9 | a [element 3] : | +| array_flow.rb:109:5:109:5 | a [element 1] : | array_flow.rb:110:9:110:9 | a [element 1] : | +| array_flow.rb:109:5:109:5 | a [element 1] : | array_flow.rb:110:9:110:9 | a [element 1] : | +| array_flow.rb:109:5:109:5 | a [element 1] : | array_flow.rb:114:9:114:9 | a [element 1] : | +| array_flow.rb:109:5:109:5 | a [element 1] : | array_flow.rb:114:9:114:9 | a [element 1] : | +| array_flow.rb:109:5:109:5 | a [element 3] : | array_flow.rb:110:9:110:9 | a [element 3] : | +| array_flow.rb:109:5:109:5 | a [element 3] : | array_flow.rb:110:9:110:9 | a [element 3] : | +| array_flow.rb:109:5:109:5 | a [element 3] : | array_flow.rb:114:9:114:9 | a [element 3] : | +| array_flow.rb:109:5:109:5 | a [element 3] : | array_flow.rb:114:9:114:9 | a [element 3] : | +| array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:109:5:109:5 | a [element 1] : | +| array_flow.rb:109:13:109:24 | call to source : | array_flow.rb:109:5:109:5 | a [element 1] : | +| array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:109:5:109:5 | a [element 3] : | +| array_flow.rb:109:30:109:41 | call to source : | array_flow.rb:109:5:109:5 | a [element 3] : | +| array_flow.rb:110:5:110:5 | b [element] : | array_flow.rb:111:10:111:10 | b [element] : | +| array_flow.rb:110:5:110:5 | b [element] : | array_flow.rb:111:10:111:10 | b [element] : | +| array_flow.rb:110:5:110:5 | b [element] : | array_flow.rb:112:10:112:10 | b [element] : | +| array_flow.rb:110:5:110:5 | b [element] : | array_flow.rb:112:10:112:10 | b [element] : | | array_flow.rb:110:9:110:9 | a [element 1] : | array_flow.rb:110:9:110:18 | ...[...] [element] : | | array_flow.rb:110:9:110:9 | a [element 1] : | array_flow.rb:110:9:110:18 | ...[...] [element] : | | array_flow.rb:110:9:110:9 | a [element 3] : | array_flow.rb:110:9:110:18 | ...[...] [element] : | | array_flow.rb:110:9:110:9 | a [element 3] : | array_flow.rb:110:9:110:18 | ...[...] [element] : | -| array_flow.rb:110:9:110:18 | ...[...] [element] : | array_flow.rb:111:10:111:10 | b [element] : | -| array_flow.rb:110:9:110:18 | ...[...] [element] : | array_flow.rb:111:10:111:10 | b [element] : | -| array_flow.rb:110:9:110:18 | ...[...] [element] : | array_flow.rb:112:10:112:10 | b [element] : | -| array_flow.rb:110:9:110:18 | ...[...] [element] : | array_flow.rb:112:10:112:10 | b [element] : | +| array_flow.rb:110:9:110:18 | ...[...] [element] : | array_flow.rb:110:5:110:5 | b [element] : | +| array_flow.rb:110:9:110:18 | ...[...] [element] : | array_flow.rb:110:5:110:5 | b [element] : | | array_flow.rb:111:10:111:10 | b [element] : | array_flow.rb:111:10:111:13 | ...[...] | | array_flow.rb:111:10:111:10 | b [element] : | array_flow.rb:111:10:111:13 | ...[...] | | array_flow.rb:112:10:112:10 | b [element] : | array_flow.rb:112:10:112:13 | ...[...] | | array_flow.rb:112:10:112:10 | b [element] : | array_flow.rb:112:10:112:13 | ...[...] | +| array_flow.rb:114:5:114:5 | b [element] : | array_flow.rb:115:10:115:10 | b [element] : | +| array_flow.rb:114:5:114:5 | b [element] : | array_flow.rb:115:10:115:10 | b [element] : | +| array_flow.rb:114:5:114:5 | b [element] : | array_flow.rb:116:10:116:10 | b [element] : | +| array_flow.rb:114:5:114:5 | b [element] : | array_flow.rb:116:10:116:10 | b [element] : | | array_flow.rb:114:9:114:9 | a [element 1] : | array_flow.rb:114:9:114:19 | ...[...] [element] : | | array_flow.rb:114:9:114:9 | a [element 1] : | array_flow.rb:114:9:114:19 | ...[...] [element] : | | array_flow.rb:114:9:114:9 | a [element 3] : | array_flow.rb:114:9:114:19 | ...[...] [element] : | | array_flow.rb:114:9:114:9 | a [element 3] : | array_flow.rb:114:9:114:19 | ...[...] [element] : | -| array_flow.rb:114:9:114:19 | ...[...] [element] : | array_flow.rb:115:10:115:10 | b [element] : | -| array_flow.rb:114:9:114:19 | ...[...] [element] : | array_flow.rb:115:10:115:10 | b [element] : | -| array_flow.rb:114:9:114:19 | ...[...] [element] : | array_flow.rb:116:10:116:10 | b [element] : | -| array_flow.rb:114:9:114:19 | ...[...] [element] : | array_flow.rb:116:10:116:10 | b [element] : | +| array_flow.rb:114:9:114:19 | ...[...] [element] : | array_flow.rb:114:5:114:5 | b [element] : | +| array_flow.rb:114:9:114:19 | ...[...] [element] : | array_flow.rb:114:5:114:5 | b [element] : | | array_flow.rb:115:10:115:10 | b [element] : | array_flow.rb:115:10:115:13 | ...[...] | | array_flow.rb:115:10:115:10 | b [element] : | array_flow.rb:115:10:115:13 | ...[...] | | array_flow.rb:116:10:116:10 | b [element] : | array_flow.rb:116:10:116:13 | ...[...] | @@ -278,34 +347,44 @@ edges | array_flow.rb:147:10:147:10 | a [element] : | array_flow.rb:147:10:147:13 | ...[...] | | array_flow.rb:148:10:148:10 | a [element] : | array_flow.rb:148:10:148:13 | ...[...] | | array_flow.rb:148:10:148:10 | a [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 [element 2] : | -| array_flow.rb:152:16:152:25 | call to source : | array_flow.rb:153:5:153:5 | a [element 2] : | +| array_flow.rb:152:5:152:5 | a [element 2] : | array_flow.rb:153:5:153:5 | a [element 2] : | +| array_flow.rb:152:5:152:5 | a [element 2] : | array_flow.rb:153:5:153:5 | a [element 2] : | +| array_flow.rb:152:16:152:25 | call to source : | array_flow.rb:152:5:152:5 | a [element 2] : | +| array_flow.rb:152:16:152:25 | call to source : | array_flow.rb:152:5:152:5 | a [element 2] : | | array_flow.rb:153:5:153:5 | a [element 2] : | array_flow.rb:153:16:153:16 | x : | | array_flow.rb:153:5:153:5 | a [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 [element 2] : | -| array_flow.rb:159:16:159:25 | call to source : | array_flow.rb:160:5:160:5 | a [element 2] : | +| array_flow.rb:159:5:159:5 | a [element 2] : | array_flow.rb:160:5:160:5 | a [element 2] : | +| array_flow.rb:159:5:159:5 | a [element 2] : | array_flow.rb:160:5:160:5 | a [element 2] : | +| array_flow.rb:159:16:159:25 | call to source : | array_flow.rb:159:5:159:5 | a [element 2] : | +| array_flow.rb:159:16:159:25 | call to source : | array_flow.rb:159:5:159:5 | a [element 2] : | | array_flow.rb:160:5:160:5 | a [element 2] : | array_flow.rb:160:16:160:16 | x : | | array_flow.rb:160:5:160:5 | a [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 [element 0] : | -| array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:167:9:167:9 | a [element 0] : | -| array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:168:10:168:10 | a [element 0] : | -| array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:168:10:168:10 | a [element 0] : | +| array_flow.rb:166:5:166:5 | a [element 0] : | array_flow.rb:167:9:167:9 | a [element 0] : | +| array_flow.rb:166:5:166:5 | a [element 0] : | array_flow.rb:167:9:167:9 | a [element 0] : | +| array_flow.rb:166:5:166:5 | a [element 0] : | array_flow.rb:168:10:168:10 | a [element 0] : | +| array_flow.rb:166:5:166:5 | a [element 0] : | array_flow.rb:168:10:168:10 | a [element 0] : | +| array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:166:5:166:5 | a [element 0] : | +| array_flow.rb:166:10:166:21 | call to source : | array_flow.rb:166:5:166:5 | a [element 0] : | +| array_flow.rb:167:5:167:5 | b [element 0] : | array_flow.rb:170:10:170:10 | b [element 0] : | +| array_flow.rb:167:5:167:5 | b [element 0] : | array_flow.rb:170:10:170:10 | b [element 0] : | +| array_flow.rb:167:5:167:5 | b [element] : | array_flow.rb:170:10:170:10 | b [element] : | +| array_flow.rb:167:5:167:5 | b [element] : | array_flow.rb:170:10:170:10 | b [element] : | +| array_flow.rb:167:5:167:5 | b [element] : | array_flow.rb:171:10:171:10 | b [element] : | +| array_flow.rb:167:5:167:5 | b [element] : | array_flow.rb:171:10:171:10 | b [element] : | | array_flow.rb:167:9:167:9 | [post] a [element] : | array_flow.rb:168:10:168:10 | a [element] : | | array_flow.rb:167:9:167:9 | [post] a [element] : | array_flow.rb:168:10:168:10 | a [element] : | | array_flow.rb:167:9:167:9 | [post] a [element] : | array_flow.rb:169:10:169:10 | a [element] : | | array_flow.rb:167:9:167:9 | [post] a [element] : | array_flow.rb:169:10:169:10 | a [element] : | | array_flow.rb:167:9:167:9 | a [element 0] : | array_flow.rb:167:9:167:44 | call to append [element 0] : | | array_flow.rb:167:9:167:9 | a [element 0] : | array_flow.rb:167:9:167:44 | call to append [element 0] : | -| array_flow.rb:167:9:167:44 | call to append [element 0] : | array_flow.rb:170:10:170:10 | b [element 0] : | -| array_flow.rb:167:9:167:44 | call to append [element 0] : | array_flow.rb:170:10:170:10 | b [element 0] : | -| array_flow.rb:167:9:167:44 | call to append [element] : | array_flow.rb:170:10:170:10 | b [element] : | -| array_flow.rb:167:9:167:44 | call to append [element] : | array_flow.rb:170:10:170:10 | b [element] : | -| array_flow.rb:167:9:167:44 | call to append [element] : | array_flow.rb:171:10:171:10 | b [element] : | -| array_flow.rb:167:9:167:44 | call to append [element] : | array_flow.rb:171:10:171:10 | b [element] : | +| array_flow.rb:167:9:167:44 | call to append [element 0] : | array_flow.rb:167:5:167:5 | b [element 0] : | +| array_flow.rb:167:9:167:44 | call to append [element 0] : | array_flow.rb:167:5:167:5 | b [element 0] : | +| array_flow.rb:167:9:167:44 | call to append [element] : | array_flow.rb:167:5:167:5 | b [element] : | +| array_flow.rb:167:9:167:44 | call to append [element] : | array_flow.rb:167:5:167:5 | b [element] : | | array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:167:9:167:9 | [post] a [element] : | | array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:167:9:167:9 | [post] a [element] : | | array_flow.rb:167:18:167:29 | call to source : | array_flow.rb:167:9:167:44 | call to append [element] : | @@ -326,12 +405,16 @@ edges | array_flow.rb:170:10:170:10 | b [element] : | array_flow.rb:170:10:170:13 | ...[...] | | array_flow.rb:171:10:171:10 | b [element] : | array_flow.rb:171:10:171:13 | ...[...] | | array_flow.rb:171:10:171:10 | b [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 [element 1] : | -| array_flow.rb:177:15:177:24 | call to source : | array_flow.rb:178:16:178:16 | c [element 1] : | -| array_flow.rb:178:16:178:16 | c [element 1] : | array_flow.rb:179:11:179:11 | d [element 2, element 1] : | -| array_flow.rb:178:16:178:16 | c [element 1] : | array_flow.rb:179:11:179:11 | d [element 2, element 1] : | -| array_flow.rb:178:16:178:16 | c [element 1] : | array_flow.rb:180:11:180:11 | d [element 2, element 1] : | -| array_flow.rb:178:16:178:16 | c [element 1] : | array_flow.rb:180:11:180:11 | d [element 2, element 1] : | +| array_flow.rb:177:5:177:5 | c [element 1] : | array_flow.rb:178:16:178:16 | c [element 1] : | +| array_flow.rb:177:5:177:5 | c [element 1] : | array_flow.rb:178:16:178:16 | c [element 1] : | +| array_flow.rb:177:15:177:24 | call to source : | array_flow.rb:177:5:177:5 | c [element 1] : | +| array_flow.rb:177:15:177:24 | call to source : | array_flow.rb:177:5:177:5 | c [element 1] : | +| array_flow.rb:178:5:178:5 | d [element 2, element 1] : | array_flow.rb:179:11:179:11 | d [element 2, element 1] : | +| array_flow.rb:178:5:178:5 | d [element 2, element 1] : | array_flow.rb:179:11:179:11 | d [element 2, element 1] : | +| array_flow.rb:178:5:178:5 | d [element 2, element 1] : | array_flow.rb:180:11:180:11 | d [element 2, element 1] : | +| array_flow.rb:178:5:178:5 | d [element 2, element 1] : | array_flow.rb:180:11:180:11 | d [element 2, element 1] : | +| array_flow.rb:178:16:178:16 | c [element 1] : | array_flow.rb:178:5:178:5 | d [element 2, element 1] : | +| array_flow.rb:178:16:178:16 | c [element 1] : | array_flow.rb:178:5:178:5 | d [element 2, element 1] : | | array_flow.rb:179:11:179:11 | d [element 2, element 1] : | array_flow.rb:179:11:179:22 | call to assoc [element 1] : | | array_flow.rb:179:11:179:11 | d [element 2, element 1] : | array_flow.rb:179:11:179:22 | call to assoc [element 1] : | | array_flow.rb:179:11:179:22 | call to assoc [element 1] : | array_flow.rb:179:11:179:25 | ...[...] : | @@ -344,40 +427,54 @@ edges | array_flow.rb:180:11:180:22 | call to assoc [element 1] : | 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 [element 1] : | -| array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:186:10:186:10 | a [element 1] : | -| array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:188:10:188:10 | a [element 1] : | -| array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:188:10:188:10 | a [element 1] : | +| array_flow.rb:184:5:184:5 | a [element 1] : | array_flow.rb:186:10:186:10 | a [element 1] : | +| array_flow.rb:184:5:184:5 | a [element 1] : | array_flow.rb:186:10:186:10 | a [element 1] : | +| array_flow.rb:184:5:184:5 | a [element 1] : | array_flow.rb:188:10:188:10 | a [element 1] : | +| array_flow.rb:184:5:184:5 | a [element 1] : | array_flow.rb:188:10:188:10 | a [element 1] : | +| array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:184:5:184:5 | a [element 1] : | +| array_flow.rb:184:13:184:22 | call to source : | array_flow.rb:184:5:184:5 | a [element 1] : | | array_flow.rb:186:10:186:10 | a [element 1] : | array_flow.rb:186:10:186:16 | call to at | | array_flow.rb:186:10:186:10 | a [element 1] : | array_flow.rb:186:10:186:16 | call to at | | array_flow.rb:188:10:188:10 | a [element 1] : | array_flow.rb:188:10:188:16 | call to at | | array_flow.rb:188:10:188:10 | a [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 [element 2] : | -| array_flow.rb:192:16:192:25 | call to source : | array_flow.rb:193:9:193:9 | a [element 2] : | +| array_flow.rb:192:5:192:5 | a [element 2] : | array_flow.rb:193:9:193:9 | a [element 2] : | +| array_flow.rb:192:5:192:5 | a [element 2] : | array_flow.rb:193:9:193:9 | a [element 2] : | +| array_flow.rb:192:16:192:25 | call to source : | array_flow.rb:192:5:192:5 | a [element 2] : | +| array_flow.rb:192:16:192:25 | call to source : | array_flow.rb:192:5:192:5 | a [element 2] : | +| array_flow.rb:193:5:193:5 | b : | array_flow.rb:196:10:196:10 | b | +| array_flow.rb:193:5:193:5 | b : | array_flow.rb:196:10:196:10 | b | | array_flow.rb:193:9:193:9 | a [element 2] : | array_flow.rb:193:9:195:7 | call to bsearch : | | array_flow.rb:193:9:193:9 | a [element 2] : | array_flow.rb:193:9:195:7 | call to bsearch : | | array_flow.rb:193:9:193:9 | a [element 2] : | array_flow.rb:193:23:193:23 | x : | | array_flow.rb:193:9:193:9 | a [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:9:195:7 | call to bsearch : | array_flow.rb:193:5:193:5 | b : | +| array_flow.rb:193:9:195:7 | call to bsearch : | array_flow.rb:193:5:193:5 | 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 [element 2] : | -| array_flow.rb:200:16:200:25 | call to source : | array_flow.rb:201:9:201:9 | a [element 2] : | +| array_flow.rb:200:5:200:5 | a [element 2] : | array_flow.rb:201:9:201:9 | a [element 2] : | +| array_flow.rb:200:5:200:5 | a [element 2] : | array_flow.rb:201:9:201:9 | a [element 2] : | +| array_flow.rb:200:16:200:25 | call to source : | array_flow.rb:200:5:200:5 | a [element 2] : | +| array_flow.rb:200:16:200:25 | call to source : | array_flow.rb:200:5:200:5 | a [element 2] : | | array_flow.rb:201:9:201:9 | a [element 2] : | array_flow.rb:201:29:201:29 | x : | | array_flow.rb:201:9:201:9 | a [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 [element 2] : | -| array_flow.rb:208:16:208:25 | call to source : | array_flow.rb:209:5:209:5 | a [element 2] : | +| array_flow.rb:208:5:208:5 | a [element 2] : | array_flow.rb:209:5:209:5 | a [element 2] : | +| array_flow.rb:208:5:208:5 | a [element 2] : | array_flow.rb:209:5:209:5 | a [element 2] : | +| array_flow.rb:208:16:208:25 | call to source : | array_flow.rb:208:5:208:5 | a [element 2] : | +| array_flow.rb:208:16:208:25 | call to source : | array_flow.rb:208:5:208:5 | a [element 2] : | | array_flow.rb:209:5:209:5 | a [element 2] : | array_flow.rb:209:17:209:17 | x : | | array_flow.rb:209:5:209:5 | a [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 [element 2] : | -| array_flow.rb:215:16:215:27 | call to source : | array_flow.rb:216:9:216:9 | a [element 2] : | -| array_flow.rb:215:30:215:41 | call to source : | array_flow.rb:216:9:216:9 | a [element 3] : | -| array_flow.rb:215:30:215:41 | call to source : | array_flow.rb:216:9:216:9 | a [element 3] : | +| array_flow.rb:215:5:215:5 | a [element 2] : | array_flow.rb:216:9:216:9 | a [element 2] : | +| array_flow.rb:215:5:215:5 | a [element 2] : | array_flow.rb:216:9:216:9 | a [element 2] : | +| array_flow.rb:215:5:215:5 | a [element 3] : | array_flow.rb:216:9:216:9 | a [element 3] : | +| array_flow.rb:215:5:215:5 | a [element 3] : | array_flow.rb:216:9:216:9 | a [element 3] : | +| array_flow.rb:215:16:215:27 | call to source : | array_flow.rb:215:5:215:5 | a [element 2] : | +| array_flow.rb:215:16:215:27 | call to source : | array_flow.rb:215:5:215:5 | a [element 2] : | +| array_flow.rb:215:30:215:41 | call to source : | array_flow.rb:215:5:215:5 | a [element 3] : | +| array_flow.rb:215:30:215:41 | call to source : | array_flow.rb:215:5:215:5 | a [element 3] : | | array_flow.rb:216:9:216:9 | a [element 2] : | array_flow.rb:216:27:216:27 | x : | | array_flow.rb:216:9:216:9 | a [element 2] : | array_flow.rb:216:27:216:27 | x : | | array_flow.rb:216:9:216:9 | a [element 2] : | array_flow.rb:216:30:216:30 | y : | @@ -390,26 +487,34 @@ edges | 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 [element 2] : | -| array_flow.rb:231:16:231:27 | call to source : | array_flow.rb:232:9:232:9 | a [element 2] : | +| array_flow.rb:231:5:231:5 | a [element 2] : | array_flow.rb:232:9:232:9 | a [element 2] : | +| array_flow.rb:231:5:231:5 | a [element 2] : | array_flow.rb:232:9:232:9 | a [element 2] : | +| array_flow.rb:231:16:231:27 | call to source : | array_flow.rb:231:5:231:5 | a [element 2] : | +| array_flow.rb:231:16:231:27 | call to source : | array_flow.rb:231:5:231:5 | a [element 2] : | +| array_flow.rb:232:5:232:5 | b [element] : | array_flow.rb:236:10:236:10 | b [element] : | +| array_flow.rb:232:5:232:5 | b [element] : | array_flow.rb:236:10:236:10 | b [element] : | | array_flow.rb:232:9:232:9 | a [element 2] : | array_flow.rb:232:23:232:23 | x : | | array_flow.rb:232:9:232:9 | a [element 2] : | array_flow.rb:232:23:232:23 | x : | -| array_flow.rb:232:9:235:7 | call to collect [element] : | array_flow.rb:236:10:236:10 | b [element] : | -| array_flow.rb:232:9:235:7 | call to collect [element] : | array_flow.rb:236:10:236:10 | b [element] : | +| array_flow.rb:232:9:235:7 | call to collect [element] : | array_flow.rb:232:5:232:5 | b [element] : | +| array_flow.rb:232:9:235:7 | call to collect [element] : | array_flow.rb:232:5:232:5 | b [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 [element] : | | array_flow.rb:234:9:234:19 | call to source : | array_flow.rb:232:9:235:7 | call to collect [element] : | | array_flow.rb:236:10:236:10 | b [element] : | array_flow.rb:236:10:236:13 | ...[...] | | array_flow.rb:236:10:236:10 | b [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 [element 2] : | -| array_flow.rb:240:16:240:27 | call to source : | array_flow.rb:241:9:241:9 | a [element 2] : | +| array_flow.rb:240:5:240:5 | a [element 2] : | array_flow.rb:241:9:241:9 | a [element 2] : | +| array_flow.rb:240:5:240:5 | a [element 2] : | array_flow.rb:241:9:241:9 | a [element 2] : | +| array_flow.rb:240:16:240:27 | call to source : | array_flow.rb:240:5:240:5 | a [element 2] : | +| array_flow.rb:240:16:240:27 | call to source : | array_flow.rb:240:5:240:5 | a [element 2] : | +| array_flow.rb:241:5:241:5 | b [element] : | array_flow.rb:246:10:246:10 | b [element] : | +| array_flow.rb:241:5:241:5 | b [element] : | array_flow.rb:246:10:246:10 | b [element] : | | array_flow.rb:241:9:241:9 | [post] a [element] : | array_flow.rb:245:10:245:10 | a [element] : | | array_flow.rb:241:9:241:9 | [post] a [element] : | array_flow.rb:245:10:245:10 | a [element] : | | array_flow.rb:241:9:241:9 | a [element 2] : | array_flow.rb:241:24:241:24 | x : | | array_flow.rb:241:9:241:9 | a [element 2] : | array_flow.rb:241:24:241:24 | x : | -| array_flow.rb:241:9:244:7 | call to collect! [element] : | array_flow.rb:246:10:246:10 | b [element] : | -| array_flow.rb:241:9:244:7 | call to collect! [element] : | array_flow.rb:246:10:246:10 | b [element] : | +| array_flow.rb:241:9:244:7 | call to collect! [element] : | array_flow.rb:241:5:241:5 | b [element] : | +| array_flow.rb:241:9:244:7 | call to collect! [element] : | array_flow.rb:241:5:241:5 | b [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 [element] : | @@ -420,72 +525,94 @@ edges | array_flow.rb:245:10:245:10 | a [element] : | array_flow.rb:245:10:245:13 | ...[...] | | array_flow.rb:246:10:246:10 | b [element] : | array_flow.rb:246:10:246:13 | ...[...] | | array_flow.rb:246:10:246:10 | b [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 [element 2] : | -| array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:251:9:251:9 | a [element 2] : | -| array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:256:9:256:9 | a [element 2] : | -| array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:256:9:256:9 | a [element 2] : | +| array_flow.rb:250:5:250:5 | a [element 2] : | array_flow.rb:251:9:251:9 | a [element 2] : | +| array_flow.rb:250:5:250:5 | a [element 2] : | array_flow.rb:251:9:251:9 | a [element 2] : | +| array_flow.rb:250:5:250:5 | a [element 2] : | array_flow.rb:256:9:256:9 | a [element 2] : | +| array_flow.rb:250:5:250:5 | a [element 2] : | array_flow.rb:256:9:256:9 | a [element 2] : | +| array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:250:5:250:5 | a [element 2] : | +| array_flow.rb:250:16:250:27 | call to source : | array_flow.rb:250:5:250:5 | a [element 2] : | +| array_flow.rb:251:5:251:5 | b [element] : | array_flow.rb:255:10:255:10 | b [element] : | +| array_flow.rb:251:5:251:5 | b [element] : | array_flow.rb:255:10:255:10 | b [element] : | | array_flow.rb:251:9:251:9 | a [element 2] : | array_flow.rb:251:9:254:7 | call to collect_concat [element] : | | array_flow.rb:251:9:251:9 | a [element 2] : | array_flow.rb:251:9:254:7 | call to collect_concat [element] : | | array_flow.rb:251:9:251:9 | a [element 2] : | array_flow.rb:251:30:251:30 | x : | | array_flow.rb:251:9:251:9 | a [element 2] : | array_flow.rb:251:30:251:30 | x : | -| array_flow.rb:251:9:254:7 | call to collect_concat [element] : | array_flow.rb:255:10:255:10 | b [element] : | -| array_flow.rb:251:9:254:7 | call to collect_concat [element] : | array_flow.rb:255:10:255:10 | b [element] : | +| array_flow.rb:251:9:254:7 | call to collect_concat [element] : | array_flow.rb:251:5:251:5 | b [element] : | +| array_flow.rb:251:9:254:7 | call to collect_concat [element] : | array_flow.rb:251:5:251:5 | b [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 [element] : | | array_flow.rb:253:13:253:24 | call to source : | array_flow.rb:251:9:254:7 | call to collect_concat [element] : | | array_flow.rb:255:10:255:10 | b [element] : | array_flow.rb:255:10:255:13 | ...[...] | | array_flow.rb:255:10:255:10 | b [element] : | array_flow.rb:255:10:255:13 | ...[...] | +| array_flow.rb:256:5:256:5 | b [element] : | array_flow.rb:260:10:260:10 | b [element] : | +| array_flow.rb:256:5:256:5 | b [element] : | array_flow.rb:260:10:260:10 | b [element] : | | array_flow.rb:256:9:256:9 | a [element 2] : | array_flow.rb:256:30:256:30 | x : | | array_flow.rb:256:9:256:9 | a [element 2] : | array_flow.rb:256:30:256:30 | x : | -| array_flow.rb:256:9:259:7 | call to collect_concat [element] : | array_flow.rb:260:10:260:10 | b [element] : | -| array_flow.rb:256:9:259:7 | call to collect_concat [element] : | array_flow.rb:260:10:260:10 | b [element] : | +| array_flow.rb:256:9:259:7 | call to collect_concat [element] : | array_flow.rb:256:5:256:5 | b [element] : | +| array_flow.rb:256:9:259:7 | call to collect_concat [element] : | array_flow.rb:256:5:256:5 | b [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 [element] : | | array_flow.rb:258:9:258:20 | call to source : | array_flow.rb:256:9:259:7 | call to collect_concat [element] : | | array_flow.rb:260:10:260:10 | b [element] : | array_flow.rb:260:10:260:13 | ...[...] | | array_flow.rb:260:10:260:10 | b [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 [element 2] : | -| array_flow.rb:264:16:264:25 | call to source : | array_flow.rb:265:9:265:9 | a [element 2] : | +| array_flow.rb:264:5:264:5 | a [element 2] : | array_flow.rb:265:9:265:9 | a [element 2] : | +| array_flow.rb:264:5:264:5 | a [element 2] : | array_flow.rb:265:9:265:9 | a [element 2] : | +| array_flow.rb:264:16:264:25 | call to source : | array_flow.rb:264:5:264:5 | a [element 2] : | +| array_flow.rb:264:16:264:25 | call to source : | array_flow.rb:264:5:264:5 | a [element 2] : | +| array_flow.rb:265:5:265:5 | b [element 2] : | array_flow.rb:269:10:269:10 | b [element 2] : | +| array_flow.rb:265:5:265:5 | b [element 2] : | array_flow.rb:269:10:269:10 | b [element 2] : | | array_flow.rb:265:9:265:9 | a [element 2] : | array_flow.rb:265:9:267:7 | call to combination [element 2] : | | array_flow.rb:265:9:265:9 | a [element 2] : | array_flow.rb:265:9:267:7 | call to combination [element 2] : | | array_flow.rb:265:9:265:9 | a [element 2] : | array_flow.rb:265:30:265:30 | x [element] : | | array_flow.rb:265:9:265:9 | a [element 2] : | array_flow.rb:265:30:265:30 | x [element] : | -| array_flow.rb:265:9:267:7 | call to combination [element 2] : | array_flow.rb:269:10:269:10 | b [element 2] : | -| array_flow.rb:265:9:267:7 | call to combination [element 2] : | array_flow.rb:269:10:269:10 | b [element 2] : | +| array_flow.rb:265:9:267:7 | call to combination [element 2] : | array_flow.rb:265:5:265:5 | b [element 2] : | +| array_flow.rb:265:9:267:7 | call to combination [element 2] : | array_flow.rb:265:5:265:5 | b [element 2] : | | array_flow.rb:265:30:265:30 | x [element] : | array_flow.rb:266:14:266:14 | x [element] : | | array_flow.rb:265:30:265:30 | x [element] : | array_flow.rb:266:14:266:14 | x [element] : | | array_flow.rb:266:14:266:14 | x [element] : | array_flow.rb:266:14:266:17 | ...[...] | | array_flow.rb:266:14:266:14 | x [element] : | array_flow.rb:266:14:266:17 | ...[...] | | array_flow.rb:269:10:269:10 | b [element 2] : | array_flow.rb:269:10:269:13 | ...[...] | | array_flow.rb:269:10:269:10 | b [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 [element 2] : | -| array_flow.rb:273:16:273:25 | call to source : | array_flow.rb:274:9:274:9 | a [element 2] : | +| array_flow.rb:273:5:273:5 | a [element 2] : | array_flow.rb:274:9:274:9 | a [element 2] : | +| array_flow.rb:273:5:273:5 | a [element 2] : | array_flow.rb:274:9:274:9 | a [element 2] : | +| array_flow.rb:273:16:273:25 | call to source : | array_flow.rb:273:5:273:5 | a [element 2] : | +| array_flow.rb:273:16:273:25 | call to source : | array_flow.rb:273:5:273:5 | a [element 2] : | +| array_flow.rb:274:5:274:5 | b [element] : | array_flow.rb:275:10:275:10 | b [element] : | +| array_flow.rb:274:5:274:5 | b [element] : | array_flow.rb:275:10:275:10 | b [element] : | | array_flow.rb:274:9:274:9 | a [element 2] : | array_flow.rb:274:9:274:17 | call to compact [element] : | | array_flow.rb:274:9:274:9 | a [element 2] : | array_flow.rb:274:9:274:17 | call to compact [element] : | -| array_flow.rb:274:9:274:17 | call to compact [element] : | array_flow.rb:275:10:275:10 | b [element] : | -| array_flow.rb:274:9:274:17 | call to compact [element] : | array_flow.rb:275:10:275:10 | b [element] : | +| array_flow.rb:274:9:274:17 | call to compact [element] : | array_flow.rb:274:5:274:5 | b [element] : | +| array_flow.rb:274:9:274:17 | call to compact [element] : | array_flow.rb:274:5:274:5 | b [element] : | | array_flow.rb:275:10:275:10 | b [element] : | array_flow.rb:275:10:275:13 | ...[...] | | array_flow.rb:275:10:275:10 | b [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 [element 2] : | -| array_flow.rb:279:16:279:25 | call to source : | array_flow.rb:280:9:280:9 | a [element 2] : | +| array_flow.rb:279:5:279:5 | a [element 2] : | array_flow.rb:280:9:280:9 | a [element 2] : | +| array_flow.rb:279:5:279:5 | a [element 2] : | array_flow.rb:280:9:280:9 | a [element 2] : | +| array_flow.rb:279:16:279:25 | call to source : | array_flow.rb:279:5:279:5 | a [element 2] : | +| array_flow.rb:279:16:279:25 | call to source : | array_flow.rb:279:5:279:5 | a [element 2] : | +| array_flow.rb:280:5:280:5 | b [element] : | array_flow.rb:282:10:282:10 | b [element] : | +| array_flow.rb:280:5:280:5 | b [element] : | array_flow.rb:282:10:282:10 | b [element] : | | array_flow.rb:280:9:280:9 | [post] a [element] : | array_flow.rb:281:10:281:10 | a [element] : | | array_flow.rb:280:9:280:9 | [post] a [element] : | array_flow.rb:281:10:281:10 | a [element] : | | array_flow.rb:280:9:280:9 | a [element 2] : | array_flow.rb:280:9:280:9 | [post] a [element] : | | array_flow.rb:280:9:280:9 | a [element 2] : | array_flow.rb:280:9:280:9 | [post] a [element] : | | array_flow.rb:280:9:280:9 | a [element 2] : | array_flow.rb:280:9:280:18 | call to compact! [element] : | | array_flow.rb:280:9:280:9 | a [element 2] : | array_flow.rb:280:9:280:18 | call to compact! [element] : | -| array_flow.rb:280:9:280:18 | call to compact! [element] : | array_flow.rb:282:10:282:10 | b [element] : | -| array_flow.rb:280:9:280:18 | call to compact! [element] : | array_flow.rb:282:10:282:10 | b [element] : | +| array_flow.rb:280:9:280:18 | call to compact! [element] : | array_flow.rb:280:5:280:5 | b [element] : | +| array_flow.rb:280:9:280:18 | call to compact! [element] : | array_flow.rb:280:5:280:5 | b [element] : | | array_flow.rb:281:10:281:10 | a [element] : | array_flow.rb:281:10:281:13 | ...[...] | | array_flow.rb:281:10:281:10 | a [element] : | array_flow.rb:281:10:281:13 | ...[...] | | array_flow.rb:282:10:282:10 | b [element] : | array_flow.rb:282:10:282:13 | ...[...] | | array_flow.rb:282:10:282:10 | b [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 [element 2] : | -| array_flow.rb:286:16:286:27 | call to source : | array_flow.rb:290:10:290:10 | a [element 2] : | -| array_flow.rb:287:16:287:27 | call to source : | array_flow.rb:288:14:288:14 | b [element 2] : | -| array_flow.rb:287:16:287:27 | call to source : | array_flow.rb:288:14:288:14 | b [element 2] : | +| array_flow.rb:286:5:286:5 | a [element 2] : | array_flow.rb:290:10:290:10 | a [element 2] : | +| array_flow.rb:286:5:286:5 | a [element 2] : | array_flow.rb:290:10:290:10 | a [element 2] : | +| array_flow.rb:286:16:286:27 | call to source : | array_flow.rb:286:5:286:5 | a [element 2] : | +| array_flow.rb:286:16:286:27 | call to source : | array_flow.rb:286:5:286:5 | a [element 2] : | +| array_flow.rb:287:5:287:5 | b [element 2] : | array_flow.rb:288:14:288:14 | b [element 2] : | +| array_flow.rb:287:5:287:5 | b [element 2] : | array_flow.rb:288:14:288:14 | b [element 2] : | +| array_flow.rb:287:16:287:27 | call to source : | array_flow.rb:287:5:287:5 | b [element 2] : | +| array_flow.rb:287:16:287:27 | call to source : | array_flow.rb:287:5:287:5 | b [element 2] : | | array_flow.rb:288:5:288:5 | [post] a [element] : | array_flow.rb:289:10:289:10 | a [element] : | | array_flow.rb:288:5:288:5 | [post] a [element] : | array_flow.rb:289:10:289:10 | a [element] : | | array_flow.rb:288:5:288:5 | [post] a [element] : | array_flow.rb:290:10:290:10 | a [element] : | @@ -498,52 +625,76 @@ edges | array_flow.rb:290:10:290:10 | a [element 2] : | array_flow.rb:290:10:290:13 | ...[...] | | array_flow.rb:290:10:290:10 | a [element] : | array_flow.rb:290:10:290:13 | ...[...] | | array_flow.rb:290:10:290:10 | a [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 [element 2] : | -| array_flow.rb:294:16:294:25 | call to source : | array_flow.rb:295:5:295:5 | a [element 2] : | +| array_flow.rb:294:5:294:5 | a [element 2] : | array_flow.rb:295:5:295:5 | a [element 2] : | +| array_flow.rb:294:5:294:5 | a [element 2] : | array_flow.rb:295:5:295:5 | a [element 2] : | +| array_flow.rb:294:16:294:25 | call to source : | array_flow.rb:294:5:294:5 | a [element 2] : | +| array_flow.rb:294:16:294:25 | call to source : | array_flow.rb:294:5:294:5 | a [element 2] : | | array_flow.rb:295:5:295:5 | a [element 2] : | array_flow.rb:295:17:295:17 | x : | | array_flow.rb:295:5:295:5 | a [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 [element 2] : | -| array_flow.rb:301:16:301:25 | call to source : | array_flow.rb:302:5:302:5 | a [element 2] : | +| array_flow.rb:301:5:301:5 | a [element 2] : | array_flow.rb:302:5:302:5 | a [element 2] : | +| array_flow.rb:301:5:301:5 | a [element 2] : | array_flow.rb:302:5:302:5 | a [element 2] : | +| array_flow.rb:301:16:301:25 | call to source : | array_flow.rb:301:5:301:5 | a [element 2] : | +| array_flow.rb:301:16:301:25 | call to source : | array_flow.rb:301:5:301:5 | a [element 2] : | | array_flow.rb:302:5:302:5 | a [element 2] : | array_flow.rb:302:20:302:20 | x : | | array_flow.rb:302:5:302:5 | a [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 [element 2] : | -| array_flow.rb:308:16:308:25 | call to source : | array_flow.rb:309:9:309:9 | a [element 2] : | +| array_flow.rb:308:5:308:5 | a [element 2] : | array_flow.rb:309:9:309:9 | a [element 2] : | +| array_flow.rb:308:5:308:5 | a [element 2] : | array_flow.rb:309:9:309:9 | a [element 2] : | +| array_flow.rb:308:16:308:25 | call to source : | array_flow.rb:308:5:308:5 | a [element 2] : | +| array_flow.rb:308:16:308:25 | call to source : | array_flow.rb:308:5:308:5 | a [element 2] : | +| array_flow.rb:309:5:309:5 | b [element 2] : | array_flow.rb:312:10:312:10 | b [element 2] : | +| array_flow.rb:309:5:309:5 | b [element 2] : | array_flow.rb:312:10:312:10 | b [element 2] : | | array_flow.rb:309:9:309:9 | a [element 2] : | array_flow.rb:309:9:309:21 | call to deconstruct [element 2] : | | array_flow.rb:309:9:309:9 | a [element 2] : | array_flow.rb:309:9:309:21 | call to deconstruct [element 2] : | -| array_flow.rb:309:9:309:21 | call to deconstruct [element 2] : | array_flow.rb:312:10:312:10 | b [element 2] : | -| array_flow.rb:309:9:309:21 | call to deconstruct [element 2] : | array_flow.rb:312:10:312:10 | b [element 2] : | +| array_flow.rb:309:9:309:21 | call to deconstruct [element 2] : | array_flow.rb:309:5:309:5 | b [element 2] : | +| array_flow.rb:309:9:309:21 | call to deconstruct [element 2] : | array_flow.rb:309:5:309:5 | b [element 2] : | | array_flow.rb:312:10:312:10 | b [element 2] : | array_flow.rb:312:10:312:13 | ...[...] | | array_flow.rb:312:10:312:10 | b [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 [element 2] : | -| array_flow.rb:316:16:316:27 | call to source : | array_flow.rb:317:9:317:9 | a [element 2] : | +| array_flow.rb:316:5:316:5 | a [element 2] : | array_flow.rb:317:9:317:9 | a [element 2] : | +| array_flow.rb:316:5:316:5 | a [element 2] : | array_flow.rb:317:9:317:9 | a [element 2] : | +| array_flow.rb:316:16:316:27 | call to source : | array_flow.rb:316:5:316:5 | a [element 2] : | +| array_flow.rb:316:16:316:27 | call to source : | array_flow.rb:316:5:316:5 | a [element 2] : | +| array_flow.rb:317:5:317:5 | b : | array_flow.rb:318:10:318:10 | b | +| array_flow.rb:317:5:317:5 | b : | array_flow.rb:318:10:318:10 | b | | array_flow.rb:317:9:317:9 | a [element 2] : | array_flow.rb:317:9:317:36 | call to delete : | | array_flow.rb:317:9:317:9 | a [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:9:317:36 | call to delete : | array_flow.rb:317:5:317:5 | b : | +| array_flow.rb:317:9:317:36 | call to delete : | array_flow.rb:317:5:317:5 | 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:325:16:325:27 | call to source : | array_flow.rb:326:9:326:9 | a [element 2] : | -| array_flow.rb:325:16:325:27 | call to source : | array_flow.rb:326:9:326:9 | a [element 2] : | -| array_flow.rb:325:30:325:41 | call to source : | array_flow.rb:326:9:326:9 | a [element 3] : | -| array_flow.rb:325:30:325:41 | call to source : | array_flow.rb:326:9:326:9 | a [element 3] : | +| array_flow.rb:325:5:325:5 | a [element 2] : | array_flow.rb:326:9:326:9 | a [element 2] : | +| array_flow.rb:325:5:325:5 | a [element 2] : | array_flow.rb:326:9:326:9 | a [element 2] : | +| array_flow.rb:325:5:325:5 | a [element 3] : | array_flow.rb:326:9:326:9 | a [element 3] : | +| array_flow.rb:325:5:325:5 | a [element 3] : | array_flow.rb:326:9:326:9 | a [element 3] : | +| array_flow.rb:325:16:325:27 | call to source : | array_flow.rb:325:5:325:5 | a [element 2] : | +| array_flow.rb:325:16:325:27 | call to source : | array_flow.rb:325:5:325:5 | a [element 2] : | +| array_flow.rb:325:30:325:41 | call to source : | array_flow.rb:325:5:325:5 | a [element 3] : | +| array_flow.rb:325:30:325:41 | call to source : | array_flow.rb:325:5:325:5 | a [element 3] : | +| array_flow.rb:326:5:326:5 | b : | array_flow.rb:327:10:327:10 | b | +| array_flow.rb:326:5:326:5 | b : | array_flow.rb:327:10:327:10 | b | | array_flow.rb:326:9:326:9 | [post] a [element 2] : | array_flow.rb:328:10:328:10 | a [element 2] : | | array_flow.rb:326:9:326:9 | [post] a [element 2] : | array_flow.rb:328:10:328:10 | a [element 2] : | | array_flow.rb:326:9:326:9 | a [element 2] : | array_flow.rb:326:9:326:22 | call to delete_at : | | array_flow.rb:326:9:326:9 | a [element 2] : | array_flow.rb:326:9:326:22 | call to delete_at : | | array_flow.rb:326:9:326:9 | a [element 3] : | array_flow.rb:326:9:326:9 | [post] a [element 2] : | | array_flow.rb:326:9:326:9 | a [element 3] : | array_flow.rb:326:9:326:9 | [post] a [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:326:9:326:22 | call to delete_at : | array_flow.rb:326:5:326:5 | b : | +| array_flow.rb:326:9:326:22 | call to delete_at : | array_flow.rb:326:5:326:5 | b : | | array_flow.rb:328:10:328:10 | a [element 2] : | array_flow.rb:328:10:328:13 | ...[...] | | array_flow.rb:328:10:328:10 | a [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 [element 2] : | -| array_flow.rb:330:16:330:27 | call to source : | array_flow.rb:331:9:331:9 | a [element 2] : | -| array_flow.rb:330:30:330:41 | call to source : | array_flow.rb:331:9:331:9 | a [element 3] : | -| array_flow.rb:330:30:330:41 | call to source : | array_flow.rb:331:9:331:9 | a [element 3] : | +| array_flow.rb:330:5:330:5 | a [element 2] : | array_flow.rb:331:9:331:9 | a [element 2] : | +| array_flow.rb:330:5:330:5 | a [element 2] : | array_flow.rb:331:9:331:9 | a [element 2] : | +| array_flow.rb:330:5:330:5 | a [element 3] : | array_flow.rb:331:9:331:9 | a [element 3] : | +| array_flow.rb:330:5:330:5 | a [element 3] : | array_flow.rb:331:9:331:9 | a [element 3] : | +| array_flow.rb:330:16:330:27 | call to source : | array_flow.rb:330:5:330:5 | a [element 2] : | +| array_flow.rb:330:16:330:27 | call to source : | array_flow.rb:330:5:330:5 | a [element 2] : | +| array_flow.rb:330:30:330:41 | call to source : | array_flow.rb:330:5:330:5 | a [element 3] : | +| array_flow.rb:330:30:330:41 | call to source : | array_flow.rb:330:5:330:5 | a [element 3] : | +| array_flow.rb:331:5:331:5 | b : | array_flow.rb:332:10:332:10 | b | +| array_flow.rb:331:5:331:5 | b : | array_flow.rb:332:10:332:10 | b | | array_flow.rb:331:9:331:9 | [post] a [element] : | array_flow.rb:333:10:333:10 | a [element] : | | array_flow.rb:331:9:331:9 | [post] a [element] : | array_flow.rb:333:10:333:10 | a [element] : | | array_flow.rb:331:9:331:9 | [post] a [element] : | array_flow.rb:334:10:334:10 | a [element] : | @@ -556,14 +707,18 @@ edges | array_flow.rb:331:9:331:9 | a [element 3] : | array_flow.rb:331:9:331:9 | [post] a [element] : | | array_flow.rb:331:9:331:9 | a [element 3] : | array_flow.rb:331:9:331:22 | call to delete_at : | | array_flow.rb:331:9:331:9 | a [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:331:9:331:22 | call to delete_at : | array_flow.rb:331:5:331:5 | b : | +| array_flow.rb:331:9:331:22 | call to delete_at : | array_flow.rb:331:5:331:5 | b : | | array_flow.rb:333:10:333:10 | a [element] : | array_flow.rb:333:10:333:13 | ...[...] | | array_flow.rb:333:10:333:10 | a [element] : | array_flow.rb:333:10:333:13 | ...[...] | | array_flow.rb:334:10:334:10 | a [element] : | array_flow.rb:334:10:334:13 | ...[...] | | array_flow.rb:334:10:334:10 | a [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 [element 2] : | -| array_flow.rb:338:16:338:25 | call to source : | array_flow.rb:339:9:339:9 | a [element 2] : | +| array_flow.rb:338:5:338:5 | a [element 2] : | array_flow.rb:339:9:339:9 | a [element 2] : | +| array_flow.rb:338:5:338:5 | a [element 2] : | array_flow.rb:339:9:339:9 | a [element 2] : | +| array_flow.rb:338:16:338:25 | call to source : | array_flow.rb:338:5:338:5 | a [element 2] : | +| array_flow.rb:338:16:338:25 | call to source : | array_flow.rb:338:5:338:5 | a [element 2] : | +| array_flow.rb:339:5:339:5 | b [element] : | array_flow.rb:342:10:342:10 | b [element] : | +| array_flow.rb:339:5:339:5 | b [element] : | array_flow.rb:342:10:342:10 | b [element] : | | array_flow.rb:339:9:339:9 | [post] a [element] : | array_flow.rb:343:10:343:10 | a [element] : | | array_flow.rb:339:9:339:9 | [post] a [element] : | array_flow.rb:343:10:343:10 | a [element] : | | array_flow.rb:339:9:339:9 | [post] a [element] : | array_flow.rb:344:10:344:10 | a [element] : | @@ -576,8 +731,8 @@ edges | array_flow.rb:339:9:339:9 | a [element 2] : | array_flow.rb:339:9:341:7 | call to delete_if [element] : | | array_flow.rb:339:9:339:9 | a [element 2] : | array_flow.rb:339:25:339:25 | x : | | array_flow.rb:339:9:339:9 | a [element 2] : | array_flow.rb:339:25:339:25 | x : | -| array_flow.rb:339:9:341:7 | call to delete_if [element] : | array_flow.rb:342:10:342:10 | b [element] : | -| array_flow.rb:339:9:341:7 | call to delete_if [element] : | array_flow.rb:342:10:342:10 | b [element] : | +| array_flow.rb:339:9:341:7 | call to delete_if [element] : | array_flow.rb:339:5:339:5 | b [element] : | +| array_flow.rb:339:9:341:7 | call to delete_if [element] : | array_flow.rb:339:5:339:5 | b [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 [element] : | array_flow.rb:342:10:342:13 | ...[...] | @@ -588,66 +743,88 @@ edges | array_flow.rb:344:10:344:10 | a [element] : | array_flow.rb:344:10:344:13 | ...[...] | | array_flow.rb:345:10:345:10 | a [element] : | array_flow.rb:345:10:345:13 | ...[...] | | array_flow.rb:345:10:345:10 | a [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 [element 2] : | -| array_flow.rb:349:16:349:25 | call to source : | array_flow.rb:350:9:350:9 | a [element 2] : | +| array_flow.rb:349:5:349:5 | a [element 2] : | array_flow.rb:350:9:350:9 | a [element 2] : | +| array_flow.rb:349:5:349:5 | a [element 2] : | array_flow.rb:350:9:350:9 | a [element 2] : | +| array_flow.rb:349:16:349:25 | call to source : | array_flow.rb:349:5:349:5 | a [element 2] : | +| array_flow.rb:349:16:349:25 | call to source : | array_flow.rb:349:5:349:5 | a [element 2] : | +| array_flow.rb:350:5:350:5 | b [element] : | array_flow.rb:351:10:351:10 | b [element] : | +| array_flow.rb:350:5:350:5 | b [element] : | array_flow.rb:351:10:351:10 | b [element] : | | array_flow.rb:350:9:350:9 | a [element 2] : | array_flow.rb:350:9:350:25 | call to difference [element] : | | array_flow.rb:350:9:350:9 | a [element 2] : | array_flow.rb:350:9:350:25 | call to difference [element] : | -| array_flow.rb:350:9:350:25 | call to difference [element] : | array_flow.rb:351:10:351:10 | b [element] : | -| array_flow.rb:350:9:350:25 | call to difference [element] : | array_flow.rb:351:10:351:10 | b [element] : | +| array_flow.rb:350:9:350:25 | call to difference [element] : | array_flow.rb:350:5:350:5 | b [element] : | +| array_flow.rb:350:9:350:25 | call to difference [element] : | array_flow.rb:350:5:350:5 | b [element] : | | array_flow.rb:351:10:351:10 | b [element] : | array_flow.rb:351:10:351:13 | ...[...] | | array_flow.rb:351:10:351:10 | b [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 [element 2] : | -| array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:357:10:357:10 | a [element 2] : | -| array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:358:10:358:10 | a [element 2] : | -| array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:358:10:358:10 | a [element 2] : | -| array_flow.rb:355:34:355:45 | call to source : | array_flow.rb:360:10:360:10 | a [element 3, element 1] : | -| array_flow.rb:355:34:355:45 | call to source : | array_flow.rb:360:10:360:10 | a [element 3, element 1] : | +| array_flow.rb:355:5:355:5 | a [element 2] : | array_flow.rb:357:10:357:10 | a [element 2] : | +| array_flow.rb:355:5:355:5 | a [element 2] : | array_flow.rb:357:10:357:10 | a [element 2] : | +| array_flow.rb:355:5:355:5 | a [element 2] : | array_flow.rb:358:10:358:10 | a [element 2] : | +| array_flow.rb:355:5:355:5 | a [element 2] : | array_flow.rb:358:10:358:10 | a [element 2] : | +| array_flow.rb:355:5:355:5 | a [element 3, element 1] : | array_flow.rb:360:10:360:10 | a [element 3, element 1] : | +| array_flow.rb:355:5:355:5 | a [element 3, element 1] : | array_flow.rb:360:10:360:10 | a [element 3, element 1] : | +| array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:355:5:355:5 | a [element 2] : | +| array_flow.rb:355:16:355:27 | call to source : | array_flow.rb:355:5:355:5 | a [element 2] : | +| array_flow.rb:355:34:355:45 | call to source : | array_flow.rb:355:5:355:5 | a [element 3, element 1] : | +| array_flow.rb:355:34:355:45 | call to source : | array_flow.rb:355:5:355:5 | a [element 3, element 1] : | | array_flow.rb:357:10:357:10 | a [element 2] : | array_flow.rb:357:10:357:17 | call to dig | | array_flow.rb:357:10:357:10 | a [element 2] : | array_flow.rb:357:10:357:17 | call to dig | | array_flow.rb:358:10:358:10 | a [element 2] : | array_flow.rb:358:10:358:17 | call to dig | | array_flow.rb:358:10:358:10 | a [element 2] : | array_flow.rb:358:10:358:17 | call to dig | | array_flow.rb:360:10:360:10 | a [element 3, element 1] : | array_flow.rb:360:10:360:19 | call to dig | | array_flow.rb:360:10:360:10 | a [element 3, 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 [element 2] : | -| array_flow.rb:364:16:364:27 | call to source : | array_flow.rb:365:9:365:9 | a [element 2] : | +| array_flow.rb:364:5:364:5 | a [element 2] : | array_flow.rb:365:9:365:9 | a [element 2] : | +| array_flow.rb:364:5:364:5 | a [element 2] : | array_flow.rb:365:9:365:9 | a [element 2] : | +| array_flow.rb:364:16:364:27 | call to source : | array_flow.rb:364:5:364:5 | a [element 2] : | +| array_flow.rb:364:16:364:27 | call to source : | array_flow.rb:364:5:364:5 | a [element 2] : | +| array_flow.rb:365:5:365:5 | b : | array_flow.rb:368:10:368:10 | b | +| array_flow.rb:365:5:365:5 | b : | array_flow.rb:368:10:368:10 | b | | array_flow.rb:365:9:365:9 | a [element 2] : | array_flow.rb:365:9:367:7 | call to detect : | | array_flow.rb:365:9:365:9 | a [element 2] : | array_flow.rb:365:9:367:7 | call to detect : | | array_flow.rb:365:9:365:9 | a [element 2] : | array_flow.rb:365:43:365:43 | x : | | array_flow.rb:365:9:365:9 | a [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:9:367:7 | call to detect : | array_flow.rb:365:5:365:5 | b : | +| array_flow.rb:365:9:367:7 | call to detect : | array_flow.rb:365:5:365:5 | 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 [element 2] : | -| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:373:9:373:9 | a [element 2] : | -| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:375:9:375:9 | a [element 2] : | -| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:375:9:375:9 | a [element 2] : | -| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:380:9:380:9 | a [element 2] : | -| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:380:9:380:9 | a [element 2] : | -| array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:373:9:373:9 | a [element 3] : | -| array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:373:9:373:9 | a [element 3] : | -| array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:375:9:375:9 | a [element 3] : | -| array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:375:9:375:9 | a [element 3] : | +| array_flow.rb:372:5:372:5 | a [element 2] : | array_flow.rb:373:9:373:9 | a [element 2] : | +| array_flow.rb:372:5:372:5 | a [element 2] : | array_flow.rb:373:9:373:9 | a [element 2] : | +| array_flow.rb:372:5:372:5 | a [element 2] : | array_flow.rb:375:9:375:9 | a [element 2] : | +| array_flow.rb:372:5:372:5 | a [element 2] : | array_flow.rb:375:9:375:9 | a [element 2] : | +| array_flow.rb:372:5:372:5 | a [element 2] : | array_flow.rb:380:9:380:9 | a [element 2] : | +| array_flow.rb:372:5:372:5 | a [element 2] : | array_flow.rb:380:9:380:9 | a [element 2] : | +| array_flow.rb:372:5:372:5 | a [element 3] : | array_flow.rb:373:9:373:9 | a [element 3] : | +| array_flow.rb:372:5:372:5 | a [element 3] : | array_flow.rb:373:9:373:9 | a [element 3] : | +| array_flow.rb:372:5:372:5 | a [element 3] : | array_flow.rb:375:9:375:9 | a [element 3] : | +| array_flow.rb:372:5:372:5 | a [element 3] : | array_flow.rb:375:9:375:9 | a [element 3] : | +| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:372:5:372:5 | a [element 2] : | +| array_flow.rb:372:16:372:27 | call to source : | array_flow.rb:372:5:372:5 | a [element 2] : | +| array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:372:5:372:5 | a [element 3] : | +| array_flow.rb:372:30:372:41 | call to source : | array_flow.rb:372:5:372:5 | a [element 3] : | +| array_flow.rb:373:5:373:5 | b [element] : | array_flow.rb:374:10:374:10 | b [element] : | +| array_flow.rb:373:5:373:5 | b [element] : | array_flow.rb:374:10:374:10 | b [element] : | | array_flow.rb:373:9:373:9 | a [element 2] : | array_flow.rb:373:9:373:17 | call to drop [element] : | | array_flow.rb:373:9:373:9 | a [element 2] : | array_flow.rb:373:9:373:17 | call to drop [element] : | | array_flow.rb:373:9:373:9 | a [element 3] : | array_flow.rb:373:9:373:17 | call to drop [element] : | | array_flow.rb:373:9:373:9 | a [element 3] : | array_flow.rb:373:9:373:17 | call to drop [element] : | -| array_flow.rb:373:9:373:17 | call to drop [element] : | array_flow.rb:374:10:374:10 | b [element] : | -| array_flow.rb:373:9:373:17 | call to drop [element] : | array_flow.rb:374:10:374:10 | b [element] : | +| array_flow.rb:373:9:373:17 | call to drop [element] : | array_flow.rb:373:5:373:5 | b [element] : | +| array_flow.rb:373:9:373:17 | call to drop [element] : | array_flow.rb:373:5:373:5 | b [element] : | | array_flow.rb:374:10:374:10 | b [element] : | array_flow.rb:374:10:374:13 | ...[...] | | array_flow.rb:374:10:374:10 | b [element] : | array_flow.rb:374:10:374:13 | ...[...] | +| array_flow.rb:375:5:375:5 | b [element 1] : | array_flow.rb:377:10:377:10 | b [element 1] : | +| array_flow.rb:375:5:375:5 | b [element 1] : | array_flow.rb:377:10:377:10 | b [element 1] : | +| array_flow.rb:375:5:375:5 | b [element 1] : | array_flow.rb:378:10:378:10 | b [element 1] : | +| array_flow.rb:375:5:375:5 | b [element 1] : | array_flow.rb:378:10:378:10 | b [element 1] : | +| array_flow.rb:375:5:375:5 | b [element 2] : | array_flow.rb:378:10:378:10 | b [element 2] : | +| array_flow.rb:375:5:375:5 | b [element 2] : | array_flow.rb:378:10:378:10 | b [element 2] : | | array_flow.rb:375:9:375:9 | a [element 2] : | array_flow.rb:375:9:375:17 | call to drop [element 1] : | | array_flow.rb:375:9:375:9 | a [element 2] : | array_flow.rb:375:9:375:17 | call to drop [element 1] : | | array_flow.rb:375:9:375:9 | a [element 3] : | array_flow.rb:375:9:375:17 | call to drop [element 2] : | | array_flow.rb:375:9:375:9 | a [element 3] : | array_flow.rb:375:9:375:17 | call to drop [element 2] : | -| array_flow.rb:375:9:375:17 | call to drop [element 1] : | array_flow.rb:377:10:377:10 | b [element 1] : | -| array_flow.rb:375:9:375:17 | call to drop [element 1] : | array_flow.rb:377:10:377:10 | b [element 1] : | -| array_flow.rb:375:9:375:17 | call to drop [element 1] : | array_flow.rb:378:10:378:10 | b [element 1] : | -| array_flow.rb:375:9:375:17 | call to drop [element 1] : | array_flow.rb:378:10:378:10 | b [element 1] : | -| array_flow.rb:375:9:375:17 | call to drop [element 2] : | array_flow.rb:378:10:378:10 | b [element 2] : | -| array_flow.rb:375:9:375:17 | call to drop [element 2] : | array_flow.rb:378:10:378:10 | b [element 2] : | +| array_flow.rb:375:9:375:17 | call to drop [element 1] : | array_flow.rb:375:5:375:5 | b [element 1] : | +| array_flow.rb:375:9:375:17 | call to drop [element 1] : | array_flow.rb:375:5:375:5 | b [element 1] : | +| array_flow.rb:375:9:375:17 | call to drop [element 2] : | array_flow.rb:375:5:375:5 | b [element 2] : | +| array_flow.rb:375:9:375:17 | call to drop [element 2] : | array_flow.rb:375:5:375:5 | b [element 2] : | | array_flow.rb:377:10:377:10 | b [element 1] : | array_flow.rb:377:10:377:13 | ...[...] | | array_flow.rb:377:10:377:10 | b [element 1] : | array_flow.rb:377:10:377:13 | ...[...] | | array_flow.rb:378:10:378:10 | b [element 1] : | array_flow.rb:378:10:378:13 | ...[...] | @@ -658,30 +835,42 @@ edges | array_flow.rb:379:5:379:5 | [post] a [element] : | array_flow.rb:380:9:380:9 | a [element] : | | array_flow.rb:379:12:379:23 | call to source : | array_flow.rb:379:5:379:5 | [post] a [element] : | | array_flow.rb:379:12:379:23 | call to source : | array_flow.rb:379:5:379:5 | [post] a [element] : | +| array_flow.rb:380:5:380:5 | b [element 1] : | array_flow.rb:381:10:381:10 | b [element 1] : | +| array_flow.rb:380:5:380:5 | b [element 1] : | array_flow.rb:381:10:381:10 | b [element 1] : | +| array_flow.rb:380:5:380:5 | b [element] : | array_flow.rb:381:10:381:10 | b [element] : | +| array_flow.rb:380:5:380:5 | b [element] : | array_flow.rb:381:10:381:10 | b [element] : | +| array_flow.rb:380:5:380:5 | b [element] : | array_flow.rb:382:9:382:9 | b [element] : | +| array_flow.rb:380:5:380:5 | b [element] : | array_flow.rb:382:9:382:9 | b [element] : | | array_flow.rb:380:9:380:9 | a [element 2] : | array_flow.rb:380:9:380:17 | call to drop [element 1] : | | array_flow.rb:380:9:380:9 | a [element 2] : | array_flow.rb:380:9:380:17 | call to drop [element 1] : | | array_flow.rb:380:9:380:9 | a [element] : | array_flow.rb:380:9:380:17 | call to drop [element] : | | array_flow.rb:380:9:380:9 | a [element] : | array_flow.rb:380:9:380:17 | call to drop [element] : | -| array_flow.rb:380:9:380:17 | call to drop [element 1] : | array_flow.rb:381:10:381:10 | b [element 1] : | -| array_flow.rb:380:9:380:17 | call to drop [element 1] : | array_flow.rb:381:10:381:10 | b [element 1] : | -| array_flow.rb:380:9:380:17 | call to drop [element] : | array_flow.rb:381:10:381:10 | b [element] : | -| array_flow.rb:380:9:380:17 | call to drop [element] : | array_flow.rb:381:10:381:10 | b [element] : | -| array_flow.rb:380:9:380:17 | call to drop [element] : | array_flow.rb:382:9:382:9 | b [element] : | -| array_flow.rb:380:9:380:17 | call to drop [element] : | array_flow.rb:382:9:382:9 | b [element] : | +| array_flow.rb:380:9:380:17 | call to drop [element 1] : | array_flow.rb:380:5:380:5 | b [element 1] : | +| array_flow.rb:380:9:380:17 | call to drop [element 1] : | array_flow.rb:380:5:380:5 | b [element 1] : | +| array_flow.rb:380:9:380:17 | call to drop [element] : | array_flow.rb:380:5:380:5 | b [element] : | +| array_flow.rb:380:9:380:17 | call to drop [element] : | array_flow.rb:380:5:380:5 | b [element] : | | array_flow.rb:381:10:381:10 | b [element 1] : | array_flow.rb:381:10:381:13 | ...[...] | | array_flow.rb:381:10:381:10 | b [element 1] : | array_flow.rb:381:10:381:13 | ...[...] | | array_flow.rb:381:10:381:10 | b [element] : | array_flow.rb:381:10:381:13 | ...[...] | | array_flow.rb:381:10:381:10 | b [element] : | array_flow.rb:381:10:381:13 | ...[...] | +| array_flow.rb:382:5:382:5 | c [element] : | array_flow.rb:383:10:383:10 | c [element] : | +| array_flow.rb:382:5:382:5 | c [element] : | array_flow.rb:383:10:383:10 | c [element] : | | array_flow.rb:382:9:382:9 | b [element] : | array_flow.rb:382:9:382:19 | call to drop [element] : | | array_flow.rb:382:9:382:9 | b [element] : | array_flow.rb:382:9:382:19 | call to drop [element] : | -| array_flow.rb:382:9:382:19 | call to drop [element] : | array_flow.rb:383:10:383:10 | c [element] : | -| array_flow.rb:382:9:382:19 | call to drop [element] : | array_flow.rb:383:10:383:10 | c [element] : | +| array_flow.rb:382:9:382:19 | call to drop [element] : | array_flow.rb:382:5:382:5 | c [element] : | +| array_flow.rb:382:9:382:19 | call to drop [element] : | array_flow.rb:382:5:382:5 | c [element] : | | array_flow.rb:383:10:383:10 | c [element] : | array_flow.rb:383:10:383:13 | ...[...] | | array_flow.rb:383:10:383:10 | c [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 [element 2] : | -| array_flow.rb:387:16:387:27 | call to source : | array_flow.rb:388:9:388:9 | a [element 2] : | -| array_flow.rb:387:30:387:41 | call to source : | array_flow.rb:388:9:388:9 | a [element 3] : | -| array_flow.rb:387:30:387:41 | call to source : | array_flow.rb:388:9:388:9 | a [element 3] : | +| array_flow.rb:387:5:387:5 | a [element 2] : | array_flow.rb:388:9:388:9 | a [element 2] : | +| array_flow.rb:387:5:387:5 | a [element 2] : | array_flow.rb:388:9:388:9 | a [element 2] : | +| array_flow.rb:387:5:387:5 | a [element 3] : | array_flow.rb:388:9:388:9 | a [element 3] : | +| array_flow.rb:387:5:387:5 | a [element 3] : | array_flow.rb:388:9:388:9 | a [element 3] : | +| array_flow.rb:387:16:387:27 | call to source : | array_flow.rb:387:5:387:5 | a [element 2] : | +| array_flow.rb:387:16:387:27 | call to source : | array_flow.rb:387:5:387:5 | a [element 2] : | +| array_flow.rb:387:30:387:41 | call to source : | array_flow.rb:387:5:387:5 | a [element 3] : | +| array_flow.rb:387:30:387:41 | call to source : | array_flow.rb:387:5:387:5 | a [element 3] : | +| array_flow.rb:388:5:388:5 | b [element] : | array_flow.rb:391:10:391:10 | b [element] : | +| array_flow.rb:388:5:388:5 | b [element] : | array_flow.rb:391:10:391:10 | b [element] : | | array_flow.rb:388:9:388:9 | a [element 2] : | array_flow.rb:388:9:390:7 | call to drop_while [element] : | | array_flow.rb:388:9:388:9 | a [element 2] : | array_flow.rb:388:9:390:7 | call to drop_while [element] : | | array_flow.rb:388:9:388:9 | a [element 2] : | array_flow.rb:388:26:388:26 | x : | @@ -690,40 +879,50 @@ edges | array_flow.rb:388:9:388:9 | a [element 3] : | array_flow.rb:388:9:390:7 | call to drop_while [element] : | | array_flow.rb:388:9:388:9 | a [element 3] : | array_flow.rb:388:26:388:26 | x : | | array_flow.rb:388:9:388:9 | a [element 3] : | array_flow.rb:388:26:388:26 | x : | -| array_flow.rb:388:9:390:7 | call to drop_while [element] : | array_flow.rb:391:10:391:10 | b [element] : | -| array_flow.rb:388:9:390:7 | call to drop_while [element] : | array_flow.rb:391:10:391:10 | b [element] : | +| array_flow.rb:388:9:390:7 | call to drop_while [element] : | array_flow.rb:388:5:388:5 | b [element] : | +| array_flow.rb:388:9:390:7 | call to drop_while [element] : | array_flow.rb:388:5:388:5 | b [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 [element] : | array_flow.rb:391:10:391:13 | ...[...] | | array_flow.rb:391:10:391:10 | b [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 [element 2] : | -| array_flow.rb:395:16:395:25 | call to source : | array_flow.rb:396:9:396:9 | a [element 2] : | +| array_flow.rb:395:5:395:5 | a [element 2] : | array_flow.rb:396:9:396:9 | a [element 2] : | +| array_flow.rb:395:5:395:5 | a [element 2] : | array_flow.rb:396:9:396:9 | a [element 2] : | +| array_flow.rb:395:16:395:25 | call to source : | array_flow.rb:395:5:395:5 | a [element 2] : | +| array_flow.rb:395:16:395:25 | call to source : | array_flow.rb:395:5:395:5 | a [element 2] : | +| array_flow.rb:396:5:396:5 | b [element 2] : | array_flow.rb:399:10:399:10 | b [element 2] : | +| array_flow.rb:396:5:396:5 | b [element 2] : | array_flow.rb:399:10:399:10 | b [element 2] : | | array_flow.rb:396:9:396:9 | a [element 2] : | array_flow.rb:396:9:398:7 | call to each [element 2] : | | array_flow.rb:396:9:396:9 | a [element 2] : | array_flow.rb:396:9:398:7 | call to each [element 2] : | | array_flow.rb:396:9:396:9 | a [element 2] : | array_flow.rb:396:20:396:20 | x : | | array_flow.rb:396:9:396:9 | a [element 2] : | array_flow.rb:396:20:396:20 | x : | -| array_flow.rb:396:9:398:7 | call to each [element 2] : | array_flow.rb:399:10:399:10 | b [element 2] : | -| array_flow.rb:396:9:398:7 | call to each [element 2] : | array_flow.rb:399:10:399:10 | b [element 2] : | +| array_flow.rb:396:9:398:7 | call to each [element 2] : | array_flow.rb:396:5:396:5 | b [element 2] : | +| array_flow.rb:396:9:398:7 | call to each [element 2] : | array_flow.rb:396:5:396:5 | b [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 [element 2] : | array_flow.rb:399:10:399:13 | ...[...] | | array_flow.rb:399:10:399:10 | b [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 [element 2] : | -| array_flow.rb:403:16:403:25 | call to source : | array_flow.rb:404:18:404:18 | a [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:403:5:403:5 | a [element 2] : | array_flow.rb:404:18:404:18 | a [element 2] : | +| array_flow.rb:403:5:403:5 | a [element 2] : | array_flow.rb:404:18:404:18 | a [element 2] : | +| array_flow.rb:403:16:403:25 | call to source : | array_flow.rb:403:5:403:5 | a [element 2] : | +| array_flow.rb:403:16:403:25 | call to source : | array_flow.rb:403:5:403:5 | a [element 2] : | +| array_flow.rb:404:5:404:5 | b [element 2] : | array_flow.rb:408:10:408:10 | b [element 2] : | +| array_flow.rb:404:5:404:5 | b [element 2] : | array_flow.rb:408:10:408:10 | b [element 2] : | +| array_flow.rb:404:9:406:7 | __synth__0__1 : | array_flow.rb:404:13:404:13 | x : | +| array_flow.rb:404:9:406:7 | __synth__0__1 : | array_flow.rb:404:13:404:13 | x : | +| array_flow.rb:404:13:404:13 | x : | array_flow.rb:405:14:405:14 | x | +| array_flow.rb:404:13:404:13 | x : | array_flow.rb:405:14:405:14 | x | +| array_flow.rb:404:13:404:13 | x : | array_flow.rb:407:10:407:10 | x | +| array_flow.rb:404:13:404:13 | x : | array_flow.rb:407:10:407:10 | x | +| array_flow.rb:404:18:404:18 | a [element 2] : | array_flow.rb:404:5:404:5 | b [element 2] : | +| array_flow.rb:404:18:404:18 | a [element 2] : | array_flow.rb:404:5:404:5 | b [element 2] : | | array_flow.rb:404:18:404:18 | a [element 2] : | array_flow.rb:404:9:406:7 | __synth__0__1 : | | array_flow.rb:404:18:404:18 | a [element 2] : | array_flow.rb:404:9:406:7 | __synth__0__1 : | -| array_flow.rb:404:18:404:18 | a [element 2] : | array_flow.rb:408:10:408:10 | b [element 2] : | -| array_flow.rb:404:18:404:18 | a [element 2] : | array_flow.rb:408:10:408:10 | b [element 2] : | | array_flow.rb:408:10:408:10 | b [element 2] : | array_flow.rb:408:10:408:13 | ...[...] | | array_flow.rb:408:10:408:10 | b [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 [element 2] : | -| array_flow.rb:412:16:412:25 | call to source : | array_flow.rb:413:5:413:5 | a [element 2] : | +| array_flow.rb:412:5:412:5 | a [element 2] : | array_flow.rb:413:5:413:5 | a [element 2] : | +| array_flow.rb:412:5:412:5 | a [element 2] : | array_flow.rb:413:5:413:5 | a [element 2] : | +| array_flow.rb:412:16:412:25 | call to source : | array_flow.rb:412:5:412:5 | a [element 2] : | +| array_flow.rb:412:16:412:25 | call to source : | array_flow.rb:412:5:412:5 | a [element 2] : | | array_flow.rb:413:5:413:5 | a [element 2] : | array_flow.rb:413:24:413:24 | x [element] : | | array_flow.rb:413:5:413:5 | a [element 2] : | array_flow.rb:413:24:413:24 | x [element] : | | array_flow.rb:413:24:413:24 | x [element] : | array_flow.rb:414:15:414:15 | x [element] : | @@ -732,52 +931,70 @@ edges | array_flow.rb:414:15:414:15 | x [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 [element 2] : | -| array_flow.rb:419:16:419:25 | call to source : | array_flow.rb:420:9:420:9 | a [element 2] : | +| array_flow.rb:419:5:419:5 | a [element 2] : | array_flow.rb:420:9:420:9 | a [element 2] : | +| array_flow.rb:419:5:419:5 | a [element 2] : | array_flow.rb:420:9:420:9 | a [element 2] : | +| array_flow.rb:419:16:419:25 | call to source : | array_flow.rb:419:5:419:5 | a [element 2] : | +| array_flow.rb:419:16:419:25 | call to source : | array_flow.rb:419:5:419:5 | a [element 2] : | +| array_flow.rb:420:5:420:5 | b [element 2] : | array_flow.rb:423:10:423:10 | b [element 2] : | +| array_flow.rb:420:5:420:5 | b [element 2] : | array_flow.rb:423:10:423:10 | b [element 2] : | | array_flow.rb:420:9:420:9 | a [element 2] : | array_flow.rb:420:9:422:7 | call to each_entry [element 2] : | | array_flow.rb:420:9:420:9 | a [element 2] : | array_flow.rb:420:9:422:7 | call to each_entry [element 2] : | | array_flow.rb:420:9:420:9 | a [element 2] : | array_flow.rb:420:26:420:26 | x : | | array_flow.rb:420:9:420:9 | a [element 2] : | array_flow.rb:420:26:420:26 | x : | -| array_flow.rb:420:9:422:7 | call to each_entry [element 2] : | array_flow.rb:423:10:423:10 | b [element 2] : | -| array_flow.rb:420:9:422:7 | call to each_entry [element 2] : | array_flow.rb:423:10:423:10 | b [element 2] : | +| array_flow.rb:420:9:422:7 | call to each_entry [element 2] : | array_flow.rb:420:5:420:5 | b [element 2] : | +| array_flow.rb:420:9:422:7 | call to each_entry [element 2] : | array_flow.rb:420:5:420:5 | b [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 [element 2] : | array_flow.rb:423:10:423:13 | ...[...] | | array_flow.rb:423:10:423:10 | b [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 [element 2] : | -| array_flow.rb:427:16:427:25 | call to source : | array_flow.rb:428:9:428:9 | a [element 2] : | +| array_flow.rb:427:5:427:5 | a [element 2] : | array_flow.rb:428:9:428:9 | a [element 2] : | +| array_flow.rb:427:5:427:5 | a [element 2] : | array_flow.rb:428:9:428:9 | a [element 2] : | +| array_flow.rb:427:16:427:25 | call to source : | array_flow.rb:427:5:427:5 | a [element 2] : | +| array_flow.rb:427:16:427:25 | call to source : | array_flow.rb:427:5:427:5 | a [element 2] : | +| array_flow.rb:428:5:428:5 | b [element 2] : | array_flow.rb:431:10:431:10 | b [element 2] : | +| array_flow.rb:428:5:428:5 | b [element 2] : | array_flow.rb:431:10:431:10 | b [element 2] : | | array_flow.rb:428:9:428:9 | a [element 2] : | array_flow.rb:428:9:430:7 | call to each_index [element 2] : | | array_flow.rb:428:9:428:9 | a [element 2] : | array_flow.rb:428:9:430:7 | call to each_index [element 2] : | -| array_flow.rb:428:9:430:7 | call to each_index [element 2] : | array_flow.rb:431:10:431:10 | b [element 2] : | -| array_flow.rb:428:9:430:7 | call to each_index [element 2] : | array_flow.rb:431:10:431:10 | b [element 2] : | +| array_flow.rb:428:9:430:7 | call to each_index [element 2] : | array_flow.rb:428:5:428:5 | b [element 2] : | +| array_flow.rb:428:9:430:7 | call to each_index [element 2] : | array_flow.rb:428:5:428:5 | b [element 2] : | | array_flow.rb:431:10:431:10 | b [element 2] : | array_flow.rb:431:10:431:13 | ...[...] | | array_flow.rb:431:10:431:10 | b [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 [element 3] : | -| array_flow.rb:435:19:435:28 | call to source : | array_flow.rb:436:5:436:5 | a [element 3] : | +| array_flow.rb:435:5:435:5 | a [element 3] : | array_flow.rb:436:5:436:5 | a [element 3] : | +| array_flow.rb:435:5:435:5 | a [element 3] : | array_flow.rb:436:5:436:5 | a [element 3] : | +| array_flow.rb:435:19:435:28 | call to source : | array_flow.rb:435:5:435:5 | a [element 3] : | +| array_flow.rb:435:19:435:28 | call to source : | array_flow.rb:435:5:435:5 | a [element 3] : | | array_flow.rb:436:5:436:5 | a [element 3] : | array_flow.rb:436:25:436:25 | x [element] : | | array_flow.rb:436:5:436:5 | a [element 3] : | array_flow.rb:436:25:436:25 | x [element] : | | array_flow.rb:436:25:436:25 | x [element] : | array_flow.rb:437:14:437:14 | x [element] : | | array_flow.rb:436:25:436:25 | x [element] : | array_flow.rb:437:14:437:14 | x [element] : | | array_flow.rb:437:14:437:14 | x [element] : | array_flow.rb:437:14:437:17 | ...[...] | | array_flow.rb:437:14:437:14 | x [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 [element 3] : | -| array_flow.rb:442:19:442:28 | call to source : | array_flow.rb:443:9:443:9 | a [element 3] : | +| array_flow.rb:442:5:442:5 | a [element 3] : | array_flow.rb:443:9:443:9 | a [element 3] : | +| array_flow.rb:442:5:442:5 | a [element 3] : | array_flow.rb:443:9:443:9 | a [element 3] : | +| array_flow.rb:442:19:442:28 | call to source : | array_flow.rb:442:5:442:5 | a [element 3] : | +| array_flow.rb:442:19:442:28 | call to source : | array_flow.rb:442:5:442:5 | a [element 3] : | +| array_flow.rb:443:5:443:5 | b [element 3] : | array_flow.rb:447:10:447:10 | b [element 3] : | +| array_flow.rb:443:5:443:5 | b [element 3] : | array_flow.rb:447:10:447:10 | b [element 3] : | | array_flow.rb:443:9:443:9 | a [element 3] : | array_flow.rb:443:9:446:7 | call to each_with_index [element 3] : | | array_flow.rb:443:9:443:9 | a [element 3] : | array_flow.rb:443:9:446:7 | call to each_with_index [element 3] : | | array_flow.rb:443:9:443:9 | a [element 3] : | array_flow.rb:443:31:443:31 | x : | | array_flow.rb:443:9:443:9 | a [element 3] : | array_flow.rb:443:31:443:31 | x : | -| array_flow.rb:443:9:446:7 | call to each_with_index [element 3] : | array_flow.rb:447:10:447:10 | b [element 3] : | -| array_flow.rb:443:9:446:7 | call to each_with_index [element 3] : | array_flow.rb:447:10:447:10 | b [element 3] : | +| array_flow.rb:443:9:446:7 | call to each_with_index [element 3] : | array_flow.rb:443:5:443:5 | b [element 3] : | +| array_flow.rb:443:9:446:7 | call to each_with_index [element 3] : | array_flow.rb:443:5:443:5 | b [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 [element 3] : | array_flow.rb:447:10:447:13 | ...[...] | | array_flow.rb:447:10:447:10 | b [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 [element 3] : | -| array_flow.rb:451:19:451:30 | call to source : | array_flow.rb:452:9:452:9 | a [element 3] : | +| array_flow.rb:451:5:451:5 | a [element 3] : | array_flow.rb:452:9:452:9 | a [element 3] : | +| array_flow.rb:451:5:451:5 | a [element 3] : | array_flow.rb:452:9:452:9 | a [element 3] : | +| array_flow.rb:451:19:451:30 | call to source : | array_flow.rb:451:5:451:5 | a [element 3] : | +| array_flow.rb:451:19:451:30 | call to source : | array_flow.rb:451:5:451:5 | a [element 3] : | +| array_flow.rb:452:5:452:5 | b : | array_flow.rb:456:10:456:10 | b | +| array_flow.rb:452:5:452:5 | b : | array_flow.rb:456:10:456:10 | b | | array_flow.rb:452:9:452:9 | a [element 3] : | array_flow.rb:452:46:452:46 | x : | | array_flow.rb:452:9:452:9 | a [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:9:455:7 | call to each_with_object : | array_flow.rb:452:5:452:5 | b : | +| array_flow.rb:452:9:455:7 | call to each_with_object : | array_flow.rb:452:5:452:5 | 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 : | @@ -786,60 +1003,80 @@ edges | 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 [element 3] : | -| array_flow.rb:460:19:460:28 | call to source : | array_flow.rb:461:9:461:9 | a [element 3] : | +| array_flow.rb:460:5:460:5 | a [element 3] : | array_flow.rb:461:9:461:9 | a [element 3] : | +| array_flow.rb:460:5:460:5 | a [element 3] : | array_flow.rb:461:9:461:9 | a [element 3] : | +| array_flow.rb:460:19:460:28 | call to source : | array_flow.rb:460:5:460:5 | a [element 3] : | +| array_flow.rb:460:19:460:28 | call to source : | array_flow.rb:460:5:460:5 | a [element 3] : | +| array_flow.rb:461:5:461:5 | b [element 3] : | array_flow.rb:462:10:462:10 | b [element 3] : | +| array_flow.rb:461:5:461:5 | b [element 3] : | array_flow.rb:462:10:462:10 | b [element 3] : | | array_flow.rb:461:9:461:9 | a [element 3] : | array_flow.rb:461:9:461:17 | call to entries [element 3] : | | array_flow.rb:461:9:461:9 | a [element 3] : | array_flow.rb:461:9:461:17 | call to entries [element 3] : | -| array_flow.rb:461:9:461:17 | call to entries [element 3] : | array_flow.rb:462:10:462:10 | b [element 3] : | -| array_flow.rb:461:9:461:17 | call to entries [element 3] : | array_flow.rb:462:10:462:10 | b [element 3] : | +| array_flow.rb:461:9:461:17 | call to entries [element 3] : | array_flow.rb:461:5:461:5 | b [element 3] : | +| array_flow.rb:461:9:461:17 | call to entries [element 3] : | array_flow.rb:461:5:461:5 | b [element 3] : | | array_flow.rb:462:10:462:10 | b [element 3] : | array_flow.rb:462:10:462:13 | ...[...] | | array_flow.rb:462:10:462:10 | b [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 [element 3] : | -| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:467:9:467:9 | a [element 3] : | -| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:471:9:471:9 | a [element 3] : | -| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:471:9:471:9 | a [element 3] : | -| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:473:9:473:9 | a [element 3] : | -| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:473:9:473:9 | a [element 3] : | -| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:477:9:477:9 | a [element 3] : | -| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:477:9:477:9 | a [element 3] : | -| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:467:9:467:9 | a [element 4] : | -| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:467:9:467:9 | a [element 4] : | -| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:477:9:477:9 | a [element 4] : | -| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:477:9:477:9 | a [element 4] : | +| array_flow.rb:466:5:466:5 | a [element 3] : | array_flow.rb:467:9:467:9 | a [element 3] : | +| array_flow.rb:466:5:466:5 | a [element 3] : | array_flow.rb:467:9:467:9 | a [element 3] : | +| array_flow.rb:466:5:466:5 | a [element 3] : | array_flow.rb:471:9:471:9 | a [element 3] : | +| array_flow.rb:466:5:466:5 | a [element 3] : | array_flow.rb:471:9:471:9 | a [element 3] : | +| array_flow.rb:466:5:466:5 | a [element 3] : | array_flow.rb:473:9:473:9 | a [element 3] : | +| array_flow.rb:466:5:466:5 | a [element 3] : | array_flow.rb:473:9:473:9 | a [element 3] : | +| array_flow.rb:466:5:466:5 | a [element 3] : | array_flow.rb:477:9:477:9 | a [element 3] : | +| array_flow.rb:466:5:466:5 | a [element 3] : | array_flow.rb:477:9:477:9 | a [element 3] : | +| array_flow.rb:466:5:466:5 | a [element 4] : | array_flow.rb:467:9:467:9 | a [element 4] : | +| array_flow.rb:466:5:466:5 | a [element 4] : | array_flow.rb:467:9:467:9 | a [element 4] : | +| array_flow.rb:466:5:466:5 | a [element 4] : | array_flow.rb:477:9:477:9 | a [element 4] : | +| array_flow.rb:466:5:466:5 | a [element 4] : | array_flow.rb:477:9:477:9 | a [element 4] : | +| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:466:5:466:5 | a [element 3] : | +| array_flow.rb:466:19:466:30 | call to source : | array_flow.rb:466:5:466:5 | a [element 3] : | +| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:466:5:466:5 | a [element 4] : | +| array_flow.rb:466:33:466:44 | call to source : | array_flow.rb:466:5:466:5 | a [element 4] : | +| array_flow.rb:467:5:467:5 | b : | array_flow.rb:470:10:470:10 | b | +| array_flow.rb:467:5:467:5 | b : | array_flow.rb:470:10:470:10 | b | | array_flow.rb:467:9:467:9 | a [element 3] : | array_flow.rb:467:9:469:7 | call to fetch : | | array_flow.rb:467:9:467:9 | a [element 3] : | array_flow.rb:467:9:469:7 | call to fetch : | | array_flow.rb:467:9:467:9 | a [element 4] : | array_flow.rb:467:9:469:7 | call to fetch : | | array_flow.rb:467:9:467:9 | a [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:9:469:7 | call to fetch : | array_flow.rb:467:5:467:5 | b : | +| array_flow.rb:467:9:469:7 | call to fetch : | array_flow.rb:467:5:467:5 | 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:5:471:5 | b : | array_flow.rb:472:10:472:10 | b | +| array_flow.rb:471:5:471:5 | b : | array_flow.rb:472:10:472:10 | b | | array_flow.rb:471:9:471:9 | a [element 3] : | array_flow.rb:471:9:471:18 | call to fetch : | | array_flow.rb:471:9:471:9 | a [element 3] : | array_flow.rb:471:9:471:18 | call to fetch : | -| 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:471:9:471:18 | call to fetch : | array_flow.rb:471:5:471:5 | b : | +| array_flow.rb:471:9:471:18 | call to fetch : | array_flow.rb:471:5:471:5 | b : | +| array_flow.rb:473:5:473:5 | b : | array_flow.rb:474:10:474:10 | b | +| array_flow.rb:473:5:473:5 | b : | array_flow.rb:474:10:474:10 | b | | array_flow.rb:473:9:473:9 | a [element 3] : | array_flow.rb:473:9:473:32 | call to fetch : | | array_flow.rb:473:9:473:9 | a [element 3] : | array_flow.rb:473:9:473:32 | call to fetch : | -| 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:9:473:32 | call to fetch : | array_flow.rb:473:5:473:5 | b : | +| array_flow.rb:473:9:473:32 | call to fetch : | array_flow.rb:473:5:473:5 | 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: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:5:475:5 | b : | array_flow.rb:476:10:476:10 | b | +| array_flow.rb:475:5:475:5 | b : | array_flow.rb:476:10:476:10 | b | +| array_flow.rb:475:9:475:34 | call to fetch : | array_flow.rb:475:5:475:5 | b : | +| array_flow.rb:475:9:475:34 | call to fetch : | array_flow.rb:475:5:475:5 | 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:5:477:5 | b : | array_flow.rb:478:10:478:10 | b | +| array_flow.rb:477:5:477:5 | b : | array_flow.rb:478:10:478:10 | b | | array_flow.rb:477:9:477:9 | a [element 3] : | array_flow.rb:477:9:477:32 | call to fetch : | | array_flow.rb:477:9:477:9 | a [element 3] : | array_flow.rb:477:9:477:32 | call to fetch : | | array_flow.rb:477:9:477:9 | a [element 4] : | array_flow.rb:477:9:477:32 | call to fetch : | | array_flow.rb:477:9:477:9 | a [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:9:477:32 | call to fetch : | array_flow.rb:477:5:477:5 | b : | +| array_flow.rb:477:9:477:32 | call to fetch : | array_flow.rb:477:5:477:5 | 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 [element 3] : | -| array_flow.rb:482:19:482:30 | call to source : | array_flow.rb:484:10:484:10 | a [element 3] : | +| array_flow.rb:482:5:482:5 | a [element 3] : | array_flow.rb:484:10:484:10 | a [element 3] : | +| array_flow.rb:482:5:482:5 | a [element 3] : | array_flow.rb:484:10:484:10 | a [element 3] : | +| array_flow.rb:482:19:482:30 | call to source : | array_flow.rb:482:5:482:5 | a [element 3] : | +| array_flow.rb:482:19:482:30 | call to source : | array_flow.rb:482:5:482:5 | a [element 3] : | | array_flow.rb:483:5:483:5 | [post] a [element] : | array_flow.rb:484:10:484:10 | a [element] : | | array_flow.rb:483:5:483:5 | [post] a [element] : | array_flow.rb:484:10:484:10 | a [element] : | | array_flow.rb:483:12:483:23 | call to source : | array_flow.rb:483:5:483:5 | [post] a [element] : | @@ -868,32 +1105,44 @@ edges | array_flow.rb:492:9:492:20 | call to source : | array_flow.rb:491:5:491:5 | [post] a [element] : | | array_flow.rb:494:10:494:10 | a [element] : | array_flow.rb:494:10:494:13 | ...[...] | | array_flow.rb:494:10:494:10 | a [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 [element 3] : | -| array_flow.rb:498:19:498:28 | call to source : | array_flow.rb:499:9:499:9 | a [element 3] : | +| array_flow.rb:498:5:498:5 | a [element 3] : | array_flow.rb:499:9:499:9 | a [element 3] : | +| array_flow.rb:498:5:498:5 | a [element 3] : | array_flow.rb:499:9:499:9 | a [element 3] : | +| array_flow.rb:498:19:498:28 | call to source : | array_flow.rb:498:5:498:5 | a [element 3] : | +| array_flow.rb:498:19:498:28 | call to source : | array_flow.rb:498:5:498:5 | a [element 3] : | +| array_flow.rb:499:5:499:5 | b [element] : | array_flow.rb:502:10:502:10 | b [element] : | +| array_flow.rb:499:5:499:5 | b [element] : | array_flow.rb:502:10:502:10 | b [element] : | | array_flow.rb:499:9:499:9 | a [element 3] : | array_flow.rb:499:9:501:7 | call to filter [element] : | | array_flow.rb:499:9:499:9 | a [element 3] : | array_flow.rb:499:9:501:7 | call to filter [element] : | | array_flow.rb:499:9:499:9 | a [element 3] : | array_flow.rb:499:22:499:22 | x : | | array_flow.rb:499:9:499:9 | a [element 3] : | array_flow.rb:499:22:499:22 | x : | -| array_flow.rb:499:9:501:7 | call to filter [element] : | array_flow.rb:502:10:502:10 | b [element] : | -| array_flow.rb:499:9:501:7 | call to filter [element] : | array_flow.rb:502:10:502:10 | b [element] : | +| array_flow.rb:499:9:501:7 | call to filter [element] : | array_flow.rb:499:5:499:5 | b [element] : | +| array_flow.rb:499:9:501:7 | call to filter [element] : | array_flow.rb:499:5:499:5 | b [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 [element] : | array_flow.rb:502:10:502:13 | ...[...] | | array_flow.rb:502:10:502:10 | b [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 [element 3] : | -| array_flow.rb:506:19:506:28 | call to source : | array_flow.rb:507:9:507:9 | a [element 3] : | +| array_flow.rb:506:5:506:5 | a [element 3] : | array_flow.rb:507:9:507:9 | a [element 3] : | +| array_flow.rb:506:5:506:5 | a [element 3] : | array_flow.rb:507:9:507:9 | a [element 3] : | +| array_flow.rb:506:19:506:28 | call to source : | array_flow.rb:506:5:506:5 | a [element 3] : | +| array_flow.rb:506:19:506:28 | call to source : | array_flow.rb:506:5:506:5 | a [element 3] : | +| array_flow.rb:507:5:507:5 | b [element] : | array_flow.rb:510:10:510:10 | b [element] : | +| array_flow.rb:507:5:507:5 | b [element] : | array_flow.rb:510:10:510:10 | b [element] : | | array_flow.rb:507:9:507:9 | a [element 3] : | array_flow.rb:507:9:509:7 | call to filter_map [element] : | | array_flow.rb:507:9:507:9 | a [element 3] : | array_flow.rb:507:9:509:7 | call to filter_map [element] : | | array_flow.rb:507:9:507:9 | a [element 3] : | array_flow.rb:507:26:507:26 | x : | | array_flow.rb:507:9:507:9 | a [element 3] : | array_flow.rb:507:26:507:26 | x : | -| array_flow.rb:507:9:509:7 | call to filter_map [element] : | array_flow.rb:510:10:510:10 | b [element] : | -| array_flow.rb:507:9:509:7 | call to filter_map [element] : | array_flow.rb:510:10:510:10 | b [element] : | +| array_flow.rb:507:9:509:7 | call to filter_map [element] : | array_flow.rb:507:5:507:5 | b [element] : | +| array_flow.rb:507:9:509:7 | call to filter_map [element] : | array_flow.rb:507:5:507:5 | b [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 [element] : | array_flow.rb:510:10:510:13 | ...[...] | | array_flow.rb:510:10:510:10 | b [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 [element 3] : | -| array_flow.rb:514:19:514:28 | call to source : | array_flow.rb:515:9:515:9 | a [element 3] : | +| array_flow.rb:514:5:514:5 | a [element 3] : | array_flow.rb:515:9:515:9 | a [element 3] : | +| array_flow.rb:514:5:514:5 | a [element 3] : | array_flow.rb:515:9:515:9 | a [element 3] : | +| array_flow.rb:514:19:514:28 | call to source : | array_flow.rb:514:5:514:5 | a [element 3] : | +| array_flow.rb:514:19:514:28 | call to source : | array_flow.rb:514:5:514:5 | a [element 3] : | +| array_flow.rb:515:5:515:5 | b [element] : | array_flow.rb:520:10:520:10 | b [element] : | +| array_flow.rb:515:5:515:5 | b [element] : | array_flow.rb:520:10:520:10 | b [element] : | | array_flow.rb:515:9:515:9 | [post] a [element] : | array_flow.rb:519:10:519:10 | a [element] : | | array_flow.rb:515:9:515:9 | [post] a [element] : | array_flow.rb:519:10:519:10 | a [element] : | | array_flow.rb:515:9:515:9 | a [element 3] : | array_flow.rb:515:9:515:9 | [post] a [element] : | @@ -902,52 +1151,66 @@ edges | array_flow.rb:515:9:515:9 | a [element 3] : | array_flow.rb:515:9:518:7 | call to filter! [element] : | | array_flow.rb:515:9:515:9 | a [element 3] : | array_flow.rb:515:23:515:23 | x : | | array_flow.rb:515:9:515:9 | a [element 3] : | array_flow.rb:515:23:515:23 | x : | -| array_flow.rb:515:9:518:7 | call to filter! [element] : | array_flow.rb:520:10:520:10 | b [element] : | -| array_flow.rb:515:9:518:7 | call to filter! [element] : | array_flow.rb:520:10:520:10 | b [element] : | +| array_flow.rb:515:9:518:7 | call to filter! [element] : | array_flow.rb:515:5:515:5 | b [element] : | +| array_flow.rb:515:9:518:7 | call to filter! [element] : | array_flow.rb:515:5:515:5 | b [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 [element] : | array_flow.rb:519:10:519:13 | ...[...] | | array_flow.rb:519:10:519:10 | a [element] : | array_flow.rb:519:10:519:13 | ...[...] | | array_flow.rb:520:10:520:10 | b [element] : | array_flow.rb:520:10:520:13 | ...[...] | | array_flow.rb:520:10:520:10 | b [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 [element 3] : | -| array_flow.rb:524:19:524:30 | call to source : | array_flow.rb:525:9:525:9 | a [element 3] : | +| array_flow.rb:524:5:524:5 | a [element 3] : | array_flow.rb:525:9:525:9 | a [element 3] : | +| array_flow.rb:524:5:524:5 | a [element 3] : | array_flow.rb:525:9:525:9 | a [element 3] : | +| array_flow.rb:524:19:524:30 | call to source : | array_flow.rb:524:5:524:5 | a [element 3] : | +| array_flow.rb:524:19:524:30 | call to source : | array_flow.rb:524:5:524:5 | a [element 3] : | +| array_flow.rb:525:5:525:5 | b : | array_flow.rb:528:10:528:10 | b | +| array_flow.rb:525:5:525:5 | b : | array_flow.rb:528:10:528:10 | b | | array_flow.rb:525:9:525:9 | a [element 3] : | array_flow.rb:525:9:527:7 | call to find : | | array_flow.rb:525:9:525:9 | a [element 3] : | array_flow.rb:525:9:527:7 | call to find : | | array_flow.rb:525:9:525:9 | a [element 3] : | array_flow.rb:525:41:525:41 | x : | | array_flow.rb:525:9:525:9 | a [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:9:527:7 | call to find : | array_flow.rb:525:5:525:5 | b : | +| array_flow.rb:525:9:527:7 | call to find : | array_flow.rb:525:5:525:5 | 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 [element 3] : | -| array_flow.rb:532:19:532:28 | call to source : | array_flow.rb:533:9:533:9 | a [element 3] : | +| array_flow.rb:532:5:532:5 | a [element 3] : | array_flow.rb:533:9:533:9 | a [element 3] : | +| array_flow.rb:532:5:532:5 | a [element 3] : | array_flow.rb:533:9:533:9 | a [element 3] : | +| array_flow.rb:532:19:532:28 | call to source : | array_flow.rb:532:5:532:5 | a [element 3] : | +| array_flow.rb:532:19:532:28 | call to source : | array_flow.rb:532:5:532:5 | a [element 3] : | +| array_flow.rb:533:5:533:5 | b [element] : | array_flow.rb:536:10:536:10 | b [element] : | +| array_flow.rb:533:5:533:5 | b [element] : | array_flow.rb:536:10:536:10 | b [element] : | | array_flow.rb:533:9:533:9 | a [element 3] : | array_flow.rb:533:9:535:7 | call to find_all [element] : | | array_flow.rb:533:9:533:9 | a [element 3] : | array_flow.rb:533:9:535:7 | call to find_all [element] : | | array_flow.rb:533:9:533:9 | a [element 3] : | array_flow.rb:533:24:533:24 | x : | | array_flow.rb:533:9:533:9 | a [element 3] : | array_flow.rb:533:24:533:24 | x : | -| array_flow.rb:533:9:535:7 | call to find_all [element] : | array_flow.rb:536:10:536:10 | b [element] : | -| array_flow.rb:533:9:535:7 | call to find_all [element] : | array_flow.rb:536:10:536:10 | b [element] : | +| array_flow.rb:533:9:535:7 | call to find_all [element] : | array_flow.rb:533:5:533:5 | b [element] : | +| array_flow.rb:533:9:535:7 | call to find_all [element] : | array_flow.rb:533:5:533:5 | b [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 [element] : | array_flow.rb:536:10:536:13 | ...[...] | | array_flow.rb:536:10:536:10 | b [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 [element 3] : | -| array_flow.rb:540:19:540:28 | call to source : | array_flow.rb:541:5:541:5 | a [element 3] : | +| array_flow.rb:540:5:540:5 | a [element 3] : | array_flow.rb:541:5:541:5 | a [element 3] : | +| array_flow.rb:540:5:540:5 | a [element 3] : | array_flow.rb:541:5:541:5 | a [element 3] : | +| array_flow.rb:540:19:540:28 | call to source : | array_flow.rb:540:5:540:5 | a [element 3] : | +| array_flow.rb:540:19:540:28 | call to source : | array_flow.rb:540:5:540:5 | a [element 3] : | | array_flow.rb:541:5:541:5 | a [element 3] : | array_flow.rb:541:22:541:22 | x : | | array_flow.rb:541:5:541:5 | a [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 [element 0] : | -| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:549:10:549:10 | a [element 0] : | -| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:550:9:550:9 | a [element 0] : | -| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:550:9:550:9 | a [element 0] : | -| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:553:9:553:9 | a [element 0] : | -| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:553:9:553:9 | a [element 0] : | -| array_flow.rb:547:30:547:41 | call to source : | array_flow.rb:553:9:553:9 | a [element 3] : | -| array_flow.rb:547:30:547:41 | call to source : | array_flow.rb:553:9:553:9 | a [element 3] : | +| array_flow.rb:547:5:547:5 | a [element 0] : | array_flow.rb:549:10:549:10 | a [element 0] : | +| array_flow.rb:547:5:547:5 | a [element 0] : | array_flow.rb:549:10:549:10 | a [element 0] : | +| array_flow.rb:547:5:547:5 | a [element 0] : | array_flow.rb:550:9:550:9 | a [element 0] : | +| array_flow.rb:547:5:547:5 | a [element 0] : | array_flow.rb:550:9:550:9 | a [element 0] : | +| array_flow.rb:547:5:547:5 | a [element 0] : | array_flow.rb:553:9:553:9 | a [element 0] : | +| array_flow.rb:547:5:547:5 | a [element 0] : | array_flow.rb:553:9:553:9 | a [element 0] : | +| array_flow.rb:547:5:547:5 | a [element 3] : | array_flow.rb:553:9:553:9 | a [element 3] : | +| array_flow.rb:547:5:547:5 | a [element 3] : | array_flow.rb:553:9:553:9 | a [element 3] : | +| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:547:5:547:5 | a [element 0] : | +| array_flow.rb:547:10:547:21 | call to source : | array_flow.rb:547:5:547:5 | a [element 0] : | +| array_flow.rb:547:30:547:41 | call to source : | array_flow.rb:547:5:547:5 | a [element 3] : | +| array_flow.rb:547:30:547:41 | call to source : | array_flow.rb:547:5:547:5 | a [element 3] : | | array_flow.rb:548:5:548:5 | [post] a [element] : | array_flow.rb:549:10:549:10 | a [element] : | | array_flow.rb:548:5:548:5 | [post] a [element] : | array_flow.rb:549:10:549:10 | a [element] : | | array_flow.rb:548:5:548:5 | [post] a [element] : | array_flow.rb:550:9:550:9 | a [element] : | @@ -960,36 +1223,46 @@ edges | array_flow.rb:549:10:549:10 | a [element 0] : | array_flow.rb:549:10:549:16 | call to first | | array_flow.rb:549:10:549:10 | a [element] : | array_flow.rb:549:10:549:16 | call to first | | array_flow.rb:549:10:549:10 | a [element] : | array_flow.rb:549:10:549:16 | call to first | +| array_flow.rb:550:5:550:5 | b [element 0] : | array_flow.rb:551:10:551:10 | b [element 0] : | +| array_flow.rb:550:5:550:5 | b [element 0] : | array_flow.rb:551:10:551:10 | b [element 0] : | +| array_flow.rb:550:5:550:5 | b [element] : | array_flow.rb:551:10:551:10 | b [element] : | +| array_flow.rb:550:5:550:5 | b [element] : | array_flow.rb:551:10:551:10 | b [element] : | +| array_flow.rb:550:5:550:5 | b [element] : | array_flow.rb:552:10:552:10 | b [element] : | +| array_flow.rb:550:5:550:5 | b [element] : | array_flow.rb:552:10:552:10 | b [element] : | | array_flow.rb:550:9:550:9 | a [element 0] : | array_flow.rb:550:9:550:18 | call to first [element 0] : | | array_flow.rb:550:9:550:9 | a [element 0] : | array_flow.rb:550:9:550:18 | call to first [element 0] : | | array_flow.rb:550:9:550:9 | a [element] : | array_flow.rb:550:9:550:18 | call to first [element] : | | array_flow.rb:550:9:550:9 | a [element] : | array_flow.rb:550:9:550:18 | call to first [element] : | -| array_flow.rb:550:9:550:18 | call to first [element 0] : | array_flow.rb:551:10:551:10 | b [element 0] : | -| array_flow.rb:550:9:550:18 | call to first [element 0] : | array_flow.rb:551:10:551:10 | b [element 0] : | -| array_flow.rb:550:9:550:18 | call to first [element] : | array_flow.rb:551:10:551:10 | b [element] : | -| array_flow.rb:550:9:550:18 | call to first [element] : | array_flow.rb:551:10:551:10 | b [element] : | -| array_flow.rb:550:9:550:18 | call to first [element] : | array_flow.rb:552:10:552:10 | b [element] : | -| array_flow.rb:550:9:550:18 | call to first [element] : | array_flow.rb:552:10:552:10 | b [element] : | +| array_flow.rb:550:9:550:18 | call to first [element 0] : | array_flow.rb:550:5:550:5 | b [element 0] : | +| array_flow.rb:550:9:550:18 | call to first [element 0] : | array_flow.rb:550:5:550:5 | b [element 0] : | +| array_flow.rb:550:9:550:18 | call to first [element] : | array_flow.rb:550:5:550:5 | b [element] : | +| array_flow.rb:550:9:550:18 | call to first [element] : | array_flow.rb:550:5:550:5 | b [element] : | | array_flow.rb:551:10:551:10 | b [element 0] : | array_flow.rb:551:10:551:13 | ...[...] | | array_flow.rb:551:10:551:10 | b [element 0] : | array_flow.rb:551:10:551:13 | ...[...] | | array_flow.rb:551:10:551:10 | b [element] : | array_flow.rb:551:10:551:13 | ...[...] | | array_flow.rb:551:10:551:10 | b [element] : | array_flow.rb:551:10:551:13 | ...[...] | | array_flow.rb:552:10:552:10 | b [element] : | array_flow.rb:552:10:552:13 | ...[...] | | array_flow.rb:552:10:552:10 | b [element] : | array_flow.rb:552:10:552:13 | ...[...] | +| array_flow.rb:553:5:553:5 | c [element 0] : | array_flow.rb:554:10:554:10 | c [element 0] : | +| array_flow.rb:553:5:553:5 | c [element 0] : | array_flow.rb:554:10:554:10 | c [element 0] : | +| array_flow.rb:553:5:553:5 | c [element 3] : | array_flow.rb:555:10:555:10 | c [element 3] : | +| array_flow.rb:553:5:553:5 | c [element 3] : | array_flow.rb:555:10:555:10 | c [element 3] : | +| array_flow.rb:553:5:553:5 | c [element] : | array_flow.rb:554:10:554:10 | c [element] : | +| array_flow.rb:553:5:553:5 | c [element] : | array_flow.rb:554:10:554:10 | c [element] : | +| array_flow.rb:553:5:553:5 | c [element] : | array_flow.rb:555:10:555:10 | c [element] : | +| array_flow.rb:553:5:553:5 | c [element] : | array_flow.rb:555:10:555:10 | c [element] : | | array_flow.rb:553:9:553:9 | a [element 0] : | array_flow.rb:553:9:553:18 | call to first [element 0] : | | array_flow.rb:553:9:553:9 | a [element 0] : | array_flow.rb:553:9:553:18 | call to first [element 0] : | | array_flow.rb:553:9:553:9 | a [element 3] : | array_flow.rb:553:9:553:18 | call to first [element 3] : | | array_flow.rb:553:9:553:9 | a [element 3] : | array_flow.rb:553:9:553:18 | call to first [element 3] : | | array_flow.rb:553:9:553:9 | a [element] : | array_flow.rb:553:9:553:18 | call to first [element] : | | array_flow.rb:553:9:553:9 | a [element] : | array_flow.rb:553:9:553:18 | call to first [element] : | -| array_flow.rb:553:9:553:18 | call to first [element 0] : | array_flow.rb:554:10:554:10 | c [element 0] : | -| array_flow.rb:553:9:553:18 | call to first [element 0] : | array_flow.rb:554:10:554:10 | c [element 0] : | -| array_flow.rb:553:9:553:18 | call to first [element 3] : | array_flow.rb:555:10:555:10 | c [element 3] : | -| array_flow.rb:553:9:553:18 | call to first [element 3] : | array_flow.rb:555:10:555:10 | c [element 3] : | -| array_flow.rb:553:9:553:18 | call to first [element] : | array_flow.rb:554:10:554:10 | c [element] : | -| array_flow.rb:553:9:553:18 | call to first [element] : | array_flow.rb:554:10:554:10 | c [element] : | -| array_flow.rb:553:9:553:18 | call to first [element] : | array_flow.rb:555:10:555:10 | c [element] : | -| array_flow.rb:553:9:553:18 | call to first [element] : | array_flow.rb:555:10:555:10 | c [element] : | +| array_flow.rb:553:9:553:18 | call to first [element 0] : | array_flow.rb:553:5:553:5 | c [element 0] : | +| array_flow.rb:553:9:553:18 | call to first [element 0] : | array_flow.rb:553:5:553:5 | c [element 0] : | +| array_flow.rb:553:9:553:18 | call to first [element 3] : | array_flow.rb:553:5:553:5 | c [element 3] : | +| array_flow.rb:553:9:553:18 | call to first [element 3] : | array_flow.rb:553:5:553:5 | c [element 3] : | +| array_flow.rb:553:9:553:18 | call to first [element] : | array_flow.rb:553:5:553:5 | c [element] : | +| array_flow.rb:553:9:553:18 | call to first [element] : | array_flow.rb:553:5:553:5 | c [element] : | | array_flow.rb:554:10:554:10 | c [element 0] : | array_flow.rb:554:10:554:13 | ...[...] | | array_flow.rb:554:10:554:10 | c [element 0] : | array_flow.rb:554:10:554:13 | ...[...] | | array_flow.rb:554:10:554:10 | c [element] : | array_flow.rb:554:10:554:13 | ...[...] | @@ -998,48 +1271,65 @@ edges | array_flow.rb:555:10:555:10 | c [element 3] : | array_flow.rb:555:10:555:13 | ...[...] | | array_flow.rb:555:10:555:10 | c [element] : | array_flow.rb:555:10:555:13 | ...[...] | | array_flow.rb:555:10:555:10 | c [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 [element 2] : | -| array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:560:9:560:9 | a [element 2] : | -| array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:565:9:565:9 | a [element 2] : | -| array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:565:9:565:9 | a [element 2] : | +| array_flow.rb:559:5:559:5 | a [element 2] : | array_flow.rb:560:9:560:9 | a [element 2] : | +| array_flow.rb:559:5:559:5 | a [element 2] : | array_flow.rb:560:9:560:9 | a [element 2] : | +| array_flow.rb:559:5:559:5 | a [element 2] : | array_flow.rb:565:9:565:9 | a [element 2] : | +| array_flow.rb:559:5:559:5 | a [element 2] : | array_flow.rb:565:9:565:9 | a [element 2] : | +| array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:559:5:559:5 | a [element 2] : | +| array_flow.rb:559:16:559:27 | call to source : | array_flow.rb:559:5:559:5 | a [element 2] : | +| array_flow.rb:560:5:560:5 | b [element] : | array_flow.rb:564:10:564:10 | b [element] : | +| array_flow.rb:560:5:560:5 | b [element] : | array_flow.rb:564:10:564:10 | b [element] : | | array_flow.rb:560:9:560:9 | a [element 2] : | array_flow.rb:560:9:563:7 | call to flat_map [element] : | | array_flow.rb:560:9:560:9 | a [element 2] : | array_flow.rb:560:9:563:7 | call to flat_map [element] : | | array_flow.rb:560:9:560:9 | a [element 2] : | array_flow.rb:560:24:560:24 | x : | | array_flow.rb:560:9:560:9 | a [element 2] : | array_flow.rb:560:24:560:24 | x : | -| array_flow.rb:560:9:563:7 | call to flat_map [element] : | array_flow.rb:564:10:564:10 | b [element] : | -| array_flow.rb:560:9:563:7 | call to flat_map [element] : | array_flow.rb:564:10:564:10 | b [element] : | +| array_flow.rb:560:9:563:7 | call to flat_map [element] : | array_flow.rb:560:5:560:5 | b [element] : | +| array_flow.rb:560:9:563:7 | call to flat_map [element] : | array_flow.rb:560:5:560:5 | b [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 [element] : | | array_flow.rb:562:13:562:24 | call to source : | array_flow.rb:560:9:563:7 | call to flat_map [element] : | | array_flow.rb:564:10:564:10 | b [element] : | array_flow.rb:564:10:564:13 | ...[...] | | array_flow.rb:564:10:564:10 | b [element] : | array_flow.rb:564:10:564:13 | ...[...] | +| array_flow.rb:565:5:565:5 | b [element] : | array_flow.rb:569:10:569:10 | b [element] : | +| array_flow.rb:565:5:565:5 | b [element] : | array_flow.rb:569:10:569:10 | b [element] : | | array_flow.rb:565:9:565:9 | a [element 2] : | array_flow.rb:565:24:565:24 | x : | | array_flow.rb:565:9:565:9 | a [element 2] : | array_flow.rb:565:24:565:24 | x : | -| array_flow.rb:565:9:568:7 | call to flat_map [element] : | array_flow.rb:569:10:569:10 | b [element] : | -| array_flow.rb:565:9:568:7 | call to flat_map [element] : | array_flow.rb:569:10:569:10 | b [element] : | +| array_flow.rb:565:9:568:7 | call to flat_map [element] : | array_flow.rb:565:5:565:5 | b [element] : | +| array_flow.rb:565:9:568:7 | call to flat_map [element] : | array_flow.rb:565:5:565:5 | b [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 [element] : | | array_flow.rb:567:9:567:20 | call to source : | array_flow.rb:565:9:568:7 | call to flat_map [element] : | | array_flow.rb:569:10:569:10 | b [element] : | array_flow.rb:569:10:569:13 | ...[...] | | array_flow.rb:569:10:569:10 | b [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 [element 2, element 1] : | -| array_flow.rb:573:20:573:29 | call to source : | array_flow.rb:574:9:574:9 | a [element 2, element 1] : | +| array_flow.rb:573:5:573:5 | a [element 2, element 1] : | array_flow.rb:574:9:574:9 | a [element 2, element 1] : | +| array_flow.rb:573:5:573:5 | a [element 2, element 1] : | array_flow.rb:574:9:574:9 | a [element 2, element 1] : | +| array_flow.rb:573:20:573:29 | call to source : | array_flow.rb:573:5:573:5 | a [element 2, element 1] : | +| array_flow.rb:573:20:573:29 | call to source : | array_flow.rb:573:5:573:5 | a [element 2, element 1] : | +| array_flow.rb:574:5:574:5 | b [element] : | array_flow.rb:575:10:575:10 | b [element] : | +| array_flow.rb:574:5:574:5 | b [element] : | array_flow.rb:575:10:575:10 | b [element] : | | array_flow.rb:574:9:574:9 | a [element 2, element 1] : | array_flow.rb:574:9:574:17 | call to flatten [element] : | | array_flow.rb:574:9:574:9 | a [element 2, element 1] : | array_flow.rb:574:9:574:17 | call to flatten [element] : | -| array_flow.rb:574:9:574:17 | call to flatten [element] : | array_flow.rb:575:10:575:10 | b [element] : | -| array_flow.rb:574:9:574:17 | call to flatten [element] : | array_flow.rb:575:10:575:10 | b [element] : | +| array_flow.rb:574:9:574:17 | call to flatten [element] : | array_flow.rb:574:5:574:5 | b [element] : | +| array_flow.rb:574:9:574:17 | call to flatten [element] : | array_flow.rb:574:5:574:5 | b [element] : | | array_flow.rb:575:10:575:10 | b [element] : | array_flow.rb:575:10:575:13 | ...[...] | | array_flow.rb:575:10:575:10 | b [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 [element 2, element 1] : | -| array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:580:10:580:10 | a [element 2, element 1] : | -| array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:581:9:581:9 | a [element 2, element 1] : | -| array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:581:9:581:9 | a [element 2, element 1] : | +| array_flow.rb:579:5:579:5 | a [element 2, element 1] : | array_flow.rb:580:10:580:10 | a [element 2, element 1] : | +| array_flow.rb:579:5:579:5 | a [element 2, element 1] : | array_flow.rb:580:10:580:10 | a [element 2, element 1] : | +| array_flow.rb:579:5:579:5 | a [element 2, element 1] : | array_flow.rb:581:9:581:9 | a [element 2, element 1] : | +| array_flow.rb:579:5:579:5 | a [element 2, element 1] : | array_flow.rb:581:9:581:9 | a [element 2, element 1] : | +| array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:579:5:579:5 | a [element 2, element 1] : | +| array_flow.rb:579:20:579:29 | call to source : | array_flow.rb:579:5:579:5 | a [element 2, element 1] : | | array_flow.rb:580:10:580:10 | a [element 2, element 1] : | array_flow.rb:580:10:580:13 | ...[...] [element 1] : | | array_flow.rb:580:10:580:10 | a [element 2, element 1] : | array_flow.rb:580:10:580:13 | ...[...] [element 1] : | | array_flow.rb:580:10:580:13 | ...[...] [element 1] : | array_flow.rb:580:10:580:16 | ...[...] | | array_flow.rb:580:10:580:13 | ...[...] [element 1] : | array_flow.rb:580:10:580:16 | ...[...] | +| array_flow.rb:581:5:581:5 | b [element, element 1] : | array_flow.rb:585:10:585:10 | b [element, element 1] : | +| array_flow.rb:581:5:581:5 | b [element, element 1] : | array_flow.rb:585:10:585:10 | b [element, element 1] : | +| array_flow.rb:581:5:581:5 | b [element] : | array_flow.rb:584:10:584:10 | b [element] : | +| array_flow.rb:581:5:581:5 | b [element] : | array_flow.rb:584:10:584:10 | b [element] : | +| array_flow.rb:581:5:581:5 | b [element] : | array_flow.rb:585:10:585:10 | b [element] : | | array_flow.rb:581:9:581:9 | [post] a [element, element 1] : | array_flow.rb:583:10:583:10 | a [element, element 1] : | | array_flow.rb:581:9:581:9 | [post] a [element, element 1] : | array_flow.rb:583:10:583:10 | a [element, element 1] : | | array_flow.rb:581:9:581:9 | [post] a [element] : | array_flow.rb:582:10:582:10 | a [element] : | @@ -1053,11 +1343,10 @@ edges | array_flow.rb:581:9:581:9 | a [element 2, element 1] : | array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] : | | array_flow.rb:581:9:581:9 | a [element 2, element 1] : | array_flow.rb:581:9:581:18 | call to flatten! [element] : | | array_flow.rb:581:9:581:9 | a [element 2, element 1] : | array_flow.rb:581:9:581:18 | call to flatten! [element] : | -| array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] : | array_flow.rb:585:10:585:10 | b [element, element 1] : | -| array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] : | array_flow.rb:585:10:585:10 | b [element, element 1] : | -| array_flow.rb:581:9:581:18 | call to flatten! [element] : | array_flow.rb:584:10:584:10 | b [element] : | -| array_flow.rb:581:9:581:18 | call to flatten! [element] : | array_flow.rb:584:10:584:10 | b [element] : | -| array_flow.rb:581:9:581:18 | call to flatten! [element] : | array_flow.rb:585:10:585:10 | b [element] : | +| array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] : | array_flow.rb:581:5:581:5 | b [element, element 1] : | +| array_flow.rb:581:9:581:18 | call to flatten! [element, element 1] : | array_flow.rb:581:5:581:5 | b [element, element 1] : | +| array_flow.rb:581:9:581:18 | call to flatten! [element] : | array_flow.rb:581:5:581:5 | b [element] : | +| array_flow.rb:581:9:581:18 | call to flatten! [element] : | array_flow.rb:581:5:581:5 | b [element] : | | array_flow.rb:582:10:582:10 | a [element] : | array_flow.rb:582:10:582:13 | ...[...] | | array_flow.rb:582:10:582:10 | a [element] : | array_flow.rb:582:10:582:13 | ...[...] | | array_flow.rb:583:10:583:10 | a [element, element 1] : | array_flow.rb:583:10:583:13 | ...[...] [element 1] : | @@ -1074,90 +1363,122 @@ edges | array_flow.rb:585:10:585:13 | ...[...] : | array_flow.rb:585:10:585:16 | ...[...] | | array_flow.rb:585:10:585:13 | ...[...] [element 1] : | array_flow.rb:585:10:585:16 | ...[...] | | array_flow.rb:585:10:585:13 | ...[...] [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 [element 3] : | -| array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:590:9:590:9 | a [element 3] : | -| array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:592:9:592:9 | a [element 3] : | -| array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:592:9:592:9 | a [element 3] : | +| array_flow.rb:589:5:589:5 | a [element 3] : | array_flow.rb:590:9:590:9 | a [element 3] : | +| array_flow.rb:589:5:589:5 | a [element 3] : | array_flow.rb:590:9:590:9 | a [element 3] : | +| array_flow.rb:589:5:589:5 | a [element 3] : | array_flow.rb:592:9:592:9 | a [element 3] : | +| array_flow.rb:589:5:589:5 | a [element 3] : | array_flow.rb:592:9:592:9 | a [element 3] : | +| array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:589:5:589:5 | a [element 3] : | +| array_flow.rb:589:19:589:30 | call to source : | array_flow.rb:589:5:589:5 | a [element 3] : | +| array_flow.rb:590:5:590:5 | b [element] : | array_flow.rb:591:10:591:10 | b [element] : | +| array_flow.rb:590:5:590:5 | b [element] : | array_flow.rb:591:10:591:10 | b [element] : | | array_flow.rb:590:9:590:9 | a [element 3] : | array_flow.rb:590:9:590:20 | call to grep [element] : | | array_flow.rb:590:9:590:9 | a [element 3] : | array_flow.rb:590:9:590:20 | call to grep [element] : | -| array_flow.rb:590:9:590:20 | call to grep [element] : | array_flow.rb:591:10:591:10 | b [element] : | -| array_flow.rb:590:9:590:20 | call to grep [element] : | array_flow.rb:591:10:591:10 | b [element] : | +| array_flow.rb:590:9:590:20 | call to grep [element] : | array_flow.rb:590:5:590:5 | b [element] : | +| array_flow.rb:590:9:590:20 | call to grep [element] : | array_flow.rb:590:5:590:5 | b [element] : | | array_flow.rb:591:10:591:10 | b [element] : | array_flow.rb:591:10:591:13 | ...[...] | | array_flow.rb:591:10:591:10 | b [element] : | array_flow.rb:591:10:591:13 | ...[...] | +| array_flow.rb:592:5:592:5 | b [element] : | array_flow.rb:596:10:596:10 | b [element] : | +| array_flow.rb:592:5:592:5 | b [element] : | array_flow.rb:596:10:596:10 | b [element] : | | array_flow.rb:592:9:592:9 | a [element 3] : | array_flow.rb:592:26:592:26 | x : | | array_flow.rb:592:9:592:9 | a [element 3] : | array_flow.rb:592:26:592:26 | x : | -| array_flow.rb:592:9:595:7 | call to grep [element] : | array_flow.rb:596:10:596:10 | b [element] : | -| array_flow.rb:592:9:595:7 | call to grep [element] : | array_flow.rb:596:10:596:10 | b [element] : | +| array_flow.rb:592:9:595:7 | call to grep [element] : | array_flow.rb:592:5:592:5 | b [element] : | +| array_flow.rb:592:9:595:7 | call to grep [element] : | array_flow.rb:592:5:592:5 | b [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 [element] : | | array_flow.rb:594:9:594:20 | call to source : | array_flow.rb:592:9:595:7 | call to grep [element] : | | array_flow.rb:596:10:596:10 | b [element] : | array_flow.rb:596:10:596:13 | ...[...] | | array_flow.rb:596:10:596:10 | b [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 [element 3] : | -| array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:601:9:601:9 | a [element 3] : | -| array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:603:9:603:9 | a [element 3] : | -| array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:603:9:603:9 | a [element 3] : | +| array_flow.rb:600:5:600:5 | a [element 3] : | array_flow.rb:601:9:601:9 | a [element 3] : | +| array_flow.rb:600:5:600:5 | a [element 3] : | array_flow.rb:601:9:601:9 | a [element 3] : | +| array_flow.rb:600:5:600:5 | a [element 3] : | array_flow.rb:603:9:603:9 | a [element 3] : | +| array_flow.rb:600:5:600:5 | a [element 3] : | array_flow.rb:603:9:603:9 | a [element 3] : | +| array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:600:5:600:5 | a [element 3] : | +| array_flow.rb:600:19:600:30 | call to source : | array_flow.rb:600:5:600:5 | a [element 3] : | +| array_flow.rb:601:5:601:5 | b [element] : | array_flow.rb:602:10:602:10 | b [element] : | +| array_flow.rb:601:5:601:5 | b [element] : | array_flow.rb:602:10:602:10 | b [element] : | | array_flow.rb:601:9:601:9 | a [element 3] : | array_flow.rb:601:9:601:21 | call to grep_v [element] : | | array_flow.rb:601:9:601:9 | a [element 3] : | array_flow.rb:601:9:601:21 | call to grep_v [element] : | -| array_flow.rb:601:9:601:21 | call to grep_v [element] : | array_flow.rb:602:10:602:10 | b [element] : | -| array_flow.rb:601:9:601:21 | call to grep_v [element] : | array_flow.rb:602:10:602:10 | b [element] : | +| array_flow.rb:601:9:601:21 | call to grep_v [element] : | array_flow.rb:601:5:601:5 | b [element] : | +| array_flow.rb:601:9:601:21 | call to grep_v [element] : | array_flow.rb:601:5:601:5 | b [element] : | | array_flow.rb:602:10:602:10 | b [element] : | array_flow.rb:602:10:602:13 | ...[...] | | array_flow.rb:602:10:602:10 | b [element] : | array_flow.rb:602:10:602:13 | ...[...] | +| array_flow.rb:603:5:603:5 | b [element] : | array_flow.rb:607:10:607:10 | b [element] : | +| array_flow.rb:603:5:603:5 | b [element] : | array_flow.rb:607:10:607:10 | b [element] : | | array_flow.rb:603:9:603:9 | a [element 3] : | array_flow.rb:603:27:603:27 | x : | | array_flow.rb:603:9:603:9 | a [element 3] : | array_flow.rb:603:27:603:27 | x : | -| array_flow.rb:603:9:606:7 | call to grep_v [element] : | array_flow.rb:607:10:607:10 | b [element] : | -| array_flow.rb:603:9:606:7 | call to grep_v [element] : | array_flow.rb:607:10:607:10 | b [element] : | +| array_flow.rb:603:9:606:7 | call to grep_v [element] : | array_flow.rb:603:5:603:5 | b [element] : | +| array_flow.rb:603:9:606:7 | call to grep_v [element] : | array_flow.rb:603:5:603:5 | b [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 [element] : | | array_flow.rb:605:9:605:20 | call to source : | array_flow.rb:603:9:606:7 | call to grep_v [element] : | | array_flow.rb:607:10:607:10 | b [element] : | array_flow.rb:607:10:607:13 | ...[...] | | array_flow.rb:607:10:607:10 | b [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 [element 3] : | -| array_flow.rb:611:19:611:30 | call to source : | array_flow.rb:612:9:612:9 | a [element 3] : | +| array_flow.rb:611:5:611:5 | a [element 3] : | array_flow.rb:612:9:612:9 | a [element 3] : | +| array_flow.rb:611:5:611:5 | a [element 3] : | array_flow.rb:612:9:612:9 | a [element 3] : | +| array_flow.rb:611:19:611:30 | call to source : | array_flow.rb:611:5:611:5 | a [element 3] : | +| array_flow.rb:611:19:611:30 | call to source : | array_flow.rb:611:5:611:5 | a [element 3] : | | array_flow.rb:612:9:612:9 | a [element 3] : | array_flow.rb:612:24:612:24 | x : | | array_flow.rb:612:9:612:9 | a [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 [element 3] : | -| array_flow.rb:620:19:620:28 | call to source : | array_flow.rb:621:5:621:5 | a [element 3] : | +| array_flow.rb:620:5:620:5 | a [element 3] : | array_flow.rb:621:5:621:5 | a [element 3] : | +| array_flow.rb:620:5:620:5 | a [element 3] : | array_flow.rb:621:5:621:5 | a [element 3] : | +| array_flow.rb:620:19:620:28 | call to source : | array_flow.rb:620:5:620:5 | a [element 3] : | +| array_flow.rb:620:19:620:28 | call to source : | array_flow.rb:620:5:620:5 | a [element 3] : | | array_flow.rb:621:5:621:5 | a [element 3] : | array_flow.rb:621:17:621:17 | x : | | array_flow.rb:621:5:621:5 | a [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 [element 0] : | -| array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:628:9:628:9 | a [element 0] : | -| array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:634:9:634:9 | a [element 0] : | -| array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:634:9:634:9 | a [element 0] : | -| array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:628:9:628:9 | a [element 2] : | -| array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:628:9:628:9 | a [element 2] : | -| array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:634:9:634:9 | a [element 2] : | -| array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:634:9:634:9 | a [element 2] : | +| array_flow.rb:627:5:627:5 | a [element 0] : | array_flow.rb:628:9:628:9 | a [element 0] : | +| array_flow.rb:627:5:627:5 | a [element 0] : | array_flow.rb:628:9:628:9 | a [element 0] : | +| array_flow.rb:627:5:627:5 | a [element 0] : | array_flow.rb:634:9:634:9 | a [element 0] : | +| array_flow.rb:627:5:627:5 | a [element 0] : | array_flow.rb:634:9:634:9 | a [element 0] : | +| array_flow.rb:627:5:627:5 | a [element 2] : | array_flow.rb:628:9:628:9 | a [element 2] : | +| array_flow.rb:627:5:627:5 | a [element 2] : | array_flow.rb:628:9:628:9 | a [element 2] : | +| array_flow.rb:627:5:627:5 | a [element 2] : | array_flow.rb:634:9:634:9 | a [element 2] : | +| array_flow.rb:627:5:627:5 | a [element 2] : | array_flow.rb:634:9:634:9 | a [element 2] : | +| array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:627:5:627:5 | a [element 0] : | +| array_flow.rb:627:10:627:21 | call to source : | array_flow.rb:627:5:627:5 | a [element 0] : | +| array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:627:5:627:5 | a [element 2] : | +| array_flow.rb:627:27:627:38 | call to source : | array_flow.rb:627:5:627:5 | a [element 2] : | +| array_flow.rb:628:5:628:5 | b : | array_flow.rb:633:10:633:10 | b | +| array_flow.rb:628:5:628:5 | b : | array_flow.rb:633:10:633:10 | b | | array_flow.rb:628:9:628:9 | a [element 0] : | array_flow.rb:628:22:628:22 | x : | | array_flow.rb:628:9:628:9 | a [element 0] : | array_flow.rb:628:22:628:22 | x : | | array_flow.rb:628:9:628:9 | a [element 2] : | array_flow.rb:628:25:628:25 | y : | | array_flow.rb:628:9:628:9 | a [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:9:632:7 | call to inject : | array_flow.rb:628:5:628:5 | b : | +| array_flow.rb:628:9:632:7 | call to inject : | array_flow.rb:628:5:628:5 | 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:5:634:5 | c : | array_flow.rb:639:10:639:10 | c | +| array_flow.rb:634:5:634:5 | c : | array_flow.rb:639:10:639:10 | c | | array_flow.rb:634:9:634:9 | a [element 0] : | array_flow.rb:634:28:634:28 | y : | | array_flow.rb:634:9:634:9 | a [element 0] : | array_flow.rb:634:28:634:28 | y : | | array_flow.rb:634:9:634:9 | a [element 2] : | array_flow.rb:634:28:634:28 | y : | | array_flow.rb:634:9:634:9 | a [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:9:638:7 | call to inject : | array_flow.rb:634:5:634:5 | c : | +| array_flow.rb:634:9:638:7 | call to inject : | array_flow.rb:634:5:634:5 | 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 [element 2] : | -| array_flow.rb:644:16:644:27 | call to source : | array_flow.rb:645:9:645:9 | a [element 2] : | +| array_flow.rb:644:5:644:5 | a [element 2] : | array_flow.rb:645:9:645:9 | a [element 2] : | +| array_flow.rb:644:5:644:5 | a [element 2] : | array_flow.rb:645:9:645:9 | a [element 2] : | +| array_flow.rb:644:16:644:27 | call to source : | array_flow.rb:644:5:644:5 | a [element 2] : | +| array_flow.rb:644:16:644:27 | call to source : | array_flow.rb:644:5:644:5 | a [element 2] : | +| array_flow.rb:645:5:645:5 | b [element 1] : | array_flow.rb:652:10:652:10 | b [element 1] : | +| array_flow.rb:645:5:645:5 | b [element 1] : | array_flow.rb:652:10:652:10 | b [element 1] : | +| array_flow.rb:645:5:645:5 | b [element 2] : | array_flow.rb:653:10:653:10 | b [element 2] : | +| array_flow.rb:645:5:645:5 | b [element 2] : | array_flow.rb:653:10:653:10 | b [element 2] : | +| array_flow.rb:645:5:645:5 | b [element 4] : | array_flow.rb:655:10:655:10 | b [element 4] : | +| array_flow.rb:645:5:645:5 | b [element 4] : | array_flow.rb:655:10:655:10 | b [element 4] : | | array_flow.rb:645:9:645:9 | [post] a [element 1] : | array_flow.rb:647:10:647:10 | a [element 1] : | | array_flow.rb:645:9:645:9 | [post] a [element 1] : | array_flow.rb:647:10:647:10 | a [element 1] : | | array_flow.rb:645:9:645:9 | [post] a [element 2] : | array_flow.rb:648:10:648:10 | a [element 2] : | @@ -1168,12 +1489,12 @@ edges | array_flow.rb:645:9:645:9 | a [element 2] : | array_flow.rb:645:9:645:9 | [post] a [element 4] : | | array_flow.rb:645:9:645:9 | a [element 2] : | array_flow.rb:645:9:645:47 | call to insert [element 4] : | | array_flow.rb:645:9:645:9 | a [element 2] : | array_flow.rb:645:9:645:47 | call to insert [element 4] : | -| array_flow.rb:645:9:645:47 | call to insert [element 1] : | array_flow.rb:652:10:652:10 | b [element 1] : | -| array_flow.rb:645:9:645:47 | call to insert [element 1] : | array_flow.rb:652:10:652:10 | b [element 1] : | -| array_flow.rb:645:9:645:47 | call to insert [element 2] : | array_flow.rb:653:10:653:10 | b [element 2] : | -| array_flow.rb:645:9:645:47 | call to insert [element 2] : | array_flow.rb:653:10:653:10 | b [element 2] : | -| array_flow.rb:645:9:645:47 | call to insert [element 4] : | array_flow.rb:655:10:655:10 | b [element 4] : | -| array_flow.rb:645:9:645:47 | call to insert [element 4] : | array_flow.rb:655:10:655:10 | b [element 4] : | +| array_flow.rb:645:9:645:47 | call to insert [element 1] : | array_flow.rb:645:5:645:5 | b [element 1] : | +| array_flow.rb:645:9:645:47 | call to insert [element 1] : | array_flow.rb:645:5:645:5 | b [element 1] : | +| array_flow.rb:645:9:645:47 | call to insert [element 2] : | array_flow.rb:645:5:645:5 | b [element 2] : | +| array_flow.rb:645:9:645:47 | call to insert [element 2] : | array_flow.rb:645:5:645:5 | b [element 2] : | +| array_flow.rb:645:9:645:47 | call to insert [element 4] : | array_flow.rb:645:5:645:5 | b [element 4] : | +| array_flow.rb:645:9:645:47 | call to insert [element 4] : | array_flow.rb:645:5:645:5 | b [element 4] : | | array_flow.rb:645:21:645:32 | call to source : | array_flow.rb:645:9:645:9 | [post] a [element 1] : | | array_flow.rb:645:21:645:32 | call to source : | array_flow.rb:645:9:645:9 | [post] a [element 1] : | | array_flow.rb:645:21:645:32 | call to source : | array_flow.rb:645:9:645:47 | call to insert [element 1] : | @@ -1194,16 +1515,20 @@ edges | array_flow.rb:653:10:653:10 | b [element 2] : | array_flow.rb:653:10:653:13 | ...[...] | | array_flow.rb:655:10:655:10 | b [element 4] : | array_flow.rb:655:10:655:13 | ...[...] | | array_flow.rb:655:10:655:10 | b [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 [element 2] : | -| array_flow.rb:658:16:658:27 | call to source : | array_flow.rb:659:9:659:9 | c [element 2] : | +| array_flow.rb:658:5:658:5 | c [element 2] : | array_flow.rb:659:9:659:9 | c [element 2] : | +| array_flow.rb:658:5:658:5 | c [element 2] : | array_flow.rb:659:9:659:9 | c [element 2] : | +| array_flow.rb:658:16:658:27 | call to source : | array_flow.rb:658:5:658:5 | c [element 2] : | +| array_flow.rb:658:16:658:27 | call to source : | array_flow.rb:658:5:658:5 | c [element 2] : | +| array_flow.rb:659:5:659:5 | d [element] : | array_flow.rb:661:10:661:10 | d [element] : | +| array_flow.rb:659:5:659:5 | d [element] : | array_flow.rb:661:10:661:10 | d [element] : | | array_flow.rb:659:9:659:9 | [post] c [element] : | array_flow.rb:660:10:660:10 | c [element] : | | array_flow.rb:659:9:659:9 | [post] c [element] : | array_flow.rb:660:10:660:10 | c [element] : | | array_flow.rb:659:9:659:9 | c [element 2] : | array_flow.rb:659:9:659:9 | [post] c [element] : | | array_flow.rb:659:9:659:9 | c [element 2] : | array_flow.rb:659:9:659:9 | [post] c [element] : | | array_flow.rb:659:9:659:9 | c [element 2] : | array_flow.rb:659:9:659:47 | call to insert [element] : | | array_flow.rb:659:9:659:9 | c [element 2] : | array_flow.rb:659:9:659:47 | call to insert [element] : | -| array_flow.rb:659:9:659:47 | call to insert [element] : | array_flow.rb:661:10:661:10 | d [element] : | -| array_flow.rb:659:9:659:47 | call to insert [element] : | array_flow.rb:661:10:661:10 | d [element] : | +| array_flow.rb:659:9:659:47 | call to insert [element] : | array_flow.rb:659:5:659:5 | d [element] : | +| array_flow.rb:659:9:659:47 | call to insert [element] : | array_flow.rb:659:5:659:5 | d [element] : | | array_flow.rb:659:21:659:32 | call to source : | array_flow.rb:659:9:659:9 | [post] c [element] : | | array_flow.rb:659:21:659:32 | call to source : | array_flow.rb:659:9:659:9 | [post] c [element] : | | array_flow.rb:659:21:659:32 | call to source : | array_flow.rb:659:9:659:47 | call to insert [element] : | @@ -1216,20 +1541,28 @@ edges | array_flow.rb:660:10:660:10 | c [element] : | array_flow.rb:660:10:660:13 | ...[...] | | array_flow.rb:661:10:661:10 | d [element] : | array_flow.rb:661:10:661:13 | ...[...] | | array_flow.rb:661:10:661:10 | d [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 [element 2] : | -| array_flow.rb:672:16:672:27 | call to source : | array_flow.rb:673:9:673:9 | a [element 2] : | +| array_flow.rb:672:5:672:5 | a [element 2] : | array_flow.rb:673:9:673:9 | a [element 2] : | +| array_flow.rb:672:5:672:5 | a [element 2] : | array_flow.rb:673:9:673:9 | a [element 2] : | +| array_flow.rb:672:16:672:27 | call to source : | array_flow.rb:672:5:672:5 | a [element 2] : | +| array_flow.rb:672:16:672:27 | call to source : | array_flow.rb:672:5:672:5 | a [element 2] : | +| array_flow.rb:673:5:673:5 | b [element] : | array_flow.rb:674:10:674:10 | b [element] : | +| array_flow.rb:673:5:673:5 | b [element] : | array_flow.rb:674:10:674:10 | b [element] : | | array_flow.rb:673:9:673:9 | a [element 2] : | array_flow.rb:673:9:673:60 | call to intersection [element] : | | array_flow.rb:673:9:673:9 | a [element 2] : | array_flow.rb:673:9:673:60 | call to intersection [element] : | -| array_flow.rb:673:9:673:60 | call to intersection [element] : | array_flow.rb:674:10:674:10 | b [element] : | -| array_flow.rb:673:9:673:60 | call to intersection [element] : | array_flow.rb:674:10:674:10 | b [element] : | +| array_flow.rb:673:9:673:60 | call to intersection [element] : | array_flow.rb:673:5:673:5 | b [element] : | +| array_flow.rb:673:9:673:60 | call to intersection [element] : | array_flow.rb:673:5:673:5 | b [element] : | | array_flow.rb:673:31:673:42 | call to source : | array_flow.rb:673:9:673:60 | call to intersection [element] : | | array_flow.rb:673:31:673:42 | call to source : | array_flow.rb:673:9:673:60 | call to intersection [element] : | | array_flow.rb:673:47:673:58 | call to source : | array_flow.rb:673:9:673:60 | call to intersection [element] : | | array_flow.rb:673:47:673:58 | call to source : | array_flow.rb:673:9:673:60 | call to intersection [element] : | | array_flow.rb:674:10:674:10 | b [element] : | array_flow.rb:674:10:674:13 | ...[...] | | array_flow.rb:674:10:674:10 | b [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 [element 2] : | -| array_flow.rb:678:16:678:25 | call to source : | array_flow.rb:679:9:679:9 | a [element 2] : | +| array_flow.rb:678:5:678:5 | a [element 2] : | array_flow.rb:679:9:679:9 | a [element 2] : | +| array_flow.rb:678:5:678:5 | a [element 2] : | array_flow.rb:679:9:679:9 | a [element 2] : | +| array_flow.rb:678:16:678:25 | call to source : | array_flow.rb:678:5:678:5 | a [element 2] : | +| array_flow.rb:678:16:678:25 | call to source : | array_flow.rb:678:5:678:5 | a [element 2] : | +| array_flow.rb:679:5:679:5 | b [element] : | array_flow.rb:684:10:684:10 | b [element] : | +| array_flow.rb:679:5:679:5 | b [element] : | array_flow.rb:684:10:684:10 | b [element] : | | array_flow.rb:679:9:679:9 | [post] a [element] : | array_flow.rb:683:10:683:10 | a [element] : | | array_flow.rb:679:9:679:9 | [post] a [element] : | array_flow.rb:683:10:683:10 | a [element] : | | array_flow.rb:679:9:679:9 | a [element 2] : | array_flow.rb:679:9:679:9 | [post] a [element] : | @@ -1238,18 +1571,20 @@ edges | array_flow.rb:679:9:679:9 | a [element 2] : | array_flow.rb:679:9:682:7 | call to keep_if [element] : | | array_flow.rb:679:9:679:9 | a [element 2] : | array_flow.rb:679:23:679:23 | x : | | array_flow.rb:679:9:679:9 | a [element 2] : | array_flow.rb:679:23:679:23 | x : | -| array_flow.rb:679:9:682:7 | call to keep_if [element] : | array_flow.rb:684:10:684:10 | b [element] : | -| array_flow.rb:679:9:682:7 | call to keep_if [element] : | array_flow.rb:684:10:684:10 | b [element] : | +| array_flow.rb:679:9:682:7 | call to keep_if [element] : | array_flow.rb:679:5:679:5 | b [element] : | +| array_flow.rb:679:9:682:7 | call to keep_if [element] : | array_flow.rb:679:5:679:5 | b [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 [element] : | array_flow.rb:683:10:683:13 | ...[...] | | array_flow.rb:683:10:683:10 | a [element] : | array_flow.rb:683:10:683:13 | ...[...] | | array_flow.rb:684:10:684:10 | b [element] : | array_flow.rb:684:10:684:13 | ...[...] | | array_flow.rb:684:10:684:10 | b [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 [element 2] : | -| array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:690:10:690:10 | a [element 2] : | -| array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:691:9:691:9 | a [element 2] : | -| array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:691:9:691:9 | a [element 2] : | +| array_flow.rb:688:5:688:5 | a [element 2] : | array_flow.rb:690:10:690:10 | a [element 2] : | +| array_flow.rb:688:5:688:5 | a [element 2] : | array_flow.rb:690:10:690:10 | a [element 2] : | +| array_flow.rb:688:5:688:5 | a [element 2] : | array_flow.rb:691:9:691:9 | a [element 2] : | +| array_flow.rb:688:5:688:5 | a [element 2] : | array_flow.rb:691:9:691:9 | a [element 2] : | +| array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:688:5:688:5 | a [element 2] : | +| array_flow.rb:688:16:688:27 | call to source : | array_flow.rb:688:5:688:5 | a [element 2] : | | array_flow.rb:689:5:689:5 | [post] a [element] : | array_flow.rb:690:10:690:10 | a [element] : | | array_flow.rb:689:5:689:5 | [post] a [element] : | array_flow.rb:690:10:690:10 | a [element] : | | array_flow.rb:689:5:689:5 | [post] a [element] : | array_flow.rb:691:9:691:9 | a [element] : | @@ -1260,198 +1595,246 @@ edges | array_flow.rb:690:10:690:10 | a [element 2] : | array_flow.rb:690:10:690:15 | call to last | | array_flow.rb:690:10:690:10 | a [element] : | array_flow.rb:690:10:690:15 | call to last | | array_flow.rb:690:10:690:10 | a [element] : | array_flow.rb:690:10:690:15 | call to last | +| array_flow.rb:691:5:691:5 | b [element] : | array_flow.rb:692:10:692:10 | b [element] : | +| array_flow.rb:691:5:691:5 | b [element] : | array_flow.rb:692:10:692:10 | b [element] : | +| array_flow.rb:691:5:691:5 | b [element] : | array_flow.rb:693:10:693:10 | b [element] : | +| array_flow.rb:691:5:691:5 | b [element] : | array_flow.rb:693:10:693:10 | b [element] : | | array_flow.rb:691:9:691:9 | a [element 2] : | array_flow.rb:691:9:691:17 | call to last [element] : | | array_flow.rb:691:9:691:9 | a [element 2] : | array_flow.rb:691:9:691:17 | call to last [element] : | | array_flow.rb:691:9:691:9 | a [element] : | array_flow.rb:691:9:691:17 | call to last [element] : | | array_flow.rb:691:9:691:9 | a [element] : | array_flow.rb:691:9:691:17 | call to last [element] : | -| array_flow.rb:691:9:691:17 | call to last [element] : | array_flow.rb:692:10:692:10 | b [element] : | -| array_flow.rb:691:9:691:17 | call to last [element] : | array_flow.rb:692:10:692:10 | b [element] : | -| array_flow.rb:691:9:691:17 | call to last [element] : | array_flow.rb:693:10:693:10 | b [element] : | -| array_flow.rb:691:9:691:17 | call to last [element] : | array_flow.rb:693:10:693:10 | b [element] : | +| array_flow.rb:691:9:691:17 | call to last [element] : | array_flow.rb:691:5:691:5 | b [element] : | +| array_flow.rb:691:9:691:17 | call to last [element] : | array_flow.rb:691:5:691:5 | b [element] : | | array_flow.rb:692:10:692:10 | b [element] : | array_flow.rb:692:10:692:13 | ...[...] | | array_flow.rb:692:10:692:10 | b [element] : | array_flow.rb:692:10:692:13 | ...[...] | | array_flow.rb:693:10:693:10 | b [element] : | array_flow.rb:693:10:693:13 | ...[...] | | array_flow.rb:693:10:693:10 | b [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 [element 2] : | -| array_flow.rb:697:16:697:27 | call to source : | array_flow.rb:698:9:698:9 | a [element 2] : | +| array_flow.rb:697:5:697:5 | a [element 2] : | array_flow.rb:698:9:698:9 | a [element 2] : | +| array_flow.rb:697:5:697:5 | a [element 2] : | array_flow.rb:698:9:698:9 | a [element 2] : | +| array_flow.rb:697:16:697:27 | call to source : | array_flow.rb:697:5:697:5 | a [element 2] : | +| array_flow.rb:697:16:697:27 | call to source : | array_flow.rb:697:5:697:5 | a [element 2] : | +| array_flow.rb:698:5:698:5 | b [element] : | array_flow.rb:702:10:702:10 | b [element] : | +| array_flow.rb:698:5:698:5 | b [element] : | array_flow.rb:702:10:702:10 | b [element] : | | array_flow.rb:698:9:698:9 | a [element 2] : | array_flow.rb:698:19:698:19 | x : | | array_flow.rb:698:9:698:9 | a [element 2] : | array_flow.rb:698:19:698:19 | x : | -| array_flow.rb:698:9:701:7 | call to map [element] : | array_flow.rb:702:10:702:10 | b [element] : | -| array_flow.rb:698:9:701:7 | call to map [element] : | array_flow.rb:702:10:702:10 | b [element] : | +| array_flow.rb:698:9:701:7 | call to map [element] : | array_flow.rb:698:5:698:5 | b [element] : | +| array_flow.rb:698:9:701:7 | call to map [element] : | array_flow.rb:698:5:698:5 | b [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 [element] : | | array_flow.rb:700:9:700:19 | call to source : | array_flow.rb:698:9:701:7 | call to map [element] : | | array_flow.rb:702:10:702:10 | b [element] : | array_flow.rb:702:10:702:13 | ...[...] | | array_flow.rb:702:10:702:10 | b [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 [element 2] : | -| array_flow.rb:706:16:706:27 | call to source : | array_flow.rb:707:9:707:9 | a [element 2] : | +| array_flow.rb:706:5:706:5 | a [element 2] : | array_flow.rb:707:9:707:9 | a [element 2] : | +| array_flow.rb:706:5:706:5 | a [element 2] : | array_flow.rb:707:9:707:9 | a [element 2] : | +| array_flow.rb:706:16:706:27 | call to source : | array_flow.rb:706:5:706:5 | a [element 2] : | +| array_flow.rb:706:16:706:27 | call to source : | array_flow.rb:706:5:706:5 | a [element 2] : | +| array_flow.rb:707:5:707:5 | b [element] : | array_flow.rb:711:10:711:10 | b [element] : | +| array_flow.rb:707:5:707:5 | b [element] : | array_flow.rb:711:10:711:10 | b [element] : | | array_flow.rb:707:9:707:9 | a [element 2] : | array_flow.rb:707:20:707:20 | x : | | array_flow.rb:707:9:707:9 | a [element 2] : | array_flow.rb:707:20:707:20 | x : | -| array_flow.rb:707:9:710:7 | call to map! [element] : | array_flow.rb:711:10:711:10 | b [element] : | -| array_flow.rb:707:9:710:7 | call to map! [element] : | array_flow.rb:711:10:711:10 | b [element] : | +| array_flow.rb:707:9:710:7 | call to map! [element] : | array_flow.rb:707:5:707:5 | b [element] : | +| array_flow.rb:707:9:710:7 | call to map! [element] : | array_flow.rb:707:5:707:5 | b [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! [element] : | | array_flow.rb:709:9:709:19 | call to source : | array_flow.rb:707:9:710:7 | call to map! [element] : | | array_flow.rb:711:10:711:10 | b [element] : | array_flow.rb:711:10:711:13 | ...[...] | | array_flow.rb:711:10:711:10 | b [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 [element 2] : | -| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:718:9:718:9 | a [element 2] : | -| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:722:9:722:9 | a [element 2] : | -| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:722:9:722:9 | a [element 2] : | -| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:726:9:726:9 | a [element 2] : | -| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:726:9:726:9 | a [element 2] : | -| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:734:9:734:9 | a [element 2] : | -| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:734:9:734:9 | a [element 2] : | +| array_flow.rb:715:5:715:5 | a [element 2] : | array_flow.rb:718:9:718:9 | a [element 2] : | +| array_flow.rb:715:5:715:5 | a [element 2] : | array_flow.rb:718:9:718:9 | a [element 2] : | +| array_flow.rb:715:5:715:5 | a [element 2] : | array_flow.rb:722:9:722:9 | a [element 2] : | +| array_flow.rb:715:5:715:5 | a [element 2] : | array_flow.rb:722:9:722:9 | a [element 2] : | +| array_flow.rb:715:5:715:5 | a [element 2] : | array_flow.rb:726:9:726:9 | a [element 2] : | +| array_flow.rb:715:5:715:5 | a [element 2] : | array_flow.rb:726:9:726:9 | a [element 2] : | +| array_flow.rb:715:5:715:5 | a [element 2] : | array_flow.rb:734:9:734:9 | a [element 2] : | +| array_flow.rb:715:5:715:5 | a [element 2] : | array_flow.rb:734:9:734:9 | a [element 2] : | +| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:715:5:715:5 | a [element 2] : | +| array_flow.rb:715:16:715:25 | call to source : | array_flow.rb:715:5:715:5 | a [element 2] : | +| array_flow.rb:718:5:718:5 | b : | array_flow.rb:719:10:719:10 | b | +| array_flow.rb:718:5:718:5 | b : | array_flow.rb:719:10:719:10 | b | | array_flow.rb:718:9:718:9 | a [element 2] : | array_flow.rb:718:9:718:13 | call to max : | | array_flow.rb:718:9:718:9 | a [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:718:9:718:13 | call to max : | array_flow.rb:718:5:718:5 | b : | +| array_flow.rb:718:9:718:13 | call to max : | array_flow.rb:718:5:718:5 | b : | +| array_flow.rb:722:5:722:5 | c [element] : | array_flow.rb:723:10:723:10 | c [element] : | +| array_flow.rb:722:5:722:5 | c [element] : | array_flow.rb:723:10:723:10 | c [element] : | | array_flow.rb:722:9:722:9 | a [element 2] : | array_flow.rb:722:9:722:16 | call to max [element] : | | array_flow.rb:722:9:722:9 | a [element 2] : | array_flow.rb:722:9:722:16 | call to max [element] : | -| array_flow.rb:722:9:722:16 | call to max [element] : | array_flow.rb:723:10:723:10 | c [element] : | -| array_flow.rb:722:9:722:16 | call to max [element] : | array_flow.rb:723:10:723:10 | c [element] : | +| array_flow.rb:722:9:722:16 | call to max [element] : | array_flow.rb:722:5:722:5 | c [element] : | +| array_flow.rb:722:9:722:16 | call to max [element] : | array_flow.rb:722:5:722:5 | c [element] : | | array_flow.rb:723:10:723:10 | c [element] : | array_flow.rb:723:10:723:13 | ...[...] | | array_flow.rb:723:10:723:10 | c [element] : | array_flow.rb:723:10:723:13 | ...[...] | +| array_flow.rb:726:5:726:5 | d : | array_flow.rb:731:10:731:10 | d | +| array_flow.rb:726:5:726:5 | d : | array_flow.rb:731:10:731:10 | d | | array_flow.rb:726:9:726:9 | a [element 2] : | array_flow.rb:726:9:730:7 | call to max : | | array_flow.rb:726:9:726:9 | a [element 2] : | array_flow.rb:726:9:730:7 | call to max : | | array_flow.rb:726:9:726:9 | a [element 2] : | array_flow.rb:726:19:726:19 | x : | | array_flow.rb:726:9:726:9 | a [element 2] : | array_flow.rb:726:19:726:19 | x : | | array_flow.rb:726:9:726:9 | a [element 2] : | array_flow.rb:726:22:726:22 | y : | | array_flow.rb:726:9:726:9 | a [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:9:730:7 | call to max : | array_flow.rb:726:5:726:5 | d : | +| array_flow.rb:726:9:730:7 | call to max : | array_flow.rb:726:5:726:5 | 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:5:734:5 | e [element] : | array_flow.rb:739:10:739:10 | e [element] : | +| array_flow.rb:734:5:734:5 | e [element] : | array_flow.rb:739:10:739:10 | e [element] : | | array_flow.rb:734:9:734:9 | a [element 2] : | array_flow.rb:734:9:738:7 | call to max [element] : | | array_flow.rb:734:9:734:9 | a [element 2] : | array_flow.rb:734:9:738:7 | call to max [element] : | | array_flow.rb:734:9:734:9 | a [element 2] : | array_flow.rb:734:22:734:22 | x : | | array_flow.rb:734:9:734:9 | a [element 2] : | array_flow.rb:734:22:734:22 | x : | | array_flow.rb:734:9:734:9 | a [element 2] : | array_flow.rb:734:25:734:25 | y : | | array_flow.rb:734:9:734:9 | a [element 2] : | array_flow.rb:734:25:734:25 | y : | -| array_flow.rb:734:9:738:7 | call to max [element] : | array_flow.rb:739:10:739:10 | e [element] : | -| array_flow.rb:734:9:738:7 | call to max [element] : | array_flow.rb:739:10:739:10 | e [element] : | +| array_flow.rb:734:9:738:7 | call to max [element] : | array_flow.rb:734:5:734:5 | e [element] : | +| array_flow.rb:734:9:738:7 | call to max [element] : | array_flow.rb:734:5:734:5 | e [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 [element] : | array_flow.rb:739:10:739:13 | ...[...] | | array_flow.rb:739:10:739:10 | e [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 [element 2] : | -| array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:746:9:746:9 | a [element 2] : | -| array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:753:9:753:9 | a [element 2] : | -| array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:753:9:753:9 | a [element 2] : | +| array_flow.rb:743:5:743:5 | a [element 2] : | array_flow.rb:746:9:746:9 | a [element 2] : | +| array_flow.rb:743:5:743:5 | a [element 2] : | array_flow.rb:746:9:746:9 | a [element 2] : | +| array_flow.rb:743:5:743:5 | a [element 2] : | array_flow.rb:753:9:753:9 | a [element 2] : | +| array_flow.rb:743:5:743:5 | a [element 2] : | array_flow.rb:753:9:753:9 | a [element 2] : | +| array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:743:5:743:5 | a [element 2] : | +| array_flow.rb:743:16:743:25 | call to source : | array_flow.rb:743:5:743:5 | a [element 2] : | +| array_flow.rb:746:5:746:5 | b : | array_flow.rb:750:10:750:10 | b | +| array_flow.rb:746:5:746:5 | b : | array_flow.rb:750:10:750:10 | b | | array_flow.rb:746:9:746:9 | a [element 2] : | array_flow.rb:746:9:749:7 | call to max_by : | | array_flow.rb:746:9:746:9 | a [element 2] : | array_flow.rb:746:9:749:7 | call to max_by : | | array_flow.rb:746:9:746:9 | a [element 2] : | array_flow.rb:746:22:746:22 | x : | | array_flow.rb:746:9:746:9 | a [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:9:749:7 | call to max_by : | array_flow.rb:746:5:746:5 | b : | +| array_flow.rb:746:9:749:7 | call to max_by : | array_flow.rb:746:5:746:5 | 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:5:753:5 | c [element] : | array_flow.rb:757:10:757:10 | c [element] : | +| array_flow.rb:753:5:753:5 | c [element] : | array_flow.rb:757:10:757:10 | c [element] : | | array_flow.rb:753:9:753:9 | a [element 2] : | array_flow.rb:753:9:756:7 | call to max_by [element] : | | array_flow.rb:753:9:753:9 | a [element 2] : | array_flow.rb:753:9:756:7 | call to max_by [element] : | | array_flow.rb:753:9:753:9 | a [element 2] : | array_flow.rb:753:25:753:25 | x : | | array_flow.rb:753:9:753:9 | a [element 2] : | array_flow.rb:753:25:753:25 | x : | -| array_flow.rb:753:9:756:7 | call to max_by [element] : | array_flow.rb:757:10:757:10 | c [element] : | -| array_flow.rb:753:9:756:7 | call to max_by [element] : | array_flow.rb:757:10:757:10 | c [element] : | +| array_flow.rb:753:9:756:7 | call to max_by [element] : | array_flow.rb:753:5:753:5 | c [element] : | +| array_flow.rb:753:9:756:7 | call to max_by [element] : | array_flow.rb:753:5:753:5 | c [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 [element] : | array_flow.rb:757:10:757:13 | ...[...] | | array_flow.rb:757:10:757:10 | c [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 [element 2] : | -| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:764:9:764:9 | a [element 2] : | -| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:768:9:768:9 | a [element 2] : | -| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:768:9:768:9 | a [element 2] : | -| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:772:9:772:9 | a [element 2] : | -| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:772:9:772:9 | a [element 2] : | -| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:780:9:780:9 | a [element 2] : | -| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:780:9:780:9 | a [element 2] : | +| array_flow.rb:761:5:761:5 | a [element 2] : | array_flow.rb:764:9:764:9 | a [element 2] : | +| array_flow.rb:761:5:761:5 | a [element 2] : | array_flow.rb:764:9:764:9 | a [element 2] : | +| array_flow.rb:761:5:761:5 | a [element 2] : | array_flow.rb:768:9:768:9 | a [element 2] : | +| array_flow.rb:761:5:761:5 | a [element 2] : | array_flow.rb:768:9:768:9 | a [element 2] : | +| array_flow.rb:761:5:761:5 | a [element 2] : | array_flow.rb:772:9:772:9 | a [element 2] : | +| array_flow.rb:761:5:761:5 | a [element 2] : | array_flow.rb:772:9:772:9 | a [element 2] : | +| array_flow.rb:761:5:761:5 | a [element 2] : | array_flow.rb:780:9:780:9 | a [element 2] : | +| array_flow.rb:761:5:761:5 | a [element 2] : | array_flow.rb:780:9:780:9 | a [element 2] : | +| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:761:5:761:5 | a [element 2] : | +| array_flow.rb:761:16:761:25 | call to source : | array_flow.rb:761:5:761:5 | a [element 2] : | +| array_flow.rb:764:5:764:5 | b : | array_flow.rb:765:10:765:10 | b | +| array_flow.rb:764:5:764:5 | b : | array_flow.rb:765:10:765:10 | b | | array_flow.rb:764:9:764:9 | a [element 2] : | array_flow.rb:764:9:764:13 | call to min : | | array_flow.rb:764:9:764:9 | a [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:764:9:764:13 | call to min : | array_flow.rb:764:5:764:5 | b : | +| array_flow.rb:764:9:764:13 | call to min : | array_flow.rb:764:5:764:5 | b : | +| array_flow.rb:768:5:768:5 | c [element] : | array_flow.rb:769:10:769:10 | c [element] : | +| array_flow.rb:768:5:768:5 | c [element] : | array_flow.rb:769:10:769:10 | c [element] : | | array_flow.rb:768:9:768:9 | a [element 2] : | array_flow.rb:768:9:768:16 | call to min [element] : | | array_flow.rb:768:9:768:9 | a [element 2] : | array_flow.rb:768:9:768:16 | call to min [element] : | -| array_flow.rb:768:9:768:16 | call to min [element] : | array_flow.rb:769:10:769:10 | c [element] : | -| array_flow.rb:768:9:768:16 | call to min [element] : | array_flow.rb:769:10:769:10 | c [element] : | +| array_flow.rb:768:9:768:16 | call to min [element] : | array_flow.rb:768:5:768:5 | c [element] : | +| array_flow.rb:768:9:768:16 | call to min [element] : | array_flow.rb:768:5:768:5 | c [element] : | | array_flow.rb:769:10:769:10 | c [element] : | array_flow.rb:769:10:769:13 | ...[...] | | array_flow.rb:769:10:769:10 | c [element] : | array_flow.rb:769:10:769:13 | ...[...] | +| array_flow.rb:772:5:772:5 | d : | array_flow.rb:777:10:777:10 | d | +| array_flow.rb:772:5:772:5 | d : | array_flow.rb:777:10:777:10 | d | | array_flow.rb:772:9:772:9 | a [element 2] : | array_flow.rb:772:9:776:7 | call to min : | | array_flow.rb:772:9:772:9 | a [element 2] : | array_flow.rb:772:9:776:7 | call to min : | | array_flow.rb:772:9:772:9 | a [element 2] : | array_flow.rb:772:19:772:19 | x : | | array_flow.rb:772:9:772:9 | a [element 2] : | array_flow.rb:772:19:772:19 | x : | | array_flow.rb:772:9:772:9 | a [element 2] : | array_flow.rb:772:22:772:22 | y : | | array_flow.rb:772:9:772:9 | a [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:9:776:7 | call to min : | array_flow.rb:772:5:772:5 | d : | +| array_flow.rb:772:9:776:7 | call to min : | array_flow.rb:772:5:772:5 | 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:5:780:5 | e [element] : | array_flow.rb:785:10:785:10 | e [element] : | +| array_flow.rb:780:5:780:5 | e [element] : | array_flow.rb:785:10:785:10 | e [element] : | | array_flow.rb:780:9:780:9 | a [element 2] : | array_flow.rb:780:9:784:7 | call to min [element] : | | array_flow.rb:780:9:780:9 | a [element 2] : | array_flow.rb:780:9:784:7 | call to min [element] : | | array_flow.rb:780:9:780:9 | a [element 2] : | array_flow.rb:780:22:780:22 | x : | | array_flow.rb:780:9:780:9 | a [element 2] : | array_flow.rb:780:22:780:22 | x : | | array_flow.rb:780:9:780:9 | a [element 2] : | array_flow.rb:780:25:780:25 | y : | | array_flow.rb:780:9:780:9 | a [element 2] : | array_flow.rb:780:25:780:25 | y : | -| array_flow.rb:780:9:784:7 | call to min [element] : | array_flow.rb:785:10:785:10 | e [element] : | -| array_flow.rb:780:9:784:7 | call to min [element] : | array_flow.rb:785:10:785:10 | e [element] : | +| array_flow.rb:780:9:784:7 | call to min [element] : | array_flow.rb:780:5:780:5 | e [element] : | +| array_flow.rb:780:9:784:7 | call to min [element] : | array_flow.rb:780:5:780:5 | e [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 [element] : | array_flow.rb:785:10:785:13 | ...[...] | | array_flow.rb:785:10:785:10 | e [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 [element 2] : | -| array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:792:9:792:9 | a [element 2] : | -| array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:799:9:799:9 | a [element 2] : | -| array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:799:9:799:9 | a [element 2] : | +| array_flow.rb:789:5:789:5 | a [element 2] : | array_flow.rb:792:9:792:9 | a [element 2] : | +| array_flow.rb:789:5:789:5 | a [element 2] : | array_flow.rb:792:9:792:9 | a [element 2] : | +| array_flow.rb:789:5:789:5 | a [element 2] : | array_flow.rb:799:9:799:9 | a [element 2] : | +| array_flow.rb:789:5:789:5 | a [element 2] : | array_flow.rb:799:9:799:9 | a [element 2] : | +| array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:789:5:789:5 | a [element 2] : | +| array_flow.rb:789:16:789:25 | call to source : | array_flow.rb:789:5:789:5 | a [element 2] : | +| array_flow.rb:792:5:792:5 | b : | array_flow.rb:796:10:796:10 | b | +| array_flow.rb:792:5:792:5 | b : | array_flow.rb:796:10:796:10 | b | | array_flow.rb:792:9:792:9 | a [element 2] : | array_flow.rb:792:9:795:7 | call to min_by : | | array_flow.rb:792:9:792:9 | a [element 2] : | array_flow.rb:792:9:795:7 | call to min_by : | | array_flow.rb:792:9:792:9 | a [element 2] : | array_flow.rb:792:22:792:22 | x : | | array_flow.rb:792:9:792:9 | a [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:9:795:7 | call to min_by : | array_flow.rb:792:5:792:5 | b : | +| array_flow.rb:792:9:795:7 | call to min_by : | array_flow.rb:792:5:792:5 | 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:5:799:5 | c [element] : | array_flow.rb:803:10:803:10 | c [element] : | +| array_flow.rb:799:5:799:5 | c [element] : | array_flow.rb:803:10:803:10 | c [element] : | | array_flow.rb:799:9:799:9 | a [element 2] : | array_flow.rb:799:9:802:7 | call to min_by [element] : | | array_flow.rb:799:9:799:9 | a [element 2] : | array_flow.rb:799:9:802:7 | call to min_by [element] : | | array_flow.rb:799:9:799:9 | a [element 2] : | array_flow.rb:799:25:799:25 | x : | | array_flow.rb:799:9:799:9 | a [element 2] : | array_flow.rb:799:25:799:25 | x : | -| array_flow.rb:799:9:802:7 | call to min_by [element] : | array_flow.rb:803:10:803:10 | c [element] : | -| array_flow.rb:799:9:802:7 | call to min_by [element] : | array_flow.rb:803:10:803:10 | c [element] : | +| array_flow.rb:799:9:802:7 | call to min_by [element] : | array_flow.rb:799:5:799:5 | c [element] : | +| array_flow.rb:799:9:802:7 | call to min_by [element] : | array_flow.rb:799:5:799:5 | c [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 [element] : | array_flow.rb:803:10:803:13 | ...[...] | | array_flow.rb:803:10:803:10 | c [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 [element 2] : | -| array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:809:9:809:9 | a [element 2] : | -| array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:813:9:813:9 | a [element 2] : | -| array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:813:9:813:9 | a [element 2] : | +| array_flow.rb:807:5:807:5 | a [element 2] : | array_flow.rb:809:9:809:9 | a [element 2] : | +| array_flow.rb:807:5:807:5 | a [element 2] : | array_flow.rb:809:9:809:9 | a [element 2] : | +| array_flow.rb:807:5:807:5 | a [element 2] : | array_flow.rb:813:9:813:9 | a [element 2] : | +| array_flow.rb:807:5:807:5 | a [element 2] : | array_flow.rb:813:9:813:9 | a [element 2] : | +| array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:807:5:807:5 | a [element 2] : | +| array_flow.rb:807:16:807:25 | call to source : | array_flow.rb:807:5:807:5 | a [element 2] : | +| array_flow.rb:809:5:809:5 | b [element] : | array_flow.rb:810:10:810:10 | b [element] : | +| array_flow.rb:809:5:809:5 | b [element] : | array_flow.rb:810:10:810:10 | b [element] : | +| array_flow.rb:809:5:809:5 | b [element] : | array_flow.rb:811:10:811:10 | b [element] : | +| array_flow.rb:809:5:809:5 | b [element] : | array_flow.rb:811:10:811:10 | b [element] : | | array_flow.rb:809:9:809:9 | a [element 2] : | array_flow.rb:809:9:809:16 | call to minmax [element] : | | array_flow.rb:809:9:809:9 | a [element 2] : | array_flow.rb:809:9:809:16 | call to minmax [element] : | -| array_flow.rb:809:9:809:16 | call to minmax [element] : | array_flow.rb:810:10:810:10 | b [element] : | -| array_flow.rb:809:9:809:16 | call to minmax [element] : | array_flow.rb:810:10:810:10 | b [element] : | -| array_flow.rb:809:9:809:16 | call to minmax [element] : | array_flow.rb:811:10:811:10 | b [element] : | -| array_flow.rb:809:9:809:16 | call to minmax [element] : | array_flow.rb:811:10:811:10 | b [element] : | +| array_flow.rb:809:9:809:16 | call to minmax [element] : | array_flow.rb:809:5:809:5 | b [element] : | +| array_flow.rb:809:9:809:16 | call to minmax [element] : | array_flow.rb:809:5:809:5 | b [element] : | | array_flow.rb:810:10:810:10 | b [element] : | array_flow.rb:810:10:810:13 | ...[...] | | array_flow.rb:810:10:810:10 | b [element] : | array_flow.rb:810:10:810:13 | ...[...] | | array_flow.rb:811:10:811:10 | b [element] : | array_flow.rb:811:10:811:13 | ...[...] | | array_flow.rb:811:10:811:10 | b [element] : | array_flow.rb:811:10:811:13 | ...[...] | +| array_flow.rb:813:5:813:5 | c [element] : | array_flow.rb:818:10:818:10 | c [element] : | +| array_flow.rb:813:5:813:5 | c [element] : | array_flow.rb:818:10:818:10 | c [element] : | +| array_flow.rb:813:5:813:5 | c [element] : | array_flow.rb:819:10:819:10 | c [element] : | +| array_flow.rb:813:5:813:5 | c [element] : | array_flow.rb:819:10:819:10 | c [element] : | | array_flow.rb:813:9:813:9 | a [element 2] : | array_flow.rb:813:9:817:7 | call to minmax [element] : | | array_flow.rb:813:9:813:9 | a [element 2] : | array_flow.rb:813:9:817:7 | call to minmax [element] : | | array_flow.rb:813:9:813:9 | a [element 2] : | array_flow.rb:813:22:813:22 | x : | | array_flow.rb:813:9:813:9 | a [element 2] : | array_flow.rb:813:22:813:22 | x : | | array_flow.rb:813:9:813:9 | a [element 2] : | array_flow.rb:813:25:813:25 | y : | | array_flow.rb:813:9:813:9 | a [element 2] : | array_flow.rb:813:25:813:25 | y : | -| array_flow.rb:813:9:817:7 | call to minmax [element] : | array_flow.rb:818:10:818:10 | c [element] : | -| array_flow.rb:813:9:817:7 | call to minmax [element] : | array_flow.rb:818:10:818:10 | c [element] : | -| array_flow.rb:813:9:817:7 | call to minmax [element] : | array_flow.rb:819:10:819:10 | c [element] : | -| array_flow.rb:813:9:817:7 | call to minmax [element] : | array_flow.rb:819:10:819:10 | c [element] : | +| array_flow.rb:813:9:817:7 | call to minmax [element] : | array_flow.rb:813:5:813:5 | c [element] : | +| array_flow.rb:813:9:817:7 | call to minmax [element] : | array_flow.rb:813:5:813:5 | c [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 | @@ -1460,47 +1843,61 @@ edges | array_flow.rb:818:10:818:10 | c [element] : | array_flow.rb:818:10:818:13 | ...[...] | | array_flow.rb:819:10:819:10 | c [element] : | array_flow.rb:819:10:819:13 | ...[...] | | array_flow.rb:819:10:819:10 | c [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 [element 2] : | -| array_flow.rb:823:16:823:25 | call to source : | array_flow.rb:824:9:824:9 | a [element 2] : | +| array_flow.rb:823:5:823:5 | a [element 2] : | array_flow.rb:824:9:824:9 | a [element 2] : | +| array_flow.rb:823:5:823:5 | a [element 2] : | array_flow.rb:824:9:824:9 | a [element 2] : | +| array_flow.rb:823:16:823:25 | call to source : | array_flow.rb:823:5:823:5 | a [element 2] : | +| array_flow.rb:823:16:823:25 | call to source : | array_flow.rb:823:5:823:5 | a [element 2] : | +| array_flow.rb:824:5:824:5 | b [element] : | array_flow.rb:828:10:828:10 | b [element] : | +| array_flow.rb:824:5:824:5 | b [element] : | array_flow.rb:828:10:828:10 | b [element] : | +| array_flow.rb:824:5:824:5 | b [element] : | array_flow.rb:829:10:829:10 | b [element] : | +| array_flow.rb:824:5:824:5 | b [element] : | array_flow.rb:829:10:829:10 | b [element] : | | array_flow.rb:824:9:824:9 | a [element 2] : | array_flow.rb:824:9:827:7 | call to minmax_by [element] : | | array_flow.rb:824:9:824:9 | a [element 2] : | array_flow.rb:824:9:827:7 | call to minmax_by [element] : | | array_flow.rb:824:9:824:9 | a [element 2] : | array_flow.rb:824:25:824:25 | x : | | array_flow.rb:824:9:824:9 | a [element 2] : | array_flow.rb:824:25:824:25 | x : | -| array_flow.rb:824:9:827:7 | call to minmax_by [element] : | array_flow.rb:828:10:828:10 | b [element] : | -| array_flow.rb:824:9:827:7 | call to minmax_by [element] : | array_flow.rb:828:10:828:10 | b [element] : | -| array_flow.rb:824:9:827:7 | call to minmax_by [element] : | array_flow.rb:829:10:829:10 | b [element] : | -| array_flow.rb:824:9:827:7 | call to minmax_by [element] : | array_flow.rb:829:10:829:10 | b [element] : | +| array_flow.rb:824:9:827:7 | call to minmax_by [element] : | array_flow.rb:824:5:824:5 | b [element] : | +| array_flow.rb:824:9:827:7 | call to minmax_by [element] : | array_flow.rb:824:5:824:5 | b [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 [element] : | array_flow.rb:828:10:828:13 | ...[...] | | array_flow.rb:828:10:828:10 | b [element] : | array_flow.rb:828:10:828:13 | ...[...] | | array_flow.rb:829:10:829:10 | b [element] : | array_flow.rb:829:10:829:13 | ...[...] | | array_flow.rb:829:10:829:10 | b [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 [element 2] : | -| array_flow.rb:833:16:833:25 | call to source : | array_flow.rb:834:5:834:5 | a [element 2] : | +| array_flow.rb:833:5:833:5 | a [element 2] : | array_flow.rb:834:5:834:5 | a [element 2] : | +| array_flow.rb:833:5:833:5 | a [element 2] : | array_flow.rb:834:5:834:5 | a [element 2] : | +| array_flow.rb:833:16:833:25 | call to source : | array_flow.rb:833:5:833:5 | a [element 2] : | +| array_flow.rb:833:16:833:25 | call to source : | array_flow.rb:833:5:833:5 | a [element 2] : | | array_flow.rb:834:5:834:5 | a [element 2] : | array_flow.rb:834:17:834:17 | x : | | array_flow.rb:834:5:834:5 | a [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 [element 2] : | -| array_flow.rb:842:16:842:25 | call to source : | array_flow.rb:843:5:843:5 | a [element 2] : | +| array_flow.rb:842:5:842:5 | a [element 2] : | array_flow.rb:843:5:843:5 | a [element 2] : | +| array_flow.rb:842:5:842:5 | a [element 2] : | array_flow.rb:843:5:843:5 | a [element 2] : | +| array_flow.rb:842:16:842:25 | call to source : | array_flow.rb:842:5:842:5 | a [element 2] : | +| array_flow.rb:842:16:842:25 | call to source : | array_flow.rb:842:5:842:5 | a [element 2] : | | array_flow.rb:843:5:843:5 | a [element 2] : | array_flow.rb:843:16:843:16 | x : | | array_flow.rb:843:5:843:5 | a [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 [element 2] : | +| array_flow.rb:849:5:849:5 | a [element 2] : | array_flow.rb:850:9:850:9 | a [element 2] : | +| array_flow.rb:849:16:849:25 | call to source : | array_flow.rb:849:5:849:5 | a [element 2] : | +| array_flow.rb:850:5:850:5 | b : | array_flow.rb:851:10:851:10 | b | | array_flow.rb:850:9:850:9 | a [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 [element 2] : | -| array_flow.rb:855:16:855:25 | call to source : | array_flow.rb:856:9:856:9 | a [element 2] : | +| array_flow.rb:850:9:850:20 | call to pack : | array_flow.rb:850:5:850:5 | b : | +| array_flow.rb:855:5:855:5 | a [element 2] : | array_flow.rb:856:9:856:9 | a [element 2] : | +| array_flow.rb:855:5:855:5 | a [element 2] : | array_flow.rb:856:9:856:9 | a [element 2] : | +| array_flow.rb:855:16:855:25 | call to source : | array_flow.rb:855:5:855:5 | a [element 2] : | +| array_flow.rb:855:16:855:25 | call to source : | array_flow.rb:855:5:855:5 | a [element 2] : | +| array_flow.rb:856:5:856:5 | b [element, element] : | array_flow.rb:860:10:860:10 | b [element, element] : | +| array_flow.rb:856:5:856:5 | b [element, element] : | array_flow.rb:860:10:860:10 | b [element, element] : | +| array_flow.rb:856:5:856:5 | b [element, element] : | array_flow.rb:861:10:861:10 | b [element, element] : | +| array_flow.rb:856:5:856:5 | b [element, element] : | array_flow.rb:861:10:861:10 | b [element, element] : | | array_flow.rb:856:9:856:9 | a [element 2] : | array_flow.rb:856:9:859:7 | call to partition [element, element] : | | array_flow.rb:856:9:856:9 | a [element 2] : | array_flow.rb:856:9:859:7 | call to partition [element, element] : | | array_flow.rb:856:9:856:9 | a [element 2] : | array_flow.rb:856:25:856:25 | x : | | array_flow.rb:856:9:856:9 | a [element 2] : | array_flow.rb:856:25:856:25 | x : | -| array_flow.rb:856:9:859:7 | call to partition [element, element] : | array_flow.rb:860:10:860:10 | b [element, element] : | -| array_flow.rb:856:9:859:7 | call to partition [element, element] : | array_flow.rb:860:10:860:10 | b [element, element] : | -| array_flow.rb:856:9:859:7 | call to partition [element, element] : | array_flow.rb:861:10:861:10 | b [element, element] : | -| array_flow.rb:856:9:859:7 | call to partition [element, element] : | array_flow.rb:861:10:861:10 | b [element, element] : | +| array_flow.rb:856:9:859:7 | call to partition [element, element] : | array_flow.rb:856:5:856:5 | b [element, element] : | +| array_flow.rb:856:9:859:7 | call to partition [element, element] : | array_flow.rb:856:5:856:5 | b [element, 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 [element, element] : | array_flow.rb:860:10:860:13 | ...[...] [element] : | @@ -1511,18 +1908,22 @@ edges | array_flow.rb:861:10:861:10 | b [element, element] : | array_flow.rb:861:10:861:13 | ...[...] [element] : | | array_flow.rb:861:10:861:13 | ...[...] [element] : | array_flow.rb:861:10:861:16 | ...[...] | | array_flow.rb:861:10:861:13 | ...[...] [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 [element 2] : | -| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:867:9:867:9 | a [element 2] : | -| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:875:9:875:9 | a [element 2] : | -| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:875:9:875:9 | a [element 2] : | -| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:882:9:882:9 | a [element 2] : | -| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:882:9:882:9 | a [element 2] : | +| array_flow.rb:865:5:865:5 | a [element 2] : | array_flow.rb:867:9:867:9 | a [element 2] : | +| array_flow.rb:865:5:865:5 | a [element 2] : | array_flow.rb:867:9:867:9 | a [element 2] : | +| array_flow.rb:865:5:865:5 | a [element 2] : | array_flow.rb:875:9:875:9 | a [element 2] : | +| array_flow.rb:865:5:865:5 | a [element 2] : | array_flow.rb:875:9:875:9 | a [element 2] : | +| array_flow.rb:865:5:865:5 | a [element 2] : | array_flow.rb:882:9:882:9 | a [element 2] : | +| array_flow.rb:865:5:865:5 | a [element 2] : | array_flow.rb:882:9:882:9 | a [element 2] : | +| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:865:5:865:5 | a [element 2] : | +| array_flow.rb:865:16:865:25 | call to source : | array_flow.rb:865:5:865:5 | a [element 2] : | +| array_flow.rb:867:5:867:5 | b [element 2] : | array_flow.rb:873:10:873:10 | b [element 2] : | +| array_flow.rb:867:5:867:5 | b [element 2] : | array_flow.rb:873:10:873:10 | b [element 2] : | | array_flow.rb:867:9:867:9 | a [element 2] : | array_flow.rb:867:9:871:7 | call to permutation [element 2] : | | array_flow.rb:867:9:867:9 | a [element 2] : | array_flow.rb:867:9:871:7 | call to permutation [element 2] : | | array_flow.rb:867:9:867:9 | a [element 2] : | array_flow.rb:867:27:867:27 | x [element] : | | array_flow.rb:867:9:867:9 | a [element 2] : | array_flow.rb:867:27:867:27 | x [element] : | -| array_flow.rb:867:9:871:7 | call to permutation [element 2] : | array_flow.rb:873:10:873:10 | b [element 2] : | -| array_flow.rb:867:9:871:7 | call to permutation [element 2] : | array_flow.rb:873:10:873:10 | b [element 2] : | +| array_flow.rb:867:9:871:7 | call to permutation [element 2] : | array_flow.rb:867:5:867:5 | b [element 2] : | +| array_flow.rb:867:9:871:7 | call to permutation [element 2] : | array_flow.rb:867:5:867:5 | b [element 2] : | | array_flow.rb:867:27:867:27 | x [element] : | array_flow.rb:868:14:868:14 | x [element] : | | array_flow.rb:867:27:867:27 | x [element] : | array_flow.rb:868:14:868:14 | x [element] : | | array_flow.rb:867:27:867:27 | x [element] : | array_flow.rb:869:14:869:14 | x [element] : | @@ -1537,14 +1938,16 @@ edges | array_flow.rb:870:14:870:14 | x [element] : | array_flow.rb:870:14:870:17 | ...[...] | | array_flow.rb:873:10:873:10 | b [element 2] : | array_flow.rb:873:10:873:13 | ...[...] | | array_flow.rb:873:10:873:10 | b [element 2] : | array_flow.rb:873:10:873:13 | ...[...] | +| array_flow.rb:875:5:875:5 | c [element 2] : | array_flow.rb:880:10:880:10 | c [element 2] : | +| array_flow.rb:875:5:875:5 | c [element 2] : | array_flow.rb:880:10:880:10 | c [element 2] : | +| array_flow.rb:875:5:875:5 | c [element 2] : | array_flow.rb:887:10:887:10 | c [element 2] : | +| array_flow.rb:875:5:875:5 | c [element 2] : | array_flow.rb:887:10:887:10 | c [element 2] : | | array_flow.rb:875:9:875:9 | a [element 2] : | array_flow.rb:875:9:878:7 | call to permutation [element 2] : | | array_flow.rb:875:9:875:9 | a [element 2] : | array_flow.rb:875:9:878:7 | call to permutation [element 2] : | | array_flow.rb:875:9:875:9 | a [element 2] : | array_flow.rb:875:30:875:30 | x [element] : | | array_flow.rb:875:9:875:9 | a [element 2] : | array_flow.rb:875:30:875:30 | x [element] : | -| array_flow.rb:875:9:878:7 | call to permutation [element 2] : | array_flow.rb:880:10:880:10 | c [element 2] : | -| array_flow.rb:875:9:878:7 | call to permutation [element 2] : | array_flow.rb:880:10:880:10 | c [element 2] : | -| array_flow.rb:875:9:878:7 | call to permutation [element 2] : | array_flow.rb:887:10:887:10 | c [element 2] : | -| array_flow.rb:875:9:878:7 | call to permutation [element 2] : | array_flow.rb:887:10:887:10 | c [element 2] : | +| array_flow.rb:875:9:878:7 | call to permutation [element 2] : | array_flow.rb:875:5:875:5 | c [element 2] : | +| array_flow.rb:875:9:878:7 | call to permutation [element 2] : | array_flow.rb:875:5:875:5 | c [element 2] : | | array_flow.rb:875:30:875:30 | x [element] : | array_flow.rb:876:14:876:14 | x [element] : | | array_flow.rb:875:30:875:30 | x [element] : | array_flow.rb:876:14:876:14 | x [element] : | | array_flow.rb:875:30:875:30 | x [element] : | array_flow.rb:877:14:877:14 | x [element] : | @@ -1567,40 +1970,52 @@ edges | array_flow.rb:884:14:884:14 | x [element] : | array_flow.rb:884:14:884:17 | ...[...] | | array_flow.rb:887:10:887:10 | c [element 2] : | array_flow.rb:887:10:887:13 | ...[...] | | array_flow.rb:887:10:887:10 | c [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 [element 1] : | -| array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:895:9:895:9 | a [element 1] : | -| array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:898:10:898:10 | a [element 1] : | -| array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:898:10:898:10 | a [element 1] : | -| array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:895:9:895:9 | a [element 3] : | -| array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:895:9:895:9 | a [element 3] : | -| array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:900:10:900:10 | a [element 3] : | -| array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:900:10:900:10 | a [element 3] : | +| array_flow.rb:894:5:894:5 | a [element 1] : | array_flow.rb:895:9:895:9 | a [element 1] : | +| array_flow.rb:894:5:894:5 | a [element 1] : | array_flow.rb:895:9:895:9 | a [element 1] : | +| array_flow.rb:894:5:894:5 | a [element 1] : | array_flow.rb:898:10:898:10 | a [element 1] : | +| array_flow.rb:894:5:894:5 | a [element 1] : | array_flow.rb:898:10:898:10 | a [element 1] : | +| array_flow.rb:894:5:894:5 | a [element 3] : | array_flow.rb:895:9:895:9 | a [element 3] : | +| array_flow.rb:894:5:894:5 | a [element 3] : | array_flow.rb:895:9:895:9 | a [element 3] : | +| array_flow.rb:894:5:894:5 | a [element 3] : | array_flow.rb:900:10:900:10 | a [element 3] : | +| array_flow.rb:894:5:894:5 | a [element 3] : | array_flow.rb:900:10:900:10 | a [element 3] : | +| array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:894:5:894:5 | a [element 1] : | +| array_flow.rb:894:13:894:24 | call to source : | array_flow.rb:894:5:894:5 | a [element 1] : | +| array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:894:5:894:5 | a [element 3] : | +| array_flow.rb:894:30:894:41 | call to source : | array_flow.rb:894:5:894:5 | a [element 3] : | +| array_flow.rb:895:5:895:5 | b : | array_flow.rb:896:10:896:10 | b | +| array_flow.rb:895:5:895:5 | b : | array_flow.rb:896:10:896:10 | b | | array_flow.rb:895:9:895:9 | a [element 1] : | array_flow.rb:895:9:895:13 | call to pop : | | array_flow.rb:895:9:895:9 | a [element 1] : | array_flow.rb:895:9:895:13 | call to pop : | | array_flow.rb:895:9:895:9 | a [element 3] : | array_flow.rb:895:9:895:13 | call to pop : | | array_flow.rb:895:9:895:9 | a [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:895:9:895:13 | call to pop : | array_flow.rb:895:5:895:5 | b : | +| array_flow.rb:895:9:895:13 | call to pop : | array_flow.rb:895:5:895:5 | b : | | array_flow.rb:898:10:898:10 | a [element 1] : | array_flow.rb:898:10:898:13 | ...[...] | | array_flow.rb:898:10:898:10 | a [element 1] : | array_flow.rb:898:10:898:13 | ...[...] | | array_flow.rb:900:10:900:10 | a [element 3] : | array_flow.rb:900:10:900:13 | ...[...] | | array_flow.rb:900:10:900:10 | a [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 [element 1] : | -| array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:903:9:903:9 | a [element 1] : | -| array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:907:10:907:10 | a [element 1] : | -| array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:907:10:907:10 | a [element 1] : | -| array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:903:9:903:9 | a [element 3] : | -| array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:903:9:903:9 | a [element 3] : | -| array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:909:10:909:10 | a [element 3] : | -| array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:909:10:909:10 | a [element 3] : | +| array_flow.rb:902:5:902:5 | a [element 1] : | array_flow.rb:903:9:903:9 | a [element 1] : | +| array_flow.rb:902:5:902:5 | a [element 1] : | array_flow.rb:903:9:903:9 | a [element 1] : | +| array_flow.rb:902:5:902:5 | a [element 1] : | array_flow.rb:907:10:907:10 | a [element 1] : | +| array_flow.rb:902:5:902:5 | a [element 1] : | array_flow.rb:907:10:907:10 | a [element 1] : | +| array_flow.rb:902:5:902:5 | a [element 3] : | array_flow.rb:903:9:903:9 | a [element 3] : | +| array_flow.rb:902:5:902:5 | a [element 3] : | array_flow.rb:903:9:903:9 | a [element 3] : | +| array_flow.rb:902:5:902:5 | a [element 3] : | array_flow.rb:909:10:909:10 | a [element 3] : | +| array_flow.rb:902:5:902:5 | a [element 3] : | array_flow.rb:909:10:909:10 | a [element 3] : | +| array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:902:5:902:5 | a [element 1] : | +| array_flow.rb:902:13:902:24 | call to source : | array_flow.rb:902:5:902:5 | a [element 1] : | +| array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:902:5:902:5 | a [element 3] : | +| array_flow.rb:902:30:902:41 | call to source : | array_flow.rb:902:5:902:5 | a [element 3] : | +| array_flow.rb:903:5:903:5 | b [element] : | array_flow.rb:904:10:904:10 | b [element] : | +| array_flow.rb:903:5:903:5 | b [element] : | array_flow.rb:904:10:904:10 | b [element] : | +| array_flow.rb:903:5:903:5 | b [element] : | array_flow.rb:905:10:905:10 | b [element] : | +| array_flow.rb:903:5:903:5 | b [element] : | array_flow.rb:905:10:905:10 | b [element] : | | array_flow.rb:903:9:903:9 | a [element 1] : | array_flow.rb:903:9:903:16 | call to pop [element] : | | array_flow.rb:903:9:903:9 | a [element 1] : | array_flow.rb:903:9:903:16 | call to pop [element] : | | array_flow.rb:903:9:903:9 | a [element 3] : | array_flow.rb:903:9:903:16 | call to pop [element] : | | array_flow.rb:903:9:903:9 | a [element 3] : | array_flow.rb:903:9:903:16 | call to pop [element] : | -| array_flow.rb:903:9:903:16 | call to pop [element] : | array_flow.rb:904:10:904:10 | b [element] : | -| array_flow.rb:903:9:903:16 | call to pop [element] : | array_flow.rb:904:10:904:10 | b [element] : | -| array_flow.rb:903:9:903:16 | call to pop [element] : | array_flow.rb:905:10:905:10 | b [element] : | -| array_flow.rb:903:9:903:16 | call to pop [element] : | array_flow.rb:905:10:905:10 | b [element] : | +| array_flow.rb:903:9:903:16 | call to pop [element] : | array_flow.rb:903:5:903:5 | b [element] : | +| array_flow.rb:903:9:903:16 | call to pop [element] : | array_flow.rb:903:5:903:5 | b [element] : | | array_flow.rb:904:10:904:10 | b [element] : | array_flow.rb:904:10:904:13 | ...[...] | | array_flow.rb:904:10:904:10 | b [element] : | array_flow.rb:904:10:904:13 | ...[...] | | array_flow.rb:905:10:905:10 | b [element] : | array_flow.rb:905:10:905:13 | ...[...] | @@ -1609,8 +2024,10 @@ edges | array_flow.rb:907:10:907:10 | a [element 1] : | array_flow.rb:907:10:907:13 | ...[...] | | array_flow.rb:909:10:909:10 | a [element 3] : | array_flow.rb:909:10:909:13 | ...[...] | | array_flow.rb:909:10:909:10 | a [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 [element 2] : | -| array_flow.rb:913:16:913:27 | call to source : | array_flow.rb:914:5:914:5 | a [element 2] : | +| array_flow.rb:913:5:913:5 | a [element 2] : | array_flow.rb:914:5:914:5 | a [element 2] : | +| array_flow.rb:913:5:913:5 | a [element 2] : | array_flow.rb:914:5:914:5 | a [element 2] : | +| array_flow.rb:913:16:913:27 | call to source : | array_flow.rb:913:5:913:5 | a [element 2] : | +| array_flow.rb:913:16:913:27 | call to source : | array_flow.rb:913:5:913:5 | a [element 2] : | | array_flow.rb:914:5:914:5 | [post] a [element 2] : | array_flow.rb:917:10:917:10 | a [element 2] : | | array_flow.rb:914:5:914:5 | [post] a [element 2] : | array_flow.rb:917:10:917:10 | a [element 2] : | | array_flow.rb:914:5:914:5 | [post] a [element 5] : | array_flow.rb:920:10:920:10 | a [element 5] : | @@ -1623,18 +2040,26 @@ edges | array_flow.rb:917:10:917:10 | a [element 2] : | array_flow.rb:917:10:917:13 | ...[...] | | array_flow.rb:920:10:920:10 | a [element 5] : | array_flow.rb:920:10:920:13 | ...[...] | | array_flow.rb:920:10:920:10 | a [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 [element 2] : | -| array_flow.rb:924:16:924:27 | call to source : | array_flow.rb:927:9:927:9 | a [element 2] : | -| array_flow.rb:925:13:925:24 | call to source : | array_flow.rb:927:19:927:19 | b [element 1] : | -| array_flow.rb:925:13:925:24 | call to source : | array_flow.rb:927:19:927:19 | b [element 1] : | -| array_flow.rb:926:10:926:21 | call to source : | array_flow.rb:927:22:927:22 | c [element 0] : | -| array_flow.rb:926:10:926:21 | call to source : | array_flow.rb:927:22:927:22 | c [element 0] : | +| array_flow.rb:924:5:924:5 | a [element 2] : | array_flow.rb:927:9:927:9 | a [element 2] : | +| array_flow.rb:924:5:924:5 | a [element 2] : | array_flow.rb:927:9:927:9 | a [element 2] : | +| array_flow.rb:924:16:924:27 | call to source : | array_flow.rb:924:5:924:5 | a [element 2] : | +| array_flow.rb:924:16:924:27 | call to source : | array_flow.rb:924:5:924:5 | a [element 2] : | +| array_flow.rb:925:5:925:5 | b [element 1] : | array_flow.rb:927:19:927:19 | b [element 1] : | +| array_flow.rb:925:5:925:5 | b [element 1] : | array_flow.rb:927:19:927:19 | b [element 1] : | +| array_flow.rb:925:13:925:24 | call to source : | array_flow.rb:925:5:925:5 | b [element 1] : | +| array_flow.rb:925:13:925:24 | call to source : | array_flow.rb:925:5:925:5 | b [element 1] : | +| array_flow.rb:926:5:926:5 | c [element 0] : | array_flow.rb:927:22:927:22 | c [element 0] : | +| array_flow.rb:926:5:926:5 | c [element 0] : | array_flow.rb:927:22:927:22 | c [element 0] : | +| array_flow.rb:926:10:926:21 | call to source : | array_flow.rb:926:5:926:5 | c [element 0] : | +| array_flow.rb:926:10:926:21 | call to source : | array_flow.rb:926:5:926:5 | c [element 0] : | +| array_flow.rb:927:5:927:5 | d [element, element] : | array_flow.rb:928:10:928:10 | d [element, element] : | +| array_flow.rb:927:5:927:5 | d [element, element] : | array_flow.rb:928:10:928:10 | d [element, element] : | +| array_flow.rb:927:5:927:5 | d [element, element] : | array_flow.rb:929:10:929:10 | d [element, element] : | +| array_flow.rb:927:5:927:5 | d [element, element] : | array_flow.rb:929:10:929:10 | d [element, element] : | | array_flow.rb:927:9:927:9 | a [element 2] : | array_flow.rb:927:9:927:22 | call to product [element, element] : | | array_flow.rb:927:9:927:9 | a [element 2] : | array_flow.rb:927:9:927:22 | call to product [element, element] : | -| array_flow.rb:927:9:927:22 | call to product [element, element] : | array_flow.rb:928:10:928:10 | d [element, element] : | -| array_flow.rb:927:9:927:22 | call to product [element, element] : | array_flow.rb:928:10:928:10 | d [element, element] : | -| array_flow.rb:927:9:927:22 | call to product [element, element] : | array_flow.rb:929:10:929:10 | d [element, element] : | -| array_flow.rb:927:9:927:22 | call to product [element, element] : | array_flow.rb:929:10:929:10 | d [element, element] : | +| array_flow.rb:927:9:927:22 | call to product [element, element] : | array_flow.rb:927:5:927:5 | d [element, element] : | +| array_flow.rb:927:9:927:22 | call to product [element, element] : | array_flow.rb:927:5:927:5 | d [element, element] : | | array_flow.rb:927:19:927:19 | b [element 1] : | array_flow.rb:927:9:927:22 | call to product [element, element] : | | array_flow.rb:927:19:927:19 | b [element 1] : | array_flow.rb:927:9:927:22 | call to product [element, element] : | | array_flow.rb:927:22:927:22 | c [element 0] : | array_flow.rb:927:9:927:22 | call to product [element, element] : | @@ -1647,22 +2072,28 @@ edges | array_flow.rb:929:10:929:10 | d [element, element] : | array_flow.rb:929:10:929:13 | ...[...] [element] : | | array_flow.rb:929:10:929:13 | ...[...] [element] : | array_flow.rb:929:10:929:16 | ...[...] | | array_flow.rb:929:10:929:13 | ...[...] [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 [element 0] : | -| array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:934:9:934:9 | a [element 0] : | -| array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:935:10:935:10 | a [element 0] : | -| array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:935:10:935:10 | a [element 0] : | +| array_flow.rb:933:5:933:5 | a [element 0] : | array_flow.rb:934:9:934:9 | a [element 0] : | +| array_flow.rb:933:5:933:5 | a [element 0] : | array_flow.rb:934:9:934:9 | a [element 0] : | +| array_flow.rb:933:5:933:5 | a [element 0] : | array_flow.rb:935:10:935:10 | a [element 0] : | +| array_flow.rb:933:5:933:5 | a [element 0] : | array_flow.rb:935:10:935:10 | a [element 0] : | +| array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:933:5:933:5 | a [element 0] : | +| array_flow.rb:933:10:933:21 | call to source : | array_flow.rb:933:5:933:5 | a [element 0] : | +| array_flow.rb:934:5:934:5 | b [element 0] : | array_flow.rb:937:10:937:10 | b [element 0] : | +| array_flow.rb:934:5:934:5 | b [element 0] : | array_flow.rb:937:10:937:10 | b [element 0] : | +| array_flow.rb:934:5:934:5 | b [element] : | array_flow.rb:937:10:937:10 | b [element] : | +| array_flow.rb:934:5:934:5 | b [element] : | array_flow.rb:937:10:937:10 | b [element] : | +| array_flow.rb:934:5:934:5 | b [element] : | array_flow.rb:938:10:938:10 | b [element] : | +| array_flow.rb:934:5:934:5 | b [element] : | array_flow.rb:938:10:938:10 | b [element] : | | array_flow.rb:934:9:934:9 | [post] a [element] : | array_flow.rb:935:10:935:10 | a [element] : | | array_flow.rb:934:9:934:9 | [post] a [element] : | array_flow.rb:935:10:935:10 | a [element] : | | array_flow.rb:934:9:934:9 | [post] a [element] : | array_flow.rb:936:10:936:10 | a [element] : | | array_flow.rb:934:9:934:9 | [post] a [element] : | array_flow.rb:936:10:936:10 | a [element] : | | array_flow.rb:934:9:934:9 | a [element 0] : | array_flow.rb:934:9:934:44 | call to append [element 0] : | | array_flow.rb:934:9:934:9 | a [element 0] : | array_flow.rb:934:9:934:44 | call to append [element 0] : | -| array_flow.rb:934:9:934:44 | call to append [element 0] : | array_flow.rb:937:10:937:10 | b [element 0] : | -| array_flow.rb:934:9:934:44 | call to append [element 0] : | array_flow.rb:937:10:937:10 | b [element 0] : | -| array_flow.rb:934:9:934:44 | call to append [element] : | array_flow.rb:937:10:937:10 | b [element] : | -| array_flow.rb:934:9:934:44 | call to append [element] : | array_flow.rb:937:10:937:10 | b [element] : | -| array_flow.rb:934:9:934:44 | call to append [element] : | array_flow.rb:938:10:938:10 | b [element] : | -| array_flow.rb:934:9:934:44 | call to append [element] : | array_flow.rb:938:10:938:10 | b [element] : | +| array_flow.rb:934:9:934:44 | call to append [element 0] : | array_flow.rb:934:5:934:5 | b [element 0] : | +| array_flow.rb:934:9:934:44 | call to append [element 0] : | array_flow.rb:934:5:934:5 | b [element 0] : | +| array_flow.rb:934:9:934:44 | call to append [element] : | array_flow.rb:934:5:934:5 | b [element] : | +| array_flow.rb:934:9:934:44 | call to append [element] : | array_flow.rb:934:5:934:5 | b [element] : | | array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:934:9:934:9 | [post] a [element] : | | array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:934:9:934:9 | [post] a [element] : | | array_flow.rb:934:18:934:29 | call to source : | array_flow.rb:934:9:934:44 | call to append [element] : | @@ -1683,12 +2114,16 @@ edges | array_flow.rb:937:10:937:10 | b [element] : | array_flow.rb:937:10:937:13 | ...[...] | | array_flow.rb:938:10:938:10 | b [element] : | array_flow.rb:938:10:938:13 | ...[...] | | array_flow.rb:938:10:938:10 | b [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 [element 0] : | -| array_flow.rb:944:10:944:19 | call to source : | array_flow.rb:945:16:945:16 | c [element 0] : | -| array_flow.rb:945:16:945:16 | c [element 0] : | array_flow.rb:946:10:946:10 | d [element 2, element 0] : | -| array_flow.rb:945:16:945:16 | c [element 0] : | array_flow.rb:946:10:946:10 | d [element 2, element 0] : | -| array_flow.rb:945:16:945:16 | c [element 0] : | array_flow.rb:947:10:947:10 | d [element 2, element 0] : | -| array_flow.rb:945:16:945:16 | c [element 0] : | array_flow.rb:947:10:947:10 | d [element 2, element 0] : | +| array_flow.rb:944:5:944:5 | c [element 0] : | array_flow.rb:945:16:945:16 | c [element 0] : | +| array_flow.rb:944:5:944:5 | c [element 0] : | array_flow.rb:945:16:945:16 | c [element 0] : | +| array_flow.rb:944:10:944:19 | call to source : | array_flow.rb:944:5:944:5 | c [element 0] : | +| array_flow.rb:944:10:944:19 | call to source : | array_flow.rb:944:5:944:5 | c [element 0] : | +| array_flow.rb:945:5:945:5 | d [element 2, element 0] : | array_flow.rb:946:10:946:10 | d [element 2, element 0] : | +| array_flow.rb:945:5:945:5 | d [element 2, element 0] : | array_flow.rb:946:10:946:10 | d [element 2, element 0] : | +| array_flow.rb:945:5:945:5 | d [element 2, element 0] : | array_flow.rb:947:10:947:10 | d [element 2, element 0] : | +| array_flow.rb:945:5:945:5 | d [element 2, element 0] : | array_flow.rb:947:10:947:10 | d [element 2, element 0] : | +| array_flow.rb:945:16:945:16 | c [element 0] : | array_flow.rb:945:5:945:5 | d [element 2, element 0] : | +| array_flow.rb:945:16:945:16 | c [element 0] : | array_flow.rb:945:5:945:5 | d [element 2, element 0] : | | array_flow.rb:946:10:946:10 | d [element 2, element 0] : | array_flow.rb:946:10:946:22 | call to rassoc [element 0] : | | array_flow.rb:946:10:946:10 | d [element 2, element 0] : | array_flow.rb:946:10:946:22 | call to rassoc [element 0] : | | array_flow.rb:946:10:946:22 | call to rassoc [element 0] : | array_flow.rb:946:10:946:25 | ...[...] | @@ -1697,14 +2132,18 @@ edges | array_flow.rb:947:10:947:10 | d [element 2, element 0] : | array_flow.rb:947:10:947:22 | call to rassoc [element 0] : | | array_flow.rb:947:10:947:22 | call to rassoc [element 0] : | array_flow.rb:947:10:947:25 | ...[...] | | array_flow.rb:947:10:947:22 | call to rassoc [element 0] : | 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 [element 0] : | -| array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:952:9:952:9 | a [element 0] : | -| array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:957:9:957:9 | a [element 0] : | -| array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:957:9:957:9 | a [element 0] : | -| array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:952:9:952:9 | a [element 2] : | -| array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:952:9:952:9 | a [element 2] : | -| array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:957:9:957:9 | a [element 2] : | -| array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:957:9:957:9 | a [element 2] : | +| array_flow.rb:951:5:951:5 | a [element 0] : | array_flow.rb:952:9:952:9 | a [element 0] : | +| array_flow.rb:951:5:951:5 | a [element 0] : | array_flow.rb:952:9:952:9 | a [element 0] : | +| array_flow.rb:951:5:951:5 | a [element 0] : | array_flow.rb:957:9:957:9 | a [element 0] : | +| array_flow.rb:951:5:951:5 | a [element 0] : | array_flow.rb:957:9:957:9 | a [element 0] : | +| array_flow.rb:951:5:951:5 | a [element 2] : | array_flow.rb:952:9:952:9 | a [element 2] : | +| array_flow.rb:951:5:951:5 | a [element 2] : | array_flow.rb:952:9:952:9 | a [element 2] : | +| array_flow.rb:951:5:951:5 | a [element 2] : | array_flow.rb:957:9:957:9 | a [element 2] : | +| array_flow.rb:951:5:951:5 | a [element 2] : | array_flow.rb:957:9:957:9 | a [element 2] : | +| array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:951:5:951:5 | a [element 0] : | +| array_flow.rb:951:10:951:21 | call to source : | array_flow.rb:951:5:951:5 | a [element 0] : | +| array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:951:5:951:5 | a [element 2] : | +| array_flow.rb:951:27:951:38 | call to source : | array_flow.rb:951:5:951:5 | a [element 2] : | | array_flow.rb:952:9:952:9 | a [element 0] : | array_flow.rb:952:22:952:22 | x : | | array_flow.rb:952:9:952:9 | a [element 0] : | array_flow.rb:952:22:952:22 | x : | | array_flow.rb:952:9:952:9 | a [element 2] : | array_flow.rb:952:25:952:25 | y : | @@ -1719,20 +2158,28 @@ edges | array_flow.rb:957:9:957:9 | a [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 [element 2] : | -| array_flow.rb:965:16:965:25 | call to source : | array_flow.rb:966:9:966:9 | a [element 2] : | +| array_flow.rb:965:5:965:5 | a [element 2] : | array_flow.rb:966:9:966:9 | a [element 2] : | +| array_flow.rb:965:5:965:5 | a [element 2] : | array_flow.rb:966:9:966:9 | a [element 2] : | +| array_flow.rb:965:16:965:25 | call to source : | array_flow.rb:965:5:965:5 | a [element 2] : | +| array_flow.rb:965:16:965:25 | call to source : | array_flow.rb:965:5:965:5 | a [element 2] : | +| array_flow.rb:966:5:966:5 | b [element] : | array_flow.rb:970:10:970:10 | b [element] : | +| array_flow.rb:966:5:966:5 | b [element] : | array_flow.rb:970:10:970:10 | b [element] : | | array_flow.rb:966:9:966:9 | a [element 2] : | array_flow.rb:966:9:969:7 | call to reject [element] : | | array_flow.rb:966:9:966:9 | a [element 2] : | array_flow.rb:966:9:969:7 | call to reject [element] : | | array_flow.rb:966:9:966:9 | a [element 2] : | array_flow.rb:966:22:966:22 | x : | | array_flow.rb:966:9:966:9 | a [element 2] : | array_flow.rb:966:22:966:22 | x : | -| array_flow.rb:966:9:969:7 | call to reject [element] : | array_flow.rb:970:10:970:10 | b [element] : | -| array_flow.rb:966:9:969:7 | call to reject [element] : | array_flow.rb:970:10:970:10 | b [element] : | +| array_flow.rb:966:9:969:7 | call to reject [element] : | array_flow.rb:966:5:966:5 | b [element] : | +| array_flow.rb:966:9:969:7 | call to reject [element] : | array_flow.rb:966:5:966:5 | b [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 [element] : | array_flow.rb:970:10:970:13 | ...[...] | | array_flow.rb:970:10:970:10 | b [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 [element 2] : | -| array_flow.rb:974:16:974:25 | call to source : | array_flow.rb:975:9:975:9 | a [element 2] : | +| array_flow.rb:974:5:974:5 | a [element 2] : | array_flow.rb:975:9:975:9 | a [element 2] : | +| array_flow.rb:974:5:974:5 | a [element 2] : | array_flow.rb:975:9:975:9 | a [element 2] : | +| array_flow.rb:974:16:974:25 | call to source : | array_flow.rb:974:5:974:5 | a [element 2] : | +| array_flow.rb:974:16:974:25 | call to source : | array_flow.rb:974:5:974:5 | a [element 2] : | +| array_flow.rb:975:5:975:5 | b [element] : | array_flow.rb:980:10:980:10 | b [element] : | +| array_flow.rb:975:5:975:5 | b [element] : | array_flow.rb:980:10:980:10 | b [element] : | | array_flow.rb:975:9:975:9 | [post] a [element] : | array_flow.rb:979:10:979:10 | a [element] : | | array_flow.rb:975:9:975:9 | [post] a [element] : | array_flow.rb:979:10:979:10 | a [element] : | | array_flow.rb:975:9:975:9 | a [element 2] : | array_flow.rb:975:9:975:9 | [post] a [element] : | @@ -1741,22 +2188,26 @@ edges | array_flow.rb:975:9:975:9 | a [element 2] : | array_flow.rb:975:9:978:7 | call to reject! [element] : | | array_flow.rb:975:9:975:9 | a [element 2] : | array_flow.rb:975:23:975:23 | x : | | array_flow.rb:975:9:975:9 | a [element 2] : | array_flow.rb:975:23:975:23 | x : | -| array_flow.rb:975:9:978:7 | call to reject! [element] : | array_flow.rb:980:10:980:10 | b [element] : | -| array_flow.rb:975:9:978:7 | call to reject! [element] : | array_flow.rb:980:10:980:10 | b [element] : | +| array_flow.rb:975:9:978:7 | call to reject! [element] : | array_flow.rb:975:5:975:5 | b [element] : | +| array_flow.rb:975:9:978:7 | call to reject! [element] : | array_flow.rb:975:5:975:5 | b [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 [element] : | array_flow.rb:979:10:979:13 | ...[...] | | array_flow.rb:979:10:979:10 | a [element] : | array_flow.rb:979:10:979:13 | ...[...] | | array_flow.rb:980:10:980:10 | b [element] : | array_flow.rb:980:10:980:13 | ...[...] | | array_flow.rb:980:10:980:10 | b [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 [element 2] : | -| array_flow.rb:984:16:984:25 | call to source : | array_flow.rb:985:9:985:9 | a [element 2] : | +| array_flow.rb:984:5:984:5 | a [element 2] : | array_flow.rb:985:9:985:9 | a [element 2] : | +| array_flow.rb:984:5:984:5 | a [element 2] : | array_flow.rb:985:9:985:9 | a [element 2] : | +| array_flow.rb:984:16:984:25 | call to source : | array_flow.rb:984:5:984:5 | a [element 2] : | +| array_flow.rb:984:16:984:25 | call to source : | array_flow.rb:984:5:984:5 | a [element 2] : | +| array_flow.rb:985:5:985:5 | b [element 2] : | array_flow.rb:990:10:990:10 | b [element 2] : | +| array_flow.rb:985:5:985:5 | b [element 2] : | array_flow.rb:990:10:990:10 | b [element 2] : | | array_flow.rb:985:9:985:9 | a [element 2] : | array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] : | | array_flow.rb:985:9:985:9 | a [element 2] : | array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] : | | array_flow.rb:985:9:985:9 | a [element 2] : | array_flow.rb:985:39:985:39 | x [element] : | | array_flow.rb:985:9:985:9 | a [element 2] : | array_flow.rb:985:39:985:39 | x [element] : | -| array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] : | array_flow.rb:990:10:990:10 | b [element 2] : | -| array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] : | array_flow.rb:990:10:990:10 | b [element 2] : | +| array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] : | array_flow.rb:985:5:985:5 | b [element 2] : | +| array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] : | array_flow.rb:985:5:985:5 | b [element 2] : | | array_flow.rb:985:39:985:39 | x [element] : | array_flow.rb:986:14:986:14 | x [element] : | | array_flow.rb:985:39:985:39 | x [element] : | array_flow.rb:986:14:986:14 | x [element] : | | array_flow.rb:985:39:985:39 | x [element] : | array_flow.rb:987:14:987:14 | x [element] : | @@ -1767,14 +2218,18 @@ edges | array_flow.rb:987:14:987:14 | x [element] : | array_flow.rb:987:14:987:17 | ...[...] | | array_flow.rb:990:10:990:10 | b [element 2] : | array_flow.rb:990:10:990:13 | ...[...] | | array_flow.rb:990:10:990:10 | b [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 [element 2] : | -| array_flow.rb:994:16:994:25 | call to source : | array_flow.rb:995:9:995:9 | a [element 2] : | +| array_flow.rb:994:5:994:5 | a [element 2] : | array_flow.rb:995:9:995:9 | a [element 2] : | +| array_flow.rb:994:5:994:5 | a [element 2] : | array_flow.rb:995:9:995:9 | a [element 2] : | +| array_flow.rb:994:16:994:25 | call to source : | array_flow.rb:994:5:994:5 | a [element 2] : | +| array_flow.rb:994:16:994:25 | call to source : | array_flow.rb:994:5:994:5 | a [element 2] : | +| array_flow.rb:995:5:995:5 | b [element 2] : | array_flow.rb:1000:10:1000:10 | b [element 2] : | +| array_flow.rb:995:5:995:5 | b [element 2] : | array_flow.rb:1000:10:1000:10 | b [element 2] : | | array_flow.rb:995:9:995:9 | a [element 2] : | array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] : | | array_flow.rb:995:9:995:9 | a [element 2] : | array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] : | | array_flow.rb:995:9:995:9 | a [element 2] : | array_flow.rb:995:39:995:39 | x [element] : | | array_flow.rb:995:9:995:9 | a [element 2] : | array_flow.rb:995:39:995:39 | x [element] : | -| array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] : | array_flow.rb:1000:10:1000:10 | b [element 2] : | -| array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] : | array_flow.rb:1000:10:1000:10 | b [element 2] : | +| array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] : | array_flow.rb:995:5:995:5 | b [element 2] : | +| array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] : | array_flow.rb:995:5:995:5 | b [element 2] : | | array_flow.rb:995:39:995:39 | x [element] : | array_flow.rb:996:14:996:14 | x [element] : | | array_flow.rb:995:39:995:39 | x [element] : | array_flow.rb:996:14:996:14 | x [element] : | | array_flow.rb:995:39:995:39 | x [element] : | array_flow.rb:997:14:997:14 | x [element] : | @@ -1785,10 +2240,12 @@ edges | array_flow.rb:997:14:997:14 | x [element] : | array_flow.rb:997:14:997:17 | ...[...] | | array_flow.rb:1000:10:1000:10 | b [element 2] : | array_flow.rb:1000:10:1000:13 | ...[...] | | array_flow.rb:1000:10:1000:10 | b [element 2] : | array_flow.rb:1000:10:1000:13 | ...[...] | +| array_flow.rb:1006:5:1006:5 | b [element 0] : | array_flow.rb:1008:10:1008:10 | b [element 0] : | +| array_flow.rb:1006:5:1006:5 | b [element 0] : | array_flow.rb:1008:10:1008:10 | b [element 0] : | | array_flow.rb:1006:9:1006:9 | [post] a [element 0] : | array_flow.rb:1007:10:1007:10 | a [element 0] : | | array_flow.rb:1006:9:1006:9 | [post] a [element 0] : | array_flow.rb:1007:10:1007:10 | a [element 0] : | -| array_flow.rb:1006:9:1006:33 | call to replace [element 0] : | array_flow.rb:1008:10:1008:10 | b [element 0] : | -| array_flow.rb:1006:9:1006:33 | call to replace [element 0] : | array_flow.rb:1008:10:1008:10 | b [element 0] : | +| array_flow.rb:1006:9:1006:33 | call to replace [element 0] : | array_flow.rb:1006:5:1006:5 | b [element 0] : | +| array_flow.rb:1006:9:1006:33 | call to replace [element 0] : | array_flow.rb:1006:5:1006:5 | b [element 0] : | | array_flow.rb:1006:20:1006:31 | call to source : | array_flow.rb:1006:9:1006:9 | [post] a [element 0] : | | array_flow.rb:1006:20:1006:31 | call to source : | array_flow.rb:1006:9:1006:9 | [post] a [element 0] : | | array_flow.rb:1006:20:1006:31 | call to source : | array_flow.rb:1006:9:1006:33 | call to replace [element 0] : | @@ -1797,24 +2254,30 @@ edges | array_flow.rb:1007:10:1007:10 | a [element 0] : | array_flow.rb:1007:10:1007:13 | ...[...] | | array_flow.rb:1008:10:1008:10 | b [element 0] : | array_flow.rb:1008:10:1008:13 | ...[...] | | array_flow.rb:1008:10:1008:10 | b [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 [element 2] : | -| array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1013:9:1013:9 | a [element 2] : | -| array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1018:10:1018:10 | a [element 2] : | -| array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1018:10:1018:10 | a [element 2] : | -| array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1013:9:1013:9 | a [element 3] : | -| array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1013:9:1013:9 | a [element 3] : | -| array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1019:10:1019:10 | a [element 3] : | -| array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1019:10:1019:10 | a [element 3] : | +| array_flow.rb:1012:5:1012:5 | a [element 2] : | array_flow.rb:1013:9:1013:9 | a [element 2] : | +| array_flow.rb:1012:5:1012:5 | a [element 2] : | array_flow.rb:1013:9:1013:9 | a [element 2] : | +| array_flow.rb:1012:5:1012:5 | a [element 2] : | array_flow.rb:1018:10:1018:10 | a [element 2] : | +| array_flow.rb:1012:5:1012:5 | a [element 2] : | array_flow.rb:1018:10:1018:10 | a [element 2] : | +| array_flow.rb:1012:5:1012:5 | a [element 3] : | array_flow.rb:1013:9:1013:9 | a [element 3] : | +| array_flow.rb:1012:5:1012:5 | a [element 3] : | array_flow.rb:1013:9:1013:9 | a [element 3] : | +| array_flow.rb:1012:5:1012:5 | a [element 3] : | array_flow.rb:1019:10:1019:10 | a [element 3] : | +| array_flow.rb:1012:5:1012:5 | a [element 3] : | array_flow.rb:1019:10:1019:10 | a [element 3] : | +| array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1012:5:1012:5 | a [element 2] : | +| array_flow.rb:1012:16:1012:28 | call to source : | array_flow.rb:1012:5:1012:5 | a [element 2] : | +| array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1012:5:1012:5 | a [element 3] : | +| array_flow.rb:1012:31:1012:43 | call to source : | array_flow.rb:1012:5:1012:5 | a [element 3] : | +| array_flow.rb:1013:5:1013:5 | b [element] : | array_flow.rb:1014:10:1014:10 | b [element] : | +| array_flow.rb:1013:5:1013:5 | b [element] : | array_flow.rb:1014:10:1014:10 | b [element] : | +| array_flow.rb:1013:5:1013:5 | b [element] : | array_flow.rb:1015:10:1015:10 | b [element] : | +| array_flow.rb:1013:5:1013:5 | b [element] : | array_flow.rb:1015:10:1015:10 | b [element] : | +| array_flow.rb:1013:5:1013:5 | b [element] : | array_flow.rb:1016:10:1016:10 | b [element] : | +| array_flow.rb:1013:5:1013:5 | b [element] : | array_flow.rb:1016:10:1016:10 | b [element] : | | array_flow.rb:1013:9:1013:9 | a [element 2] : | array_flow.rb:1013:9:1013:17 | call to reverse [element] : | | array_flow.rb:1013:9:1013:9 | a [element 2] : | array_flow.rb:1013:9:1013:17 | call to reverse [element] : | | array_flow.rb:1013:9:1013:9 | a [element 3] : | array_flow.rb:1013:9:1013:17 | call to reverse [element] : | | array_flow.rb:1013:9:1013:9 | a [element 3] : | array_flow.rb:1013:9:1013:17 | call to reverse [element] : | -| array_flow.rb:1013:9:1013:17 | call to reverse [element] : | array_flow.rb:1014:10:1014:10 | b [element] : | -| array_flow.rb:1013:9:1013:17 | call to reverse [element] : | array_flow.rb:1014:10:1014:10 | b [element] : | -| array_flow.rb:1013:9:1013:17 | call to reverse [element] : | array_flow.rb:1015:10:1015:10 | b [element] : | -| array_flow.rb:1013:9:1013:17 | call to reverse [element] : | array_flow.rb:1015:10:1015:10 | b [element] : | -| array_flow.rb:1013:9:1013:17 | call to reverse [element] : | array_flow.rb:1016:10:1016:10 | b [element] : | -| array_flow.rb:1013:9:1013:17 | call to reverse [element] : | array_flow.rb:1016:10:1016:10 | b [element] : | +| array_flow.rb:1013:9:1013:17 | call to reverse [element] : | array_flow.rb:1013:5:1013:5 | b [element] : | +| array_flow.rb:1013:9:1013:17 | call to reverse [element] : | array_flow.rb:1013:5:1013:5 | b [element] : | | array_flow.rb:1014:10:1014:10 | b [element] : | array_flow.rb:1014:10:1014:13 | ...[...] | | array_flow.rb:1014:10:1014:10 | b [element] : | array_flow.rb:1014:10:1014:13 | ...[...] | | array_flow.rb:1015:10:1015:10 | b [element] : | array_flow.rb:1015:10:1015:13 | ...[...] | @@ -1825,14 +2288,24 @@ edges | array_flow.rb:1018:10:1018:10 | a [element 2] : | array_flow.rb:1018:10:1018:13 | ...[...] | | array_flow.rb:1019:10:1019:10 | a [element 3] : | array_flow.rb:1019:10:1019:13 | ...[...] | | array_flow.rb:1019:10:1019:10 | a [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 [element 2] : | -| array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1024:9:1024:9 | a [element 2] : | -| array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1029:10:1029:10 | a [element 2] : | -| array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1029:10:1029:10 | a [element 2] : | -| array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1024:9:1024:9 | a [element 3] : | -| array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1024:9:1024:9 | a [element 3] : | -| array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1030:10:1030:10 | a [element 3] : | -| array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1030:10:1030:10 | a [element 3] : | +| array_flow.rb:1023:5:1023:5 | a [element 2] : | array_flow.rb:1024:9:1024:9 | a [element 2] : | +| array_flow.rb:1023:5:1023:5 | a [element 2] : | array_flow.rb:1024:9:1024:9 | a [element 2] : | +| array_flow.rb:1023:5:1023:5 | a [element 2] : | array_flow.rb:1029:10:1029:10 | a [element 2] : | +| array_flow.rb:1023:5:1023:5 | a [element 2] : | array_flow.rb:1029:10:1029:10 | a [element 2] : | +| array_flow.rb:1023:5:1023:5 | a [element 3] : | array_flow.rb:1024:9:1024:9 | a [element 3] : | +| array_flow.rb:1023:5:1023:5 | a [element 3] : | array_flow.rb:1024:9:1024:9 | a [element 3] : | +| array_flow.rb:1023:5:1023:5 | a [element 3] : | array_flow.rb:1030:10:1030:10 | a [element 3] : | +| array_flow.rb:1023:5:1023:5 | a [element 3] : | array_flow.rb:1030:10:1030:10 | a [element 3] : | +| array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1023:5:1023:5 | a [element 2] : | +| array_flow.rb:1023:16:1023:28 | call to source : | array_flow.rb:1023:5:1023:5 | a [element 2] : | +| array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1023:5:1023:5 | a [element 3] : | +| array_flow.rb:1023:31:1023:43 | call to source : | array_flow.rb:1023:5:1023:5 | a [element 3] : | +| array_flow.rb:1024:5:1024:5 | b [element] : | array_flow.rb:1025:10:1025:10 | b [element] : | +| array_flow.rb:1024:5:1024:5 | b [element] : | array_flow.rb:1025:10:1025:10 | b [element] : | +| array_flow.rb:1024:5:1024:5 | b [element] : | array_flow.rb:1026:10:1026:10 | b [element] : | +| array_flow.rb:1024:5:1024:5 | b [element] : | array_flow.rb:1026:10:1026:10 | b [element] : | +| array_flow.rb:1024:5:1024:5 | b [element] : | array_flow.rb:1027:10:1027:10 | b [element] : | +| array_flow.rb:1024:5:1024:5 | b [element] : | array_flow.rb:1027:10:1027:10 | b [element] : | | array_flow.rb:1024:9:1024:9 | [post] a [element] : | array_flow.rb:1028:10:1028:10 | a [element] : | | array_flow.rb:1024:9:1024:9 | [post] a [element] : | array_flow.rb:1028:10:1028:10 | a [element] : | | array_flow.rb:1024:9:1024:9 | [post] a [element] : | array_flow.rb:1029:10:1029:10 | a [element] : | @@ -1847,12 +2320,8 @@ edges | array_flow.rb:1024:9:1024:9 | a [element 3] : | array_flow.rb:1024:9:1024:9 | [post] a [element] : | | array_flow.rb:1024:9:1024:9 | a [element 3] : | array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | | array_flow.rb:1024:9:1024:9 | a [element 3] : | array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | -| array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | array_flow.rb:1025:10:1025:10 | b [element] : | -| array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | array_flow.rb:1025:10:1025:10 | b [element] : | -| array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | array_flow.rb:1026:10:1026:10 | b [element] : | -| array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | array_flow.rb:1026:10:1026:10 | b [element] : | -| array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | array_flow.rb:1027:10:1027:10 | b [element] : | -| array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | array_flow.rb:1027:10:1027:10 | b [element] : | +| array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | array_flow.rb:1024:5:1024:5 | b [element] : | +| array_flow.rb:1024:9:1024:18 | call to reverse! [element] : | array_flow.rb:1024:5:1024:5 | b [element] : | | array_flow.rb:1025:10:1025:10 | b [element] : | array_flow.rb:1025:10:1025:13 | ...[...] | | array_flow.rb:1025:10:1025:10 | b [element] : | array_flow.rb:1025:10:1025:13 | ...[...] | | array_flow.rb:1026:10:1026:10 | b [element] : | array_flow.rb:1026:10:1026:13 | ...[...] | @@ -1869,66 +2338,84 @@ edges | array_flow.rb:1030:10:1030:10 | a [element 3] : | array_flow.rb:1030:10:1030:13 | ...[...] | | array_flow.rb:1030:10:1030:10 | a [element] : | array_flow.rb:1030:10:1030:13 | ...[...] | | array_flow.rb:1030:10:1030:10 | a [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 [element 2] : | -| array_flow.rb:1034:16:1034:26 | call to source : | array_flow.rb:1035:9:1035:9 | a [element 2] : | +| array_flow.rb:1034:5:1034:5 | a [element 2] : | array_flow.rb:1035:9:1035:9 | a [element 2] : | +| array_flow.rb:1034:5:1034:5 | a [element 2] : | array_flow.rb:1035:9:1035:9 | a [element 2] : | +| array_flow.rb:1034:16:1034:26 | call to source : | array_flow.rb:1034:5:1034:5 | a [element 2] : | +| array_flow.rb:1034:16:1034:26 | call to source : | array_flow.rb:1034:5:1034:5 | a [element 2] : | +| array_flow.rb:1035:5:1035:5 | b [element 2] : | array_flow.rb:1038:10:1038:10 | b [element 2] : | +| array_flow.rb:1035:5:1035:5 | b [element 2] : | array_flow.rb:1038:10:1038:10 | b [element 2] : | | array_flow.rb:1035:9:1035:9 | a [element 2] : | array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] : | | array_flow.rb:1035:9:1035:9 | a [element 2] : | array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] : | | array_flow.rb:1035:9:1035:9 | a [element 2] : | array_flow.rb:1035:28:1035:28 | x : | | array_flow.rb:1035:9:1035:9 | a [element 2] : | array_flow.rb:1035:28:1035:28 | x : | -| array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] : | array_flow.rb:1038:10:1038:10 | b [element 2] : | -| array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] : | array_flow.rb:1038:10:1038:10 | b [element 2] : | +| array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] : | array_flow.rb:1035:5:1035:5 | b [element 2] : | +| array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] : | array_flow.rb:1035:5:1035:5 | b [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 [element 2] : | array_flow.rb:1038:10:1038:13 | ...[...] | | array_flow.rb:1038:10:1038:10 | b [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 [element 2] : | -| array_flow.rb:1042:16:1042:26 | call to source : | array_flow.rb:1043:5:1043:5 | a [element 2] : | +| array_flow.rb:1042:5:1042:5 | a [element 2] : | array_flow.rb:1043:5:1043:5 | a [element 2] : | +| array_flow.rb:1042:5:1042:5 | a [element 2] : | array_flow.rb:1043:5:1043:5 | a [element 2] : | +| array_flow.rb:1042:16:1042:26 | call to source : | array_flow.rb:1042:5:1042:5 | a [element 2] : | +| array_flow.rb:1042:16:1042:26 | call to source : | array_flow.rb:1042:5:1042:5 | a [element 2] : | | array_flow.rb:1043:5:1043:5 | a [element 2] : | array_flow.rb:1043:18:1043:18 | x : | | array_flow.rb:1043:5:1043:5 | a [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 [element 0] : | -| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1054:9:1054:9 | a [element 0] : | -| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1060:9:1060:9 | a [element 0] : | -| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1060:9:1060:9 | a [element 0] : | -| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1066:9:1066:9 | a [element 0] : | -| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1066:9:1066:9 | a [element 0] : | -| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1072:9:1072:9 | a [element 0] : | -| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1072:9:1072:9 | a [element 0] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1054:9:1054:9 | a [element 2] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1054:9:1054:9 | a [element 2] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1060:9:1060:9 | a [element 2] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1060:9:1060:9 | a [element 2] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1066:9:1066:9 | a [element 2] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1066:9:1066:9 | a [element 2] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1072:9:1072:9 | a [element 2] : | -| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1072:9:1072:9 | a [element 2] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1054:9:1054:9 | a [element 3] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1054:9:1054:9 | a [element 3] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1060:9:1060:9 | a [element 3] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1060:9:1060:9 | a [element 3] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1066:9:1066:9 | a [element 3] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1066:9:1066:9 | a [element 3] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1072:9:1072:9 | a [element 3] : | -| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1072:9:1072:9 | a [element 3] : | +| array_flow.rb:1052:5:1052:5 | a [element 0] : | array_flow.rb:1054:9:1054:9 | a [element 0] : | +| array_flow.rb:1052:5:1052:5 | a [element 0] : | array_flow.rb:1054:9:1054:9 | a [element 0] : | +| array_flow.rb:1052:5:1052:5 | a [element 0] : | array_flow.rb:1060:9:1060:9 | a [element 0] : | +| array_flow.rb:1052:5:1052:5 | a [element 0] : | array_flow.rb:1060:9:1060:9 | a [element 0] : | +| array_flow.rb:1052:5:1052:5 | a [element 0] : | array_flow.rb:1066:9:1066:9 | a [element 0] : | +| array_flow.rb:1052:5:1052:5 | a [element 0] : | array_flow.rb:1066:9:1066:9 | a [element 0] : | +| array_flow.rb:1052:5:1052:5 | a [element 0] : | array_flow.rb:1072:9:1072:9 | a [element 0] : | +| array_flow.rb:1052:5:1052:5 | a [element 0] : | array_flow.rb:1072:9:1072:9 | a [element 0] : | +| array_flow.rb:1052:5:1052:5 | a [element 2] : | array_flow.rb:1054:9:1054:9 | a [element 2] : | +| array_flow.rb:1052:5:1052:5 | a [element 2] : | array_flow.rb:1054:9:1054:9 | a [element 2] : | +| array_flow.rb:1052:5:1052:5 | a [element 2] : | array_flow.rb:1060:9:1060:9 | a [element 2] : | +| array_flow.rb:1052:5:1052:5 | a [element 2] : | array_flow.rb:1060:9:1060:9 | a [element 2] : | +| array_flow.rb:1052:5:1052:5 | a [element 2] : | array_flow.rb:1066:9:1066:9 | a [element 2] : | +| array_flow.rb:1052:5:1052:5 | a [element 2] : | array_flow.rb:1066:9:1066:9 | a [element 2] : | +| array_flow.rb:1052:5:1052:5 | a [element 2] : | array_flow.rb:1072:9:1072:9 | a [element 2] : | +| array_flow.rb:1052:5:1052:5 | a [element 2] : | array_flow.rb:1072:9:1072:9 | a [element 2] : | +| array_flow.rb:1052:5:1052:5 | a [element 3] : | array_flow.rb:1054:9:1054:9 | a [element 3] : | +| array_flow.rb:1052:5:1052:5 | a [element 3] : | array_flow.rb:1054:9:1054:9 | a [element 3] : | +| array_flow.rb:1052:5:1052:5 | a [element 3] : | array_flow.rb:1060:9:1060:9 | a [element 3] : | +| array_flow.rb:1052:5:1052:5 | a [element 3] : | array_flow.rb:1060:9:1060:9 | a [element 3] : | +| array_flow.rb:1052:5:1052:5 | a [element 3] : | array_flow.rb:1066:9:1066:9 | a [element 3] : | +| array_flow.rb:1052:5:1052:5 | a [element 3] : | array_flow.rb:1066:9:1066:9 | a [element 3] : | +| array_flow.rb:1052:5:1052:5 | a [element 3] : | array_flow.rb:1072:9:1072:9 | a [element 3] : | +| array_flow.rb:1052:5:1052:5 | a [element 3] : | array_flow.rb:1072:9:1072:9 | a [element 3] : | +| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1052:5:1052:5 | a [element 0] : | +| array_flow.rb:1052:10:1052:22 | call to source : | array_flow.rb:1052:5:1052:5 | a [element 0] : | +| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1052:5:1052:5 | a [element 2] : | +| array_flow.rb:1052:28:1052:40 | call to source : | array_flow.rb:1052:5:1052:5 | a [element 2] : | +| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1052:5:1052:5 | a [element 3] : | +| array_flow.rb:1052:43:1052:55 | call to source : | array_flow.rb:1052:5:1052:5 | a [element 3] : | +| array_flow.rb:1054:5:1054:5 | b [element 1] : | array_flow.rb:1056:10:1056:10 | b [element 1] : | +| array_flow.rb:1054:5:1054:5 | b [element 1] : | array_flow.rb:1056:10:1056:10 | b [element 1] : | +| array_flow.rb:1054:5:1054:5 | b [element 2] : | array_flow.rb:1057:10:1057:10 | b [element 2] : | +| array_flow.rb:1054:5:1054:5 | b [element 2] : | array_flow.rb:1057:10:1057:10 | b [element 2] : | +| array_flow.rb:1054:5:1054:5 | b [element] : | array_flow.rb:1055:10:1055:10 | b [element] : | +| array_flow.rb:1054:5:1054:5 | b [element] : | array_flow.rb:1055:10:1055:10 | b [element] : | +| array_flow.rb:1054:5:1054:5 | b [element] : | array_flow.rb:1056:10:1056:10 | b [element] : | +| array_flow.rb:1054:5:1054:5 | b [element] : | array_flow.rb:1056:10:1056:10 | b [element] : | +| array_flow.rb:1054:5:1054:5 | b [element] : | array_flow.rb:1057:10:1057:10 | b [element] : | +| array_flow.rb:1054:5:1054:5 | b [element] : | array_flow.rb:1057:10:1057:10 | b [element] : | +| array_flow.rb:1054:5:1054:5 | b [element] : | array_flow.rb:1058:10:1058:10 | b [element] : | +| array_flow.rb:1054:5:1054:5 | b [element] : | array_flow.rb:1058:10:1058:10 | b [element] : | | array_flow.rb:1054:9:1054:9 | a [element 0] : | array_flow.rb:1054:9:1054:16 | call to rotate [element] : | | array_flow.rb:1054:9:1054:9 | a [element 0] : | array_flow.rb:1054:9:1054:16 | call to rotate [element] : | | array_flow.rb:1054:9:1054:9 | a [element 2] : | array_flow.rb:1054:9:1054:16 | call to rotate [element 1] : | | array_flow.rb:1054:9:1054:9 | a [element 2] : | array_flow.rb:1054:9:1054:16 | call to rotate [element 1] : | | array_flow.rb:1054:9:1054:9 | a [element 3] : | array_flow.rb:1054:9:1054:16 | call to rotate [element 2] : | | array_flow.rb:1054:9:1054:9 | a [element 3] : | array_flow.rb:1054:9:1054:16 | call to rotate [element 2] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element 1] : | array_flow.rb:1056:10:1056:10 | b [element 1] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element 1] : | array_flow.rb:1056:10:1056:10 | b [element 1] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element 2] : | array_flow.rb:1057:10:1057:10 | b [element 2] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element 2] : | array_flow.rb:1057:10:1057:10 | b [element 2] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1055:10:1055:10 | b [element] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1055:10:1055:10 | b [element] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1056:10:1056:10 | b [element] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1056:10:1056:10 | b [element] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1057:10:1057:10 | b [element] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1057:10:1057:10 | b [element] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1058:10:1058:10 | b [element] : | -| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1058:10:1058:10 | b [element] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [element 1] : | array_flow.rb:1054:5:1054:5 | b [element 1] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [element 1] : | array_flow.rb:1054:5:1054:5 | b [element 1] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [element 2] : | array_flow.rb:1054:5:1054:5 | b [element 2] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [element 2] : | array_flow.rb:1054:5:1054:5 | b [element 2] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1054:5:1054:5 | b [element] : | +| array_flow.rb:1054:9:1054:16 | call to rotate [element] : | array_flow.rb:1054:5:1054:5 | b [element] : | | array_flow.rb:1055:10:1055:10 | b [element] : | array_flow.rb:1055:10:1055:13 | ...[...] | | array_flow.rb:1055:10:1055:10 | b [element] : | array_flow.rb:1055:10:1055:13 | ...[...] | | array_flow.rb:1056:10:1056:10 | b [element 1] : | array_flow.rb:1056:10:1056:13 | ...[...] | @@ -1941,24 +2428,30 @@ edges | array_flow.rb:1057:10:1057:10 | b [element] : | array_flow.rb:1057:10:1057:13 | ...[...] | | array_flow.rb:1058:10:1058:10 | b [element] : | array_flow.rb:1058:10:1058:13 | ...[...] | | array_flow.rb:1058:10:1058:10 | b [element] : | array_flow.rb:1058:10:1058:13 | ...[...] | +| array_flow.rb:1060:5:1060:5 | b [element 0] : | array_flow.rb:1061:10:1061:10 | b [element 0] : | +| array_flow.rb:1060:5:1060:5 | b [element 0] : | array_flow.rb:1061:10:1061:10 | b [element 0] : | +| array_flow.rb:1060:5:1060:5 | b [element 1] : | array_flow.rb:1062:10:1062:10 | b [element 1] : | +| array_flow.rb:1060:5:1060:5 | b [element 1] : | array_flow.rb:1062:10:1062:10 | b [element 1] : | +| array_flow.rb:1060:5:1060:5 | b [element] : | array_flow.rb:1061:10:1061:10 | b [element] : | +| array_flow.rb:1060:5:1060:5 | b [element] : | array_flow.rb:1061:10:1061:10 | b [element] : | +| array_flow.rb:1060:5:1060:5 | b [element] : | array_flow.rb:1062:10:1062:10 | b [element] : | +| array_flow.rb:1060:5:1060:5 | b [element] : | array_flow.rb:1062:10:1062:10 | b [element] : | +| array_flow.rb:1060:5:1060:5 | b [element] : | array_flow.rb:1063:10:1063:10 | b [element] : | +| array_flow.rb:1060:5:1060:5 | b [element] : | array_flow.rb:1063:10:1063:10 | b [element] : | +| array_flow.rb:1060:5:1060:5 | b [element] : | array_flow.rb:1064:10:1064:10 | b [element] : | +| array_flow.rb:1060:5:1060:5 | b [element] : | array_flow.rb:1064:10:1064:10 | b [element] : | | array_flow.rb:1060:9:1060:9 | a [element 0] : | array_flow.rb:1060:9:1060:19 | call to rotate [element] : | | array_flow.rb:1060:9:1060:9 | a [element 0] : | array_flow.rb:1060:9:1060:19 | call to rotate [element] : | | array_flow.rb:1060:9:1060:9 | a [element 2] : | array_flow.rb:1060:9:1060:19 | call to rotate [element 0] : | | array_flow.rb:1060:9:1060:9 | a [element 2] : | array_flow.rb:1060:9:1060:19 | call to rotate [element 0] : | | array_flow.rb:1060:9:1060:9 | a [element 3] : | array_flow.rb:1060:9:1060:19 | call to rotate [element 1] : | | array_flow.rb:1060:9:1060:9 | a [element 3] : | array_flow.rb:1060:9:1060:19 | call to rotate [element 1] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element 0] : | array_flow.rb:1061:10:1061:10 | b [element 0] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element 0] : | array_flow.rb:1061:10:1061:10 | b [element 0] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element 1] : | array_flow.rb:1062:10:1062:10 | b [element 1] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element 1] : | array_flow.rb:1062:10:1062:10 | b [element 1] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1061:10:1061:10 | b [element] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1061:10:1061:10 | b [element] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1062:10:1062:10 | b [element] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1062:10:1062:10 | b [element] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1063:10:1063:10 | b [element] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1063:10:1063:10 | b [element] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1064:10:1064:10 | b [element] : | -| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1064:10:1064:10 | b [element] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [element 0] : | array_flow.rb:1060:5:1060:5 | b [element 0] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [element 0] : | array_flow.rb:1060:5:1060:5 | b [element 0] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [element 1] : | array_flow.rb:1060:5:1060:5 | b [element 1] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [element 1] : | array_flow.rb:1060:5:1060:5 | b [element 1] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1060:5:1060:5 | b [element] : | +| array_flow.rb:1060:9:1060:19 | call to rotate [element] : | array_flow.rb:1060:5:1060:5 | b [element] : | | array_flow.rb:1061:10:1061:10 | b [element 0] : | array_flow.rb:1061:10:1061:13 | ...[...] | | array_flow.rb:1061:10:1061:10 | b [element 0] : | array_flow.rb:1061:10:1061:13 | ...[...] | | array_flow.rb:1061:10:1061:10 | b [element] : | array_flow.rb:1061:10:1061:13 | ...[...] | @@ -1971,38 +2464,46 @@ edges | array_flow.rb:1063:10:1063:10 | b [element] : | array_flow.rb:1063:10:1063:13 | ...[...] | | array_flow.rb:1064:10:1064:10 | b [element] : | array_flow.rb:1064:10:1064:13 | ...[...] | | array_flow.rb:1064:10:1064:10 | b [element] : | array_flow.rb:1064:10:1064:13 | ...[...] | +| array_flow.rb:1066:5:1066:5 | b [element 0] : | array_flow.rb:1067:10:1067:10 | b [element 0] : | +| array_flow.rb:1066:5:1066:5 | b [element 0] : | array_flow.rb:1067:10:1067:10 | b [element 0] : | +| array_flow.rb:1066:5:1066:5 | b [element 2] : | array_flow.rb:1069:10:1069:10 | b [element 2] : | +| array_flow.rb:1066:5:1066:5 | b [element 2] : | array_flow.rb:1069:10:1069:10 | b [element 2] : | +| array_flow.rb:1066:5:1066:5 | b [element 3] : | array_flow.rb:1070:10:1070:10 | b [element 3] : | +| array_flow.rb:1066:5:1066:5 | b [element 3] : | array_flow.rb:1070:10:1070:10 | b [element 3] : | | array_flow.rb:1066:9:1066:9 | a [element 0] : | array_flow.rb:1066:9:1066:19 | call to rotate [element 0] : | | array_flow.rb:1066:9:1066:9 | a [element 0] : | array_flow.rb:1066:9:1066:19 | call to rotate [element 0] : | | array_flow.rb:1066:9:1066:9 | a [element 2] : | array_flow.rb:1066:9:1066:19 | call to rotate [element 2] : | | array_flow.rb:1066:9:1066:9 | a [element 2] : | array_flow.rb:1066:9:1066:19 | call to rotate [element 2] : | | array_flow.rb:1066:9:1066:9 | a [element 3] : | array_flow.rb:1066:9:1066:19 | call to rotate [element 3] : | | array_flow.rb:1066:9:1066:9 | a [element 3] : | array_flow.rb:1066:9:1066:19 | call to rotate [element 3] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 0] : | array_flow.rb:1067:10:1067:10 | b [element 0] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 0] : | array_flow.rb:1067:10:1067:10 | b [element 0] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 2] : | array_flow.rb:1069:10:1069:10 | b [element 2] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 2] : | array_flow.rb:1069:10:1069:10 | b [element 2] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 3] : | array_flow.rb:1070:10:1070:10 | b [element 3] : | -| array_flow.rb:1066:9:1066:19 | call to rotate [element 3] : | array_flow.rb:1070:10:1070:10 | b [element 3] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 0] : | array_flow.rb:1066:5:1066:5 | b [element 0] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 0] : | array_flow.rb:1066:5:1066:5 | b [element 0] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 2] : | array_flow.rb:1066:5:1066:5 | b [element 2] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 2] : | array_flow.rb:1066:5:1066:5 | b [element 2] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 3] : | array_flow.rb:1066:5:1066:5 | b [element 3] : | +| array_flow.rb:1066:9:1066:19 | call to rotate [element 3] : | array_flow.rb:1066:5:1066:5 | b [element 3] : | | array_flow.rb:1067:10:1067:10 | b [element 0] : | array_flow.rb:1067:10:1067:13 | ...[...] | | array_flow.rb:1067:10:1067:10 | b [element 0] : | array_flow.rb:1067:10:1067:13 | ...[...] | | array_flow.rb:1069:10:1069:10 | b [element 2] : | array_flow.rb:1069:10:1069:13 | ...[...] | | array_flow.rb:1069:10:1069:10 | b [element 2] : | array_flow.rb:1069:10:1069:13 | ...[...] | | array_flow.rb:1070:10:1070:10 | b [element 3] : | array_flow.rb:1070:10:1070:13 | ...[...] | | array_flow.rb:1070:10:1070:10 | b [element 3] : | array_flow.rb:1070:10:1070:13 | ...[...] | +| array_flow.rb:1072:5:1072:5 | b [element] : | array_flow.rb:1073:10:1073:10 | b [element] : | +| array_flow.rb:1072:5:1072:5 | b [element] : | array_flow.rb:1073:10:1073:10 | b [element] : | +| array_flow.rb:1072:5:1072:5 | b [element] : | array_flow.rb:1074:10:1074:10 | b [element] : | +| array_flow.rb:1072:5:1072:5 | b [element] : | array_flow.rb:1074:10:1074:10 | b [element] : | +| array_flow.rb:1072:5:1072:5 | b [element] : | array_flow.rb:1075:10:1075:10 | b [element] : | +| array_flow.rb:1072:5:1072:5 | b [element] : | array_flow.rb:1075:10:1075:10 | b [element] : | +| array_flow.rb:1072:5:1072:5 | b [element] : | array_flow.rb:1076:10:1076:10 | b [element] : | +| array_flow.rb:1072:5:1072:5 | b [element] : | array_flow.rb:1076:10:1076:10 | b [element] : | | array_flow.rb:1072:9:1072:9 | a [element 0] : | array_flow.rb:1072:9:1072:19 | call to rotate [element] : | | array_flow.rb:1072:9:1072:9 | a [element 0] : | array_flow.rb:1072:9:1072:19 | call to rotate [element] : | | array_flow.rb:1072:9:1072:9 | a [element 2] : | array_flow.rb:1072:9:1072:19 | call to rotate [element] : | | array_flow.rb:1072:9:1072:9 | a [element 2] : | array_flow.rb:1072:9:1072:19 | call to rotate [element] : | | array_flow.rb:1072:9:1072:9 | a [element 3] : | array_flow.rb:1072:9:1072:19 | call to rotate [element] : | | array_flow.rb:1072:9:1072:9 | a [element 3] : | array_flow.rb:1072:9:1072:19 | call to rotate [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1073:10:1073:10 | b [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1073:10:1073:10 | b [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1074:10:1074:10 | b [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1074:10:1074:10 | b [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1075:10:1075:10 | b [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1075:10:1075:10 | b [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1076:10:1076:10 | b [element] : | -| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1076:10:1076:10 | b [element] : | +| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1072:5:1072:5 | b [element] : | +| array_flow.rb:1072:9:1072:19 | call to rotate [element] : | array_flow.rb:1072:5:1072:5 | b [element] : | | array_flow.rb:1073:10:1073:10 | b [element] : | array_flow.rb:1073:10:1073:13 | ...[...] | | array_flow.rb:1073:10:1073:10 | b [element] : | array_flow.rb:1073:10:1073:13 | ...[...] | | array_flow.rb:1074:10:1074:10 | b [element] : | array_flow.rb:1074:10:1074:13 | ...[...] | @@ -2011,12 +2512,30 @@ edges | array_flow.rb:1075:10:1075:10 | b [element] : | array_flow.rb:1075:10:1075:13 | ...[...] | | array_flow.rb:1076:10:1076:10 | b [element] : | array_flow.rb:1076:10:1076:13 | ...[...] | | array_flow.rb:1076:10:1076:10 | b [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 [element 0] : | -| array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1085:9:1085:9 | a [element 0] : | -| array_flow.rb:1084:28:1084:40 | call to source : | array_flow.rb:1085:9:1085:9 | a [element 2] : | -| array_flow.rb:1084:28:1084:40 | call to source : | array_flow.rb:1085:9:1085:9 | a [element 2] : | -| array_flow.rb:1084:43:1084:55 | call to source : | array_flow.rb:1085:9:1085:9 | a [element 3] : | -| array_flow.rb:1084:43:1084:55 | call to source : | array_flow.rb:1085:9:1085:9 | a [element 3] : | +| array_flow.rb:1084:5:1084:5 | a [element 0] : | array_flow.rb:1085:9:1085:9 | a [element 0] : | +| array_flow.rb:1084:5:1084:5 | a [element 0] : | array_flow.rb:1085:9:1085:9 | a [element 0] : | +| array_flow.rb:1084:5:1084:5 | a [element 2] : | array_flow.rb:1085:9:1085:9 | a [element 2] : | +| array_flow.rb:1084:5:1084:5 | a [element 2] : | array_flow.rb:1085:9:1085:9 | a [element 2] : | +| array_flow.rb:1084:5:1084:5 | a [element 3] : | array_flow.rb:1085:9:1085:9 | a [element 3] : | +| array_flow.rb:1084:5:1084:5 | a [element 3] : | array_flow.rb:1085:9:1085:9 | a [element 3] : | +| array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1084:5:1084:5 | a [element 0] : | +| array_flow.rb:1084:10:1084:22 | call to source : | array_flow.rb:1084:5:1084:5 | a [element 0] : | +| array_flow.rb:1084:28:1084:40 | call to source : | array_flow.rb:1084:5:1084:5 | a [element 2] : | +| array_flow.rb:1084:28:1084:40 | call to source : | array_flow.rb:1084:5:1084:5 | a [element 2] : | +| array_flow.rb:1084:43:1084:55 | call to source : | array_flow.rb:1084:5:1084:5 | a [element 3] : | +| array_flow.rb:1084:43:1084:55 | call to source : | array_flow.rb:1084:5:1084:5 | a [element 3] : | +| array_flow.rb:1085:5:1085:5 | b [element 1] : | array_flow.rb:1091:10:1091:10 | b [element 1] : | +| array_flow.rb:1085:5:1085:5 | b [element 1] : | array_flow.rb:1091:10:1091:10 | b [element 1] : | +| array_flow.rb:1085:5:1085:5 | b [element 2] : | array_flow.rb:1092:10:1092:10 | b [element 2] : | +| array_flow.rb:1085:5:1085:5 | b [element 2] : | array_flow.rb:1092:10:1092:10 | b [element 2] : | +| array_flow.rb:1085:5:1085:5 | b [element] : | array_flow.rb:1090:10:1090:10 | b [element] : | +| array_flow.rb:1085:5:1085:5 | b [element] : | array_flow.rb:1090:10:1090:10 | b [element] : | +| array_flow.rb:1085:5:1085:5 | b [element] : | array_flow.rb:1091:10:1091:10 | b [element] : | +| array_flow.rb:1085:5:1085:5 | b [element] : | array_flow.rb:1091:10:1091:10 | b [element] : | +| array_flow.rb:1085:5:1085:5 | b [element] : | array_flow.rb:1092:10:1092:10 | b [element] : | +| array_flow.rb:1085:5:1085:5 | b [element] : | array_flow.rb:1092:10:1092:10 | b [element] : | +| array_flow.rb:1085:5:1085:5 | b [element] : | array_flow.rb:1093:10:1093:10 | b [element] : | +| array_flow.rb:1085:5:1085:5 | b [element] : | array_flow.rb:1093:10:1093:10 | b [element] : | | array_flow.rb:1085:9:1085:9 | [post] a [element 1] : | array_flow.rb:1087:10:1087:10 | a [element 1] : | | array_flow.rb:1085:9:1085:9 | [post] a [element 1] : | array_flow.rb:1087:10:1087:10 | a [element 1] : | | array_flow.rb:1085:9:1085:9 | [post] a [element 2] : | array_flow.rb:1088:10:1088:10 | a [element 2] : | @@ -2041,18 +2560,12 @@ edges | array_flow.rb:1085:9:1085:9 | a [element 3] : | array_flow.rb:1085:9:1085:9 | [post] a [element 2] : | | array_flow.rb:1085:9:1085:9 | a [element 3] : | array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] : | | array_flow.rb:1085:9:1085:9 | a [element 3] : | array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element 1] : | array_flow.rb:1091:10:1091:10 | b [element 1] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element 1] : | array_flow.rb:1091:10:1091:10 | b [element 1] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] : | array_flow.rb:1092:10:1092:10 | b [element 2] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] : | array_flow.rb:1092:10:1092:10 | b [element 2] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1090:10:1090:10 | b [element] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1090:10:1090:10 | b [element] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1091:10:1091:10 | b [element] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1091:10:1091:10 | b [element] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1092:10:1092:10 | b [element] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1092:10:1092:10 | b [element] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1093:10:1093:10 | b [element] : | -| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1093:10:1093:10 | b [element] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element 1] : | array_flow.rb:1085:5:1085:5 | b [element 1] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element 1] : | array_flow.rb:1085:5:1085:5 | b [element 1] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] : | array_flow.rb:1085:5:1085:5 | b [element 2] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element 2] : | array_flow.rb:1085:5:1085:5 | b [element 2] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1085:5:1085:5 | b [element] : | +| array_flow.rb:1085:9:1085:17 | call to rotate! [element] : | array_flow.rb:1085:5:1085:5 | b [element] : | | array_flow.rb:1086:10:1086:10 | a [element] : | array_flow.rb:1086:10:1086:13 | ...[...] | | array_flow.rb:1086:10:1086:10 | a [element] : | array_flow.rb:1086:10:1086:13 | ...[...] | | array_flow.rb:1087:10:1087:10 | a [element 1] : | array_flow.rb:1087:10:1087:13 | ...[...] | @@ -2077,12 +2590,30 @@ edges | array_flow.rb:1092:10:1092:10 | b [element] : | array_flow.rb:1092:10:1092:13 | ...[...] | | array_flow.rb:1093:10:1093:10 | b [element] : | array_flow.rb:1093:10:1093:13 | ...[...] | | array_flow.rb:1093:10:1093:10 | b [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 [element 0] : | -| array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1096:9:1096:9 | a [element 0] : | -| array_flow.rb:1095:28:1095:40 | call to source : | array_flow.rb:1096:9:1096:9 | a [element 2] : | -| array_flow.rb:1095:28:1095:40 | call to source : | array_flow.rb:1096:9:1096:9 | a [element 2] : | -| array_flow.rb:1095:43:1095:55 | call to source : | array_flow.rb:1096:9:1096:9 | a [element 3] : | -| array_flow.rb:1095:43:1095:55 | call to source : | array_flow.rb:1096:9:1096:9 | a [element 3] : | +| array_flow.rb:1095:5:1095:5 | a [element 0] : | array_flow.rb:1096:9:1096:9 | a [element 0] : | +| array_flow.rb:1095:5:1095:5 | a [element 0] : | array_flow.rb:1096:9:1096:9 | a [element 0] : | +| array_flow.rb:1095:5:1095:5 | a [element 2] : | array_flow.rb:1096:9:1096:9 | a [element 2] : | +| array_flow.rb:1095:5:1095:5 | a [element 2] : | array_flow.rb:1096:9:1096:9 | a [element 2] : | +| array_flow.rb:1095:5:1095:5 | a [element 3] : | array_flow.rb:1096:9:1096:9 | a [element 3] : | +| array_flow.rb:1095:5:1095:5 | a [element 3] : | array_flow.rb:1096:9:1096:9 | a [element 3] : | +| array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1095:5:1095:5 | a [element 0] : | +| array_flow.rb:1095:10:1095:22 | call to source : | array_flow.rb:1095:5:1095:5 | a [element 0] : | +| array_flow.rb:1095:28:1095:40 | call to source : | array_flow.rb:1095:5:1095:5 | a [element 2] : | +| array_flow.rb:1095:28:1095:40 | call to source : | array_flow.rb:1095:5:1095:5 | a [element 2] : | +| array_flow.rb:1095:43:1095:55 | call to source : | array_flow.rb:1095:5:1095:5 | a [element 3] : | +| array_flow.rb:1095:43:1095:55 | call to source : | array_flow.rb:1095:5:1095:5 | a [element 3] : | +| array_flow.rb:1096:5:1096:5 | b [element 0] : | array_flow.rb:1101:10:1101:10 | b [element 0] : | +| array_flow.rb:1096:5:1096:5 | b [element 0] : | array_flow.rb:1101:10:1101:10 | b [element 0] : | +| array_flow.rb:1096:5:1096:5 | b [element 1] : | array_flow.rb:1102:10:1102:10 | b [element 1] : | +| array_flow.rb:1096:5:1096:5 | b [element 1] : | array_flow.rb:1102:10:1102:10 | b [element 1] : | +| array_flow.rb:1096:5:1096:5 | b [element] : | array_flow.rb:1101:10:1101:10 | b [element] : | +| array_flow.rb:1096:5:1096:5 | b [element] : | array_flow.rb:1101:10:1101:10 | b [element] : | +| array_flow.rb:1096:5:1096:5 | b [element] : | array_flow.rb:1102:10:1102:10 | b [element] : | +| array_flow.rb:1096:5:1096:5 | b [element] : | array_flow.rb:1102:10:1102:10 | b [element] : | +| array_flow.rb:1096:5:1096:5 | b [element] : | array_flow.rb:1103:10:1103:10 | b [element] : | +| array_flow.rb:1096:5:1096:5 | b [element] : | array_flow.rb:1103:10:1103:10 | b [element] : | +| array_flow.rb:1096:5:1096:5 | b [element] : | array_flow.rb:1104:10:1104:10 | b [element] : | +| array_flow.rb:1096:5:1096:5 | b [element] : | array_flow.rb:1104:10:1104:10 | b [element] : | | array_flow.rb:1096:9:1096:9 | [post] a [element 0] : | array_flow.rb:1097:10:1097:10 | a [element 0] : | | array_flow.rb:1096:9:1096:9 | [post] a [element 0] : | array_flow.rb:1097:10:1097:10 | a [element 0] : | | array_flow.rb:1096:9:1096:9 | [post] a [element 1] : | array_flow.rb:1098:10:1098:10 | a [element 1] : | @@ -2107,18 +2638,12 @@ edges | array_flow.rb:1096:9:1096:9 | a [element 3] : | array_flow.rb:1096:9:1096:9 | [post] a [element 1] : | | array_flow.rb:1096:9:1096:9 | a [element 3] : | array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] : | | array_flow.rb:1096:9:1096:9 | a [element 3] : | array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element 0] : | array_flow.rb:1101:10:1101:10 | b [element 0] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element 0] : | array_flow.rb:1101:10:1101:10 | b [element 0] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] : | array_flow.rb:1102:10:1102:10 | b [element 1] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] : | array_flow.rb:1102:10:1102:10 | b [element 1] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1101:10:1101:10 | b [element] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1101:10:1101:10 | b [element] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1102:10:1102:10 | b [element] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1102:10:1102:10 | b [element] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1103:10:1103:10 | b [element] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1103:10:1103:10 | b [element] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1104:10:1104:10 | b [element] : | -| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1104:10:1104:10 | b [element] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element 0] : | array_flow.rb:1096:5:1096:5 | b [element 0] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element 0] : | array_flow.rb:1096:5:1096:5 | b [element 0] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] : | array_flow.rb:1096:5:1096:5 | b [element 1] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element 1] : | array_flow.rb:1096:5:1096:5 | b [element 1] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1096:5:1096:5 | b [element] : | +| array_flow.rb:1096:9:1096:20 | call to rotate! [element] : | array_flow.rb:1096:5:1096:5 | b [element] : | | array_flow.rb:1097:10:1097:10 | a [element 0] : | array_flow.rb:1097:10:1097:13 | ...[...] | | array_flow.rb:1097:10:1097:10 | a [element 0] : | array_flow.rb:1097:10:1097:13 | ...[...] | | array_flow.rb:1097:10:1097:10 | a [element] : | array_flow.rb:1097:10:1097:13 | ...[...] | @@ -2143,12 +2668,24 @@ edges | array_flow.rb:1103:10:1103:10 | b [element] : | array_flow.rb:1103:10:1103:13 | ...[...] | | array_flow.rb:1104:10:1104:10 | b [element] : | array_flow.rb:1104:10:1104:13 | ...[...] | | array_flow.rb:1104:10:1104:10 | b [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 [element 0] : | -| array_flow.rb:1106:10:1106:22 | call to source : | array_flow.rb:1107:9:1107:9 | a [element 0] : | -| array_flow.rb:1106:28:1106:40 | call to source : | array_flow.rb:1107:9:1107:9 | a [element 2] : | -| array_flow.rb:1106:28:1106:40 | call to source : | array_flow.rb:1107:9:1107:9 | a [element 2] : | -| array_flow.rb:1106:43:1106:55 | call to source : | array_flow.rb:1107:9:1107:9 | a [element 3] : | -| array_flow.rb:1106:43:1106:55 | call to source : | array_flow.rb:1107:9:1107:9 | a [element 3] : | +| array_flow.rb:1106:5:1106:5 | a [element 0] : | array_flow.rb:1107:9:1107:9 | a [element 0] : | +| array_flow.rb:1106:5:1106:5 | a [element 0] : | array_flow.rb:1107:9:1107:9 | a [element 0] : | +| array_flow.rb:1106:5:1106:5 | a [element 2] : | array_flow.rb:1107:9:1107:9 | a [element 2] : | +| array_flow.rb:1106:5:1106:5 | a [element 2] : | array_flow.rb:1107:9:1107:9 | a [element 2] : | +| array_flow.rb:1106:5:1106:5 | a [element 3] : | array_flow.rb:1107:9:1107:9 | a [element 3] : | +| array_flow.rb:1106:5:1106:5 | a [element 3] : | array_flow.rb:1107:9:1107:9 | a [element 3] : | +| array_flow.rb:1106:10:1106:22 | call to source : | array_flow.rb:1106:5:1106:5 | a [element 0] : | +| array_flow.rb:1106:10:1106:22 | call to source : | array_flow.rb:1106:5:1106:5 | a [element 0] : | +| array_flow.rb:1106:28:1106:40 | call to source : | array_flow.rb:1106:5:1106:5 | a [element 2] : | +| array_flow.rb:1106:28:1106:40 | call to source : | array_flow.rb:1106:5:1106:5 | a [element 2] : | +| array_flow.rb:1106:43:1106:55 | call to source : | array_flow.rb:1106:5:1106:5 | a [element 3] : | +| array_flow.rb:1106:43:1106:55 | call to source : | array_flow.rb:1106:5:1106:5 | a [element 3] : | +| array_flow.rb:1107:5:1107:5 | b [element 0] : | array_flow.rb:1112:10:1112:10 | b [element 0] : | +| array_flow.rb:1107:5:1107:5 | b [element 0] : | array_flow.rb:1112:10:1112:10 | b [element 0] : | +| array_flow.rb:1107:5:1107:5 | b [element 2] : | array_flow.rb:1114:10:1114:10 | b [element 2] : | +| array_flow.rb:1107:5:1107:5 | b [element 2] : | array_flow.rb:1114:10:1114:10 | b [element 2] : | +| array_flow.rb:1107:5:1107:5 | b [element 3] : | array_flow.rb:1115:10:1115:10 | b [element 3] : | +| array_flow.rb:1107:5:1107:5 | b [element 3] : | array_flow.rb:1115:10:1115:10 | b [element 3] : | | array_flow.rb:1107:9:1107:9 | [post] a [element 0] : | array_flow.rb:1108:10:1108:10 | a [element 0] : | | array_flow.rb:1107:9:1107:9 | [post] a [element 0] : | array_flow.rb:1108:10:1108:10 | a [element 0] : | | array_flow.rb:1107:9:1107:9 | [post] a [element 2] : | array_flow.rb:1110:10:1110:10 | a [element 2] : | @@ -2167,12 +2704,12 @@ edges | array_flow.rb:1107:9:1107:9 | a [element 3] : | array_flow.rb:1107:9:1107:9 | [post] a [element 3] : | | array_flow.rb:1107:9:1107:9 | a [element 3] : | array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] : | | array_flow.rb:1107:9:1107:9 | a [element 3] : | array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] : | array_flow.rb:1112:10:1112:10 | b [element 0] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] : | array_flow.rb:1112:10:1112:10 | b [element 0] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] : | array_flow.rb:1114:10:1114:10 | b [element 2] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] : | array_flow.rb:1114:10:1114:10 | b [element 2] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] : | array_flow.rb:1115:10:1115:10 | b [element 3] : | -| array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] : | array_flow.rb:1115:10:1115:10 | b [element 3] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] : | array_flow.rb:1107:5:1107:5 | b [element 0] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 0] : | array_flow.rb:1107:5:1107:5 | b [element 0] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] : | array_flow.rb:1107:5:1107:5 | b [element 2] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 2] : | array_flow.rb:1107:5:1107:5 | b [element 2] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] : | array_flow.rb:1107:5:1107:5 | b [element 3] : | +| array_flow.rb:1107:9:1107:20 | call to rotate! [element 3] : | array_flow.rb:1107:5:1107:5 | b [element 3] : | | array_flow.rb:1108:10:1108:10 | a [element 0] : | array_flow.rb:1108:10:1108:13 | ...[...] | | array_flow.rb:1108:10:1108:10 | a [element 0] : | array_flow.rb:1108:10:1108:13 | ...[...] | | array_flow.rb:1110:10:1110:10 | a [element 2] : | array_flow.rb:1110:10:1110:13 | ...[...] | @@ -2185,12 +2722,26 @@ edges | array_flow.rb:1114:10:1114:10 | b [element 2] : | array_flow.rb:1114:10:1114:13 | ...[...] | | array_flow.rb:1115:10:1115:10 | b [element 3] : | array_flow.rb:1115:10:1115:13 | ...[...] | | array_flow.rb:1115:10:1115:10 | b [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 [element 0] : | -| array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1118:9:1118:9 | a [element 0] : | -| array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1118:9:1118:9 | a [element 2] : | -| array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1118:9:1118:9 | a [element 2] : | -| array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1118:9:1118:9 | a [element 3] : | -| array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1118:9:1118:9 | a [element 3] : | +| array_flow.rb:1117:5:1117:5 | a [element 0] : | array_flow.rb:1118:9:1118:9 | a [element 0] : | +| array_flow.rb:1117:5:1117:5 | a [element 0] : | array_flow.rb:1118:9:1118:9 | a [element 0] : | +| array_flow.rb:1117:5:1117:5 | a [element 2] : | array_flow.rb:1118:9:1118:9 | a [element 2] : | +| array_flow.rb:1117:5:1117:5 | a [element 2] : | array_flow.rb:1118:9:1118:9 | a [element 2] : | +| array_flow.rb:1117:5:1117:5 | a [element 3] : | array_flow.rb:1118:9:1118:9 | a [element 3] : | +| array_flow.rb:1117:5:1117:5 | a [element 3] : | array_flow.rb:1118:9:1118:9 | a [element 3] : | +| array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1117:5:1117:5 | a [element 0] : | +| array_flow.rb:1117:10:1117:22 | call to source : | array_flow.rb:1117:5:1117:5 | a [element 0] : | +| array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1117:5:1117:5 | a [element 2] : | +| array_flow.rb:1117:28:1117:40 | call to source : | array_flow.rb:1117:5:1117:5 | a [element 2] : | +| array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1117:5:1117:5 | a [element 3] : | +| array_flow.rb:1117:43:1117:55 | call to source : | array_flow.rb:1117:5:1117:5 | a [element 3] : | +| array_flow.rb:1118:5:1118:5 | b [element] : | array_flow.rb:1123:10:1123:10 | b [element] : | +| array_flow.rb:1118:5:1118:5 | b [element] : | array_flow.rb:1123:10:1123:10 | b [element] : | +| array_flow.rb:1118:5:1118:5 | b [element] : | array_flow.rb:1124:10:1124:10 | b [element] : | +| array_flow.rb:1118:5:1118:5 | b [element] : | array_flow.rb:1124:10:1124:10 | b [element] : | +| array_flow.rb:1118:5:1118:5 | b [element] : | array_flow.rb:1125:10:1125:10 | b [element] : | +| array_flow.rb:1118:5:1118:5 | b [element] : | array_flow.rb:1125:10:1125:10 | b [element] : | +| array_flow.rb:1118:5:1118:5 | b [element] : | array_flow.rb:1126:10:1126:10 | b [element] : | +| array_flow.rb:1118:5:1118:5 | b [element] : | array_flow.rb:1126:10:1126:10 | b [element] : | | array_flow.rb:1118:9:1118:9 | [post] a [element] : | array_flow.rb:1119:10:1119:10 | a [element] : | | array_flow.rb:1118:9:1118:9 | [post] a [element] : | array_flow.rb:1119:10:1119:10 | a [element] : | | array_flow.rb:1118:9:1118:9 | [post] a [element] : | array_flow.rb:1120:10:1120:10 | a [element] : | @@ -2211,14 +2762,8 @@ edges | array_flow.rb:1118:9:1118:9 | a [element 3] : | array_flow.rb:1118:9:1118:9 | [post] a [element] : | | array_flow.rb:1118:9:1118:9 | a [element 3] : | array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | | array_flow.rb:1118:9:1118:9 | a [element 3] : | array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1123:10:1123:10 | b [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1123:10:1123:10 | b [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1124:10:1124:10 | b [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1124:10:1124:10 | b [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1125:10:1125:10 | b [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1125:10:1125:10 | b [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1126:10:1126:10 | b [element] : | -| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1126:10:1126:10 | b [element] : | +| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1118:5:1118:5 | b [element] : | +| array_flow.rb:1118:9:1118:20 | call to rotate! [element] : | array_flow.rb:1118:5:1118:5 | b [element] : | | array_flow.rb:1119:10:1119:10 | a [element] : | array_flow.rb:1119:10:1119:13 | ...[...] | | array_flow.rb:1119:10:1119:10 | a [element] : | array_flow.rb:1119:10:1119:13 | ...[...] | | array_flow.rb:1120:10:1120:10 | a [element] : | array_flow.rb:1120:10:1120:13 | ...[...] | @@ -2235,20 +2780,28 @@ edges | array_flow.rb:1125:10:1125:10 | b [element] : | array_flow.rb:1125:10:1125:13 | ...[...] | | array_flow.rb:1126:10:1126:10 | b [element] : | array_flow.rb:1126:10:1126:13 | ...[...] | | array_flow.rb:1126:10:1126:10 | b [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 [element 3] : | -| array_flow.rb:1130:19:1130:29 | call to source : | array_flow.rb:1131:9:1131:9 | a [element 3] : | +| array_flow.rb:1130:5:1130:5 | a [element 3] : | array_flow.rb:1131:9:1131:9 | a [element 3] : | +| array_flow.rb:1130:5:1130:5 | a [element 3] : | array_flow.rb:1131:9:1131:9 | a [element 3] : | +| array_flow.rb:1130:19:1130:29 | call to source : | array_flow.rb:1130:5:1130:5 | a [element 3] : | +| array_flow.rb:1130:19:1130:29 | call to source : | array_flow.rb:1130:5:1130:5 | a [element 3] : | +| array_flow.rb:1131:5:1131:5 | b [element] : | array_flow.rb:1134:10:1134:10 | b [element] : | +| array_flow.rb:1131:5:1131:5 | b [element] : | array_flow.rb:1134:10:1134:10 | b [element] : | | array_flow.rb:1131:9:1131:9 | a [element 3] : | array_flow.rb:1131:9:1133:7 | call to select [element] : | | array_flow.rb:1131:9:1131:9 | a [element 3] : | array_flow.rb:1131:9:1133:7 | call to select [element] : | | array_flow.rb:1131:9:1131:9 | a [element 3] : | array_flow.rb:1131:22:1131:22 | x : | | array_flow.rb:1131:9:1131:9 | a [element 3] : | array_flow.rb:1131:22:1131:22 | x : | -| array_flow.rb:1131:9:1133:7 | call to select [element] : | array_flow.rb:1134:10:1134:10 | b [element] : | -| array_flow.rb:1131:9:1133:7 | call to select [element] : | array_flow.rb:1134:10:1134:10 | b [element] : | +| array_flow.rb:1131:9:1133:7 | call to select [element] : | array_flow.rb:1131:5:1131:5 | b [element] : | +| array_flow.rb:1131:9:1133:7 | call to select [element] : | array_flow.rb:1131:5:1131:5 | b [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 [element] : | array_flow.rb:1134:10:1134:13 | ...[...] | | array_flow.rb:1134:10:1134:10 | b [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 [element 2] : | -| array_flow.rb:1138:16:1138:26 | call to source : | array_flow.rb:1139:9:1139:9 | a [element 2] : | +| array_flow.rb:1138:5:1138:5 | a [element 2] : | array_flow.rb:1139:9:1139:9 | a [element 2] : | +| array_flow.rb:1138:5:1138:5 | a [element 2] : | array_flow.rb:1139:9:1139:9 | a [element 2] : | +| array_flow.rb:1138:16:1138:26 | call to source : | array_flow.rb:1138:5:1138:5 | a [element 2] : | +| array_flow.rb:1138:16:1138:26 | call to source : | array_flow.rb:1138:5:1138:5 | a [element 2] : | +| array_flow.rb:1139:5:1139:5 | b [element] : | array_flow.rb:1144:10:1144:10 | b [element] : | +| array_flow.rb:1139:5:1139:5 | b [element] : | array_flow.rb:1144:10:1144:10 | b [element] : | | array_flow.rb:1139:9:1139:9 | [post] a [element] : | array_flow.rb:1143:10:1143:10 | a [element] : | | array_flow.rb:1139:9:1139:9 | [post] a [element] : | array_flow.rb:1143:10:1143:10 | a [element] : | | array_flow.rb:1139:9:1139:9 | a [element 2] : | array_flow.rb:1139:9:1139:9 | [post] a [element] : | @@ -2257,52 +2810,72 @@ edges | array_flow.rb:1139:9:1139:9 | a [element 2] : | array_flow.rb:1139:9:1142:7 | call to select! [element] : | | array_flow.rb:1139:9:1139:9 | a [element 2] : | array_flow.rb:1139:23:1139:23 | x : | | array_flow.rb:1139:9:1139:9 | a [element 2] : | array_flow.rb:1139:23:1139:23 | x : | -| array_flow.rb:1139:9:1142:7 | call to select! [element] : | array_flow.rb:1144:10:1144:10 | b [element] : | -| array_flow.rb:1139:9:1142:7 | call to select! [element] : | array_flow.rb:1144:10:1144:10 | b [element] : | +| array_flow.rb:1139:9:1142:7 | call to select! [element] : | array_flow.rb:1139:5:1139:5 | b [element] : | +| array_flow.rb:1139:9:1142:7 | call to select! [element] : | array_flow.rb:1139:5:1139:5 | b [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 [element] : | array_flow.rb:1143:10:1143:13 | ...[...] | | array_flow.rb:1143:10:1143:10 | a [element] : | array_flow.rb:1143:10:1143:13 | ...[...] | | array_flow.rb:1144:10:1144:10 | b [element] : | array_flow.rb:1144:10:1144:13 | ...[...] | | array_flow.rb:1144:10:1144:10 | b [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 [element 0] : | -| array_flow.rb:1148:10:1148:22 | call to source : | array_flow.rb:1149:9:1149:9 | a [element 0] : | -| array_flow.rb:1148:28:1148:40 | call to source : | array_flow.rb:1149:9:1149:9 | a [element 2] : | -| array_flow.rb:1148:28:1148:40 | call to source : | array_flow.rb:1149:9:1149:9 | a [element 2] : | +| array_flow.rb:1148:5:1148:5 | a [element 0] : | array_flow.rb:1149:9:1149:9 | a [element 0] : | +| array_flow.rb:1148:5:1148:5 | a [element 0] : | array_flow.rb:1149:9:1149:9 | a [element 0] : | +| array_flow.rb:1148:5:1148:5 | a [element 2] : | array_flow.rb:1149:9:1149:9 | a [element 2] : | +| array_flow.rb:1148:5:1148:5 | a [element 2] : | array_flow.rb:1149:9:1149:9 | a [element 2] : | +| array_flow.rb:1148:10:1148:22 | call to source : | array_flow.rb:1148:5:1148:5 | a [element 0] : | +| array_flow.rb:1148:10:1148:22 | call to source : | array_flow.rb:1148:5:1148:5 | a [element 0] : | +| array_flow.rb:1148:28:1148:40 | call to source : | array_flow.rb:1148:5:1148:5 | a [element 2] : | +| array_flow.rb:1148:28:1148:40 | call to source : | array_flow.rb:1148:5:1148:5 | a [element 2] : | +| array_flow.rb:1149:5:1149:5 | b : | array_flow.rb:1150:10:1150:10 | b | +| array_flow.rb:1149:5:1149:5 | b : | array_flow.rb:1150:10:1150:10 | b | | array_flow.rb:1149:9:1149:9 | [post] a [element 1] : | array_flow.rb:1152:10:1152:10 | a [element 1] : | | array_flow.rb:1149:9:1149:9 | [post] a [element 1] : | array_flow.rb:1152:10:1152:10 | a [element 1] : | | array_flow.rb:1149:9:1149:9 | a [element 0] : | array_flow.rb:1149:9:1149:15 | call to shift : | | array_flow.rb:1149:9:1149:9 | a [element 0] : | array_flow.rb:1149:9:1149:15 | call to shift : | | array_flow.rb:1149:9:1149:9 | a [element 2] : | array_flow.rb:1149:9:1149:9 | [post] a [element 1] : | | array_flow.rb:1149:9:1149:9 | a [element 2] : | array_flow.rb:1149:9:1149:9 | [post] a [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:1149:9:1149:15 | call to shift : | array_flow.rb:1149:5:1149:5 | b : | +| array_flow.rb:1149:9:1149:15 | call to shift : | array_flow.rb:1149:5:1149:5 | b : | | array_flow.rb:1152:10:1152:10 | a [element 1] : | array_flow.rb:1152:10:1152:13 | ...[...] | | array_flow.rb:1152:10:1152:10 | a [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 [element 0] : | -| array_flow.rb:1155:10:1155:22 | call to source : | array_flow.rb:1156:9:1156:9 | a [element 0] : | -| array_flow.rb:1155:28:1155:40 | call to source : | array_flow.rb:1156:9:1156:9 | a [element 2] : | -| array_flow.rb:1155:28:1155:40 | call to source : | array_flow.rb:1156:9:1156:9 | a [element 2] : | +| array_flow.rb:1155:5:1155:5 | a [element 0] : | array_flow.rb:1156:9:1156:9 | a [element 0] : | +| array_flow.rb:1155:5:1155:5 | a [element 0] : | array_flow.rb:1156:9:1156:9 | a [element 0] : | +| array_flow.rb:1155:5:1155:5 | a [element 2] : | array_flow.rb:1156:9:1156:9 | a [element 2] : | +| array_flow.rb:1155:5:1155:5 | a [element 2] : | array_flow.rb:1156:9:1156:9 | a [element 2] : | +| array_flow.rb:1155:10:1155:22 | call to source : | array_flow.rb:1155:5:1155:5 | a [element 0] : | +| array_flow.rb:1155:10:1155:22 | call to source : | array_flow.rb:1155:5:1155:5 | a [element 0] : | +| array_flow.rb:1155:28:1155:40 | call to source : | array_flow.rb:1155:5:1155:5 | a [element 2] : | +| array_flow.rb:1155:28:1155:40 | call to source : | array_flow.rb:1155:5:1155:5 | a [element 2] : | +| array_flow.rb:1156:5:1156:5 | b [element 0] : | array_flow.rb:1157:10:1157:10 | b [element 0] : | +| array_flow.rb:1156:5:1156:5 | b [element 0] : | array_flow.rb:1157:10:1157:10 | b [element 0] : | | array_flow.rb:1156:9:1156:9 | [post] a [element 0] : | array_flow.rb:1159:10:1159:10 | a [element 0] : | | array_flow.rb:1156:9:1156:9 | [post] a [element 0] : | array_flow.rb:1159:10:1159:10 | a [element 0] : | | array_flow.rb:1156:9:1156:9 | a [element 0] : | array_flow.rb:1156:9:1156:18 | call to shift [element 0] : | | array_flow.rb:1156:9:1156:9 | a [element 0] : | array_flow.rb:1156:9:1156:18 | call to shift [element 0] : | | array_flow.rb:1156:9:1156:9 | a [element 2] : | array_flow.rb:1156:9:1156:9 | [post] a [element 0] : | | array_flow.rb:1156:9:1156:9 | a [element 2] : | array_flow.rb:1156:9:1156:9 | [post] a [element 0] : | -| array_flow.rb:1156:9:1156:18 | call to shift [element 0] : | array_flow.rb:1157:10:1157:10 | b [element 0] : | -| array_flow.rb:1156:9:1156:18 | call to shift [element 0] : | array_flow.rb:1157:10:1157:10 | b [element 0] : | +| array_flow.rb:1156:9:1156:18 | call to shift [element 0] : | array_flow.rb:1156:5:1156:5 | b [element 0] : | +| array_flow.rb:1156:9:1156:18 | call to shift [element 0] : | array_flow.rb:1156:5:1156:5 | b [element 0] : | | array_flow.rb:1157:10:1157:10 | b [element 0] : | array_flow.rb:1157:10:1157:13 | ...[...] | | array_flow.rb:1157:10:1157:10 | b [element 0] : | array_flow.rb:1157:10:1157:13 | ...[...] | | array_flow.rb:1159:10:1159:10 | a [element 0] : | array_flow.rb:1159:10:1159:13 | ...[...] | | array_flow.rb:1159:10:1159:10 | a [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 [element 0] : | -| array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1164:9:1164:9 | a [element 0] : | -| array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1167:10:1167:10 | a [element 0] : | -| array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1167:10:1167:10 | a [element 0] : | -| array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1164:9:1164:9 | a [element 2] : | -| array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1164:9:1164:9 | a [element 2] : | -| array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1169:10:1169:10 | a [element 2] : | -| array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1169:10:1169:10 | a [element 2] : | +| array_flow.rb:1163:5:1163:5 | a [element 0] : | array_flow.rb:1164:9:1164:9 | a [element 0] : | +| array_flow.rb:1163:5:1163:5 | a [element 0] : | array_flow.rb:1164:9:1164:9 | a [element 0] : | +| array_flow.rb:1163:5:1163:5 | a [element 0] : | array_flow.rb:1167:10:1167:10 | a [element 0] : | +| array_flow.rb:1163:5:1163:5 | a [element 0] : | array_flow.rb:1167:10:1167:10 | a [element 0] : | +| array_flow.rb:1163:5:1163:5 | a [element 2] : | array_flow.rb:1164:9:1164:9 | a [element 2] : | +| array_flow.rb:1163:5:1163:5 | a [element 2] : | array_flow.rb:1164:9:1164:9 | a [element 2] : | +| array_flow.rb:1163:5:1163:5 | a [element 2] : | array_flow.rb:1169:10:1169:10 | a [element 2] : | +| array_flow.rb:1163:5:1163:5 | a [element 2] : | array_flow.rb:1169:10:1169:10 | a [element 2] : | +| array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1163:5:1163:5 | a [element 0] : | +| array_flow.rb:1163:10:1163:22 | call to source : | array_flow.rb:1163:5:1163:5 | a [element 0] : | +| array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1163:5:1163:5 | a [element 2] : | +| array_flow.rb:1163:28:1163:40 | call to source : | array_flow.rb:1163:5:1163:5 | a [element 2] : | +| array_flow.rb:1164:5:1164:5 | b [element] : | array_flow.rb:1165:10:1165:10 | b [element] : | +| array_flow.rb:1164:5:1164:5 | b [element] : | array_flow.rb:1165:10:1165:10 | b [element] : | +| array_flow.rb:1164:5:1164:5 | b [element] : | array_flow.rb:1166:10:1166:10 | b [element] : | +| array_flow.rb:1164:5:1164:5 | b [element] : | array_flow.rb:1166:10:1166:10 | b [element] : | | array_flow.rb:1164:9:1164:9 | [post] a [element] : | array_flow.rb:1167:10:1167:10 | a [element] : | | array_flow.rb:1164:9:1164:9 | [post] a [element] : | array_flow.rb:1167:10:1167:10 | a [element] : | | array_flow.rb:1164:9:1164:9 | [post] a [element] : | array_flow.rb:1168:10:1168:10 | a [element] : | @@ -2317,10 +2890,8 @@ edges | array_flow.rb:1164:9:1164:9 | a [element 2] : | array_flow.rb:1164:9:1164:9 | [post] a [element] : | | array_flow.rb:1164:9:1164:9 | a [element 2] : | array_flow.rb:1164:9:1164:18 | call to shift [element] : | | array_flow.rb:1164:9:1164:9 | a [element 2] : | array_flow.rb:1164:9:1164:18 | call to shift [element] : | -| array_flow.rb:1164:9:1164:18 | call to shift [element] : | array_flow.rb:1165:10:1165:10 | b [element] : | -| array_flow.rb:1164:9:1164:18 | call to shift [element] : | array_flow.rb:1165:10:1165:10 | b [element] : | -| array_flow.rb:1164:9:1164:18 | call to shift [element] : | array_flow.rb:1166:10:1166:10 | b [element] : | -| array_flow.rb:1164:9:1164:18 | call to shift [element] : | array_flow.rb:1166:10:1166:10 | b [element] : | +| array_flow.rb:1164:9:1164:18 | call to shift [element] : | array_flow.rb:1164:5:1164:5 | b [element] : | +| array_flow.rb:1164:9:1164:18 | call to shift [element] : | array_flow.rb:1164:5:1164:5 | b [element] : | | array_flow.rb:1165:10:1165:10 | b [element] : | array_flow.rb:1165:10:1165:13 | ...[...] | | array_flow.rb:1165:10:1165:10 | b [element] : | array_flow.rb:1165:10:1165:13 | ...[...] | | array_flow.rb:1166:10:1166:10 | b [element] : | array_flow.rb:1166:10:1166:13 | ...[...] | @@ -2335,18 +2906,22 @@ edges | array_flow.rb:1169:10:1169:10 | a [element 2] : | array_flow.rb:1169:10:1169:13 | ...[...] | | array_flow.rb:1169:10:1169:10 | a [element] : | array_flow.rb:1169:10:1169:13 | ...[...] | | array_flow.rb:1169:10:1169:10 | a [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 [element 2] : | -| array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1174:9:1174:9 | a [element 2] : | -| array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1177:10:1177:10 | a [element 2] : | -| array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1177:10:1177:10 | a [element 2] : | +| array_flow.rb:1173:5:1173:5 | a [element 2] : | array_flow.rb:1174:9:1174:9 | a [element 2] : | +| array_flow.rb:1173:5:1173:5 | a [element 2] : | array_flow.rb:1174:9:1174:9 | a [element 2] : | +| array_flow.rb:1173:5:1173:5 | a [element 2] : | array_flow.rb:1177:10:1177:10 | a [element 2] : | +| array_flow.rb:1173:5:1173:5 | a [element 2] : | array_flow.rb:1177:10:1177:10 | a [element 2] : | +| array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1173:5:1173:5 | a [element 2] : | +| array_flow.rb:1173:16:1173:26 | call to source : | array_flow.rb:1173:5:1173:5 | a [element 2] : | +| array_flow.rb:1174:5:1174:5 | b [element] : | array_flow.rb:1178:10:1178:10 | b [element] : | +| array_flow.rb:1174:5:1174:5 | b [element] : | array_flow.rb:1178:10:1178:10 | b [element] : | +| array_flow.rb:1174:5:1174:5 | b [element] : | array_flow.rb:1179:10:1179:10 | b [element] : | +| array_flow.rb:1174:5:1174:5 | b [element] : | array_flow.rb:1179:10:1179:10 | b [element] : | +| array_flow.rb:1174:5:1174:5 | b [element] : | array_flow.rb:1180:10:1180:10 | b [element] : | +| array_flow.rb:1174:5:1174:5 | b [element] : | array_flow.rb:1180:10:1180:10 | b [element] : | | array_flow.rb:1174:9:1174:9 | a [element 2] : | array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | | array_flow.rb:1174:9:1174:9 | a [element 2] : | array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | -| array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | array_flow.rb:1178:10:1178:10 | b [element] : | -| array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | array_flow.rb:1178:10:1178:10 | b [element] : | -| array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | array_flow.rb:1179:10:1179:10 | b [element] : | -| array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | array_flow.rb:1179:10:1179:10 | b [element] : | -| array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | array_flow.rb:1180:10:1180:10 | b [element] : | -| array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | array_flow.rb:1180:10:1180:10 | b [element] : | +| array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | array_flow.rb:1174:5:1174:5 | b [element] : | +| array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | array_flow.rb:1174:5:1174:5 | b [element] : | | array_flow.rb:1177:10:1177:10 | a [element 2] : | array_flow.rb:1177:10:1177:13 | ...[...] | | array_flow.rb:1177:10:1177:10 | a [element 2] : | array_flow.rb:1177:10:1177:13 | ...[...] | | array_flow.rb:1178:10:1178:10 | b [element] : | array_flow.rb:1178:10:1178:13 | ...[...] | @@ -2355,10 +2930,18 @@ edges | array_flow.rb:1179:10:1179:10 | b [element] : | array_flow.rb:1179:10:1179:13 | ...[...] | | array_flow.rb:1180:10:1180:10 | b [element] : | array_flow.rb:1180:10:1180:13 | ...[...] | | array_flow.rb:1180:10:1180:10 | b [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 [element 2] : | -| array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1185:9:1185:9 | a [element 2] : | -| array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1188:10:1188:10 | a [element 2] : | -| array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1188:10:1188:10 | a [element 2] : | +| array_flow.rb:1184:5:1184:5 | a [element 2] : | array_flow.rb:1185:9:1185:9 | a [element 2] : | +| array_flow.rb:1184:5:1184:5 | a [element 2] : | array_flow.rb:1185:9:1185:9 | a [element 2] : | +| array_flow.rb:1184:5:1184:5 | a [element 2] : | array_flow.rb:1188:10:1188:10 | a [element 2] : | +| array_flow.rb:1184:5:1184:5 | a [element 2] : | array_flow.rb:1188:10:1188:10 | a [element 2] : | +| array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1184:5:1184:5 | a [element 2] : | +| array_flow.rb:1184:16:1184:26 | call to source : | array_flow.rb:1184:5:1184:5 | a [element 2] : | +| array_flow.rb:1185:5:1185:5 | b [element] : | array_flow.rb:1189:10:1189:10 | b [element] : | +| array_flow.rb:1185:5:1185:5 | b [element] : | array_flow.rb:1189:10:1189:10 | b [element] : | +| array_flow.rb:1185:5:1185:5 | b [element] : | array_flow.rb:1190:10:1190:10 | b [element] : | +| array_flow.rb:1185:5:1185:5 | b [element] : | array_flow.rb:1190:10:1190:10 | b [element] : | +| array_flow.rb:1185:5:1185:5 | b [element] : | array_flow.rb:1191:10:1191:10 | b [element] : | +| array_flow.rb:1185:5:1185:5 | b [element] : | array_flow.rb:1191:10:1191:10 | b [element] : | | array_flow.rb:1185:9:1185:9 | [post] a [element] : | array_flow.rb:1186:10:1186:10 | a [element] : | | array_flow.rb:1185:9:1185:9 | [post] a [element] : | array_flow.rb:1186:10:1186:10 | a [element] : | | array_flow.rb:1185:9:1185:9 | [post] a [element] : | array_flow.rb:1187:10:1187:10 | a [element] : | @@ -2369,12 +2952,8 @@ edges | array_flow.rb:1185:9:1185:9 | a [element 2] : | array_flow.rb:1185:9:1185:9 | [post] a [element] : | | array_flow.rb:1185:9:1185:9 | a [element 2] : | array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | | array_flow.rb:1185:9:1185:9 | a [element 2] : | array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | -| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | array_flow.rb:1189:10:1189:10 | b [element] : | -| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | array_flow.rb:1189:10:1189:10 | b [element] : | -| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | array_flow.rb:1190:10:1190:10 | b [element] : | -| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | array_flow.rb:1190:10:1190:10 | b [element] : | -| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | array_flow.rb:1191:10:1191:10 | b [element] : | -| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | array_flow.rb:1191:10:1191:10 | b [element] : | +| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | array_flow.rb:1185:5:1185:5 | b [element] : | +| array_flow.rb:1185:9:1185:18 | call to shuffle! [element] : | array_flow.rb:1185:5:1185:5 | b [element] : | | array_flow.rb:1186:10:1186:10 | a [element] : | array_flow.rb:1186:10:1186:13 | ...[...] | | array_flow.rb:1186:10:1186:10 | a [element] : | array_flow.rb:1186:10:1186:13 | ...[...] | | array_flow.rb:1187:10:1187:10 | a [element] : | array_flow.rb:1187:10:1187:13 | ...[...] | @@ -2389,52 +2968,65 @@ edges | array_flow.rb:1190:10:1190:10 | b [element] : | array_flow.rb:1190:10:1190:13 | ...[...] | | array_flow.rb:1191:10:1191:10 | b [element] : | array_flow.rb:1191:10:1191:13 | ...[...] | | array_flow.rb:1191:10:1191:10 | b [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 [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1200:9:1200:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1203:9:1203:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1203:9:1203:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1209:9:1209:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1209:9:1209:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1214:9:1214:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1214:9:1214:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1218:9:1218:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1218:9:1218:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1223:9:1223:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1223:9:1223:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1228:9:1228:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1228:9:1228:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1232:9:1232:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1232:9:1232:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1236:9:1236:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1236:9:1236:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1241:9:1241:9 | a [element 2] : | -| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1241:9:1241:9 | a [element 2] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1197:9:1197:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1197:9:1197:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1200:9:1200:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1200:9:1200:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1203:9:1203:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1203:9:1203:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1209:9:1209:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1209:9:1209:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1214:9:1214:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1214:9:1214:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1228:9:1228:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1228:9:1228:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1232:9:1232:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1232:9:1232:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1241:9:1241:9 | a [element 4] : | -| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1241:9:1241:9 | a [element 4] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1200:9:1200:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1200:9:1200:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1203:9:1203:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1203:9:1203:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1209:9:1209:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1209:9:1209:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1214:9:1214:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1214:9:1214:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1218:9:1218:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1218:9:1218:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1223:9:1223:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1223:9:1223:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1228:9:1228:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1228:9:1228:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1232:9:1232:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1232:9:1232:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1236:9:1236:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1236:9:1236:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1241:9:1241:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | array_flow.rb:1241:9:1241:9 | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1197:9:1197:9 | a [element 4] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1197:9:1197:9 | a [element 4] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1200:9:1200:9 | a [element 4] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1200:9:1200:9 | a [element 4] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1203:9:1203:9 | a [element 4] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1203:9:1203:9 | a [element 4] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1209:9:1209:9 | a [element 4] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1209:9:1209:9 | a [element 4] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1214:9:1214:9 | a [element 4] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1214:9:1214:9 | a [element 4] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1228:9:1228:9 | a [element 4] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1228:9:1228:9 | a [element 4] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1232:9:1232:9 | a [element 4] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1232:9:1232:9 | a [element 4] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1241:9:1241:9 | a [element 4] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | array_flow.rb:1241:9:1241:9 | a [element 4] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1195:5:1195:5 | a [element 2] : | +| array_flow.rb:1195:16:1195:28 | call to source : | array_flow.rb:1195:5:1195:5 | a [element 2] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1195:5:1195:5 | a [element 4] : | +| array_flow.rb:1195:34:1195:46 | call to source : | array_flow.rb:1195:5:1195:5 | a [element 4] : | +| array_flow.rb:1197:5:1197:5 | b : | array_flow.rb:1198:10:1198:10 | b | +| array_flow.rb:1197:5:1197:5 | b : | array_flow.rb:1198:10:1198:10 | b | | array_flow.rb:1197:9:1197:9 | a [element 4] : | array_flow.rb:1197:9:1197:17 | call to slice : | | array_flow.rb:1197:9:1197:9 | a [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:1197:9:1197:17 | call to slice : | array_flow.rb:1197:5:1197:5 | b : | +| array_flow.rb:1197:9:1197:17 | call to slice : | array_flow.rb:1197:5:1197:5 | b : | +| array_flow.rb:1200:5:1200:5 | b : | array_flow.rb:1201:10:1201:10 | b | +| array_flow.rb:1200:5:1200:5 | b : | array_flow.rb:1201:10:1201:10 | b | | array_flow.rb:1200:9:1200:9 | a [element 2] : | array_flow.rb:1200:9:1200:19 | call to slice : | | array_flow.rb:1200:9:1200:9 | a [element 2] : | array_flow.rb:1200:9:1200:19 | call to slice : | | array_flow.rb:1200:9:1200:9 | a [element 4] : | array_flow.rb:1200:9:1200:19 | call to slice : | | array_flow.rb:1200:9:1200:9 | a [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:1200:9:1200:19 | call to slice : | array_flow.rb:1200:5:1200:5 | b : | +| array_flow.rb:1200:9:1200:19 | call to slice : | array_flow.rb:1200:5:1200:5 | b : | +| array_flow.rb:1203:5:1203:5 | b : | array_flow.rb:1205:10:1205:10 | b | +| array_flow.rb:1203:5:1203:5 | b : | array_flow.rb:1205:10:1205:10 | b | +| array_flow.rb:1203:5:1203:5 | b : | array_flow.rb:1207:10:1207:10 | b : | +| array_flow.rb:1203:5:1203:5 | b [element] : | array_flow.rb:1207:10:1207:10 | b [element] : | +| array_flow.rb:1203:5:1203:5 | b [element] : | array_flow.rb:1207:10:1207:10 | b [element] : | | array_flow.rb:1203:9:1203:9 | a [element 2] : | array_flow.rb:1203:9:1203:17 | call to slice : | | array_flow.rb:1203:9:1203:9 | a [element 2] : | array_flow.rb:1203:9:1203:17 | call to slice : | | array_flow.rb:1203:9:1203:9 | a [element 2] : | array_flow.rb:1203:9:1203:17 | call to slice [element] : | @@ -2443,114 +3035,146 @@ edges | array_flow.rb:1203:9:1203:9 | a [element 4] : | array_flow.rb:1203:9:1203:17 | call to slice : | | array_flow.rb:1203:9:1203:9 | a [element 4] : | array_flow.rb:1203:9:1203:17 | call to slice [element] : | | array_flow.rb:1203:9:1203:9 | a [element 4] : | array_flow.rb:1203:9:1203:17 | call to slice [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 [element] : | array_flow.rb:1207:10:1207:10 | b [element] : | -| array_flow.rb:1203:9:1203:17 | call to slice [element] : | array_flow.rb:1207:10:1207:10 | b [element] : | +| array_flow.rb:1203:9:1203:17 | call to slice : | array_flow.rb:1203:5:1203:5 | b : | +| array_flow.rb:1203:9:1203:17 | call to slice : | array_flow.rb:1203:5:1203:5 | b : | +| array_flow.rb:1203:9:1203:17 | call to slice [element] : | array_flow.rb:1203:5:1203:5 | b [element] : | +| array_flow.rb:1203:9:1203:17 | call to slice [element] : | array_flow.rb:1203:5:1203:5 | b [element] : | | array_flow.rb:1207:10:1207:10 | b : | array_flow.rb:1207:10:1207:13 | ...[...] | | array_flow.rb:1207:10:1207:10 | b [element] : | array_flow.rb:1207:10:1207:13 | ...[...] | | array_flow.rb:1207:10:1207:10 | b [element] : | array_flow.rb:1207:10:1207:13 | ...[...] | +| array_flow.rb:1209:5:1209:5 | b [element 0] : | array_flow.rb:1210:10:1210:10 | b [element 0] : | +| array_flow.rb:1209:5:1209:5 | b [element 0] : | array_flow.rb:1210:10:1210:10 | b [element 0] : | +| array_flow.rb:1209:5:1209:5 | b [element 2] : | array_flow.rb:1212:10:1212:10 | b [element 2] : | +| array_flow.rb:1209:5:1209:5 | b [element 2] : | array_flow.rb:1212:10:1212:10 | b [element 2] : | | array_flow.rb:1209:9:1209:9 | a [element 2] : | array_flow.rb:1209:9:1209:21 | call to slice [element 0] : | | array_flow.rb:1209:9:1209:9 | a [element 2] : | array_flow.rb:1209:9:1209:21 | call to slice [element 0] : | | array_flow.rb:1209:9:1209:9 | a [element 4] : | array_flow.rb:1209:9:1209:21 | call to slice [element 2] : | | array_flow.rb:1209:9:1209:9 | a [element 4] : | array_flow.rb:1209:9:1209:21 | call to slice [element 2] : | -| array_flow.rb:1209:9:1209:21 | call to slice [element 0] : | array_flow.rb:1210:10:1210:10 | b [element 0] : | -| array_flow.rb:1209:9:1209:21 | call to slice [element 0] : | array_flow.rb:1210:10:1210:10 | b [element 0] : | -| array_flow.rb:1209:9:1209:21 | call to slice [element 2] : | array_flow.rb:1212:10:1212:10 | b [element 2] : | -| array_flow.rb:1209:9:1209:21 | call to slice [element 2] : | array_flow.rb:1212:10:1212:10 | b [element 2] : | +| array_flow.rb:1209:9:1209:21 | call to slice [element 0] : | array_flow.rb:1209:5:1209:5 | b [element 0] : | +| array_flow.rb:1209:9:1209:21 | call to slice [element 0] : | array_flow.rb:1209:5:1209:5 | b [element 0] : | +| array_flow.rb:1209:9:1209:21 | call to slice [element 2] : | array_flow.rb:1209:5:1209:5 | b [element 2] : | +| array_flow.rb:1209:9:1209:21 | call to slice [element 2] : | array_flow.rb:1209:5:1209:5 | b [element 2] : | | array_flow.rb:1210:10:1210:10 | b [element 0] : | array_flow.rb:1210:10:1210:13 | ...[...] | | array_flow.rb:1210:10:1210:10 | b [element 0] : | array_flow.rb:1210:10:1210:13 | ...[...] | | array_flow.rb:1212:10:1212:10 | b [element 2] : | array_flow.rb:1212:10:1212:13 | ...[...] | | array_flow.rb:1212:10:1212:10 | b [element 2] : | array_flow.rb:1212:10:1212:13 | ...[...] | +| array_flow.rb:1214:5:1214:5 | b [element] : | array_flow.rb:1215:10:1215:10 | b [element] : | +| array_flow.rb:1214:5:1214:5 | b [element] : | array_flow.rb:1215:10:1215:10 | b [element] : | +| array_flow.rb:1214:5:1214:5 | b [element] : | array_flow.rb:1216:10:1216:10 | b [element] : | +| array_flow.rb:1214:5:1214:5 | b [element] : | array_flow.rb:1216:10:1216:10 | b [element] : | | array_flow.rb:1214:9:1214:9 | a [element 2] : | array_flow.rb:1214:9:1214:21 | call to slice [element] : | | array_flow.rb:1214:9:1214:9 | a [element 2] : | array_flow.rb:1214:9:1214:21 | call to slice [element] : | | array_flow.rb:1214:9:1214:9 | a [element 4] : | array_flow.rb:1214:9:1214:21 | call to slice [element] : | | array_flow.rb:1214:9:1214:9 | a [element 4] : | array_flow.rb:1214:9:1214:21 | call to slice [element] : | -| array_flow.rb:1214:9:1214:21 | call to slice [element] : | array_flow.rb:1215:10:1215:10 | b [element] : | -| array_flow.rb:1214:9:1214:21 | call to slice [element] : | array_flow.rb:1215:10:1215:10 | b [element] : | -| array_flow.rb:1214:9:1214:21 | call to slice [element] : | array_flow.rb:1216:10:1216:10 | b [element] : | -| array_flow.rb:1214:9:1214:21 | call to slice [element] : | array_flow.rb:1216:10:1216:10 | b [element] : | +| array_flow.rb:1214:9:1214:21 | call to slice [element] : | array_flow.rb:1214:5:1214:5 | b [element] : | +| array_flow.rb:1214:9:1214:21 | call to slice [element] : | array_flow.rb:1214:5:1214:5 | b [element] : | | array_flow.rb:1215:10:1215:10 | b [element] : | array_flow.rb:1215:10:1215:13 | ...[...] | | array_flow.rb:1215:10:1215:10 | b [element] : | array_flow.rb:1215:10:1215:13 | ...[...] | | array_flow.rb:1216:10:1216:10 | b [element] : | array_flow.rb:1216:10:1216:13 | ...[...] | | array_flow.rb:1216:10:1216:10 | b [element] : | array_flow.rb:1216:10:1216:13 | ...[...] | +| array_flow.rb:1218:5:1218:5 | b [element 0] : | array_flow.rb:1219:10:1219:10 | b [element 0] : | +| array_flow.rb:1218:5:1218:5 | b [element 0] : | array_flow.rb:1219:10:1219:10 | b [element 0] : | | array_flow.rb:1218:9:1218:9 | a [element 2] : | array_flow.rb:1218:9:1218:21 | call to slice [element 0] : | | array_flow.rb:1218:9:1218:9 | a [element 2] : | array_flow.rb:1218:9:1218:21 | call to slice [element 0] : | -| array_flow.rb:1218:9:1218:21 | call to slice [element 0] : | array_flow.rb:1219:10:1219:10 | b [element 0] : | -| array_flow.rb:1218:9:1218:21 | call to slice [element 0] : | array_flow.rb:1219:10:1219:10 | b [element 0] : | +| array_flow.rb:1218:9:1218:21 | call to slice [element 0] : | array_flow.rb:1218:5:1218:5 | b [element 0] : | +| array_flow.rb:1218:9:1218:21 | call to slice [element 0] : | array_flow.rb:1218:5:1218:5 | b [element 0] : | | array_flow.rb:1219:10:1219:10 | b [element 0] : | array_flow.rb:1219:10:1219:13 | ...[...] | | array_flow.rb:1219:10:1219:10 | b [element 0] : | array_flow.rb:1219:10:1219:13 | ...[...] | +| array_flow.rb:1223:5:1223:5 | b [element 0] : | array_flow.rb:1224:10:1224:10 | b [element 0] : | +| array_flow.rb:1223:5:1223:5 | b [element 0] : | array_flow.rb:1224:10:1224:10 | b [element 0] : | | array_flow.rb:1223:9:1223:9 | a [element 2] : | array_flow.rb:1223:9:1223:22 | call to slice [element 0] : | | array_flow.rb:1223:9:1223:9 | a [element 2] : | array_flow.rb:1223:9:1223:22 | call to slice [element 0] : | -| array_flow.rb:1223:9:1223:22 | call to slice [element 0] : | array_flow.rb:1224:10:1224:10 | b [element 0] : | -| array_flow.rb:1223:9:1223:22 | call to slice [element 0] : | array_flow.rb:1224:10:1224:10 | b [element 0] : | +| array_flow.rb:1223:9:1223:22 | call to slice [element 0] : | array_flow.rb:1223:5:1223:5 | b [element 0] : | +| array_flow.rb:1223:9:1223:22 | call to slice [element 0] : | array_flow.rb:1223:5:1223:5 | b [element 0] : | | array_flow.rb:1224:10:1224:10 | b [element 0] : | array_flow.rb:1224:10:1224:13 | ...[...] | | array_flow.rb:1224:10:1224:10 | b [element 0] : | array_flow.rb:1224:10:1224:13 | ...[...] | +| array_flow.rb:1228:5:1228:5 | b [element] : | array_flow.rb:1229:10:1229:10 | b [element] : | +| array_flow.rb:1228:5:1228:5 | b [element] : | array_flow.rb:1229:10:1229:10 | b [element] : | +| array_flow.rb:1228:5:1228:5 | b [element] : | array_flow.rb:1230:10:1230:10 | b [element] : | +| array_flow.rb:1228:5:1228:5 | b [element] : | array_flow.rb:1230:10:1230:10 | b [element] : | | array_flow.rb:1228:9:1228:9 | a [element 2] : | array_flow.rb:1228:9:1228:21 | call to slice [element] : | | array_flow.rb:1228:9:1228:9 | a [element 2] : | array_flow.rb:1228:9:1228:21 | call to slice [element] : | | array_flow.rb:1228:9:1228:9 | a [element 4] : | array_flow.rb:1228:9:1228:21 | call to slice [element] : | | array_flow.rb:1228:9:1228:9 | a [element 4] : | array_flow.rb:1228:9:1228:21 | call to slice [element] : | -| array_flow.rb:1228:9:1228:21 | call to slice [element] : | array_flow.rb:1229:10:1229:10 | b [element] : | -| array_flow.rb:1228:9:1228:21 | call to slice [element] : | array_flow.rb:1229:10:1229:10 | b [element] : | -| array_flow.rb:1228:9:1228:21 | call to slice [element] : | array_flow.rb:1230:10:1230:10 | b [element] : | -| array_flow.rb:1228:9:1228:21 | call to slice [element] : | array_flow.rb:1230:10:1230:10 | b [element] : | +| array_flow.rb:1228:9:1228:21 | call to slice [element] : | array_flow.rb:1228:5:1228:5 | b [element] : | +| array_flow.rb:1228:9:1228:21 | call to slice [element] : | array_flow.rb:1228:5:1228:5 | b [element] : | | array_flow.rb:1229:10:1229:10 | b [element] : | array_flow.rb:1229:10:1229:13 | ...[...] | | array_flow.rb:1229:10:1229:10 | b [element] : | array_flow.rb:1229:10:1229:13 | ...[...] | | array_flow.rb:1230:10:1230:10 | b [element] : | array_flow.rb:1230:10:1230:13 | ...[...] | | array_flow.rb:1230:10:1230:10 | b [element] : | array_flow.rb:1230:10:1230:13 | ...[...] | +| array_flow.rb:1232:5:1232:5 | b [element] : | array_flow.rb:1233:10:1233:10 | b [element] : | +| array_flow.rb:1232:5:1232:5 | b [element] : | array_flow.rb:1233:10:1233:10 | b [element] : | +| array_flow.rb:1232:5:1232:5 | b [element] : | array_flow.rb:1234:10:1234:10 | b [element] : | +| array_flow.rb:1232:5:1232:5 | b [element] : | array_flow.rb:1234:10:1234:10 | b [element] : | | array_flow.rb:1232:9:1232:9 | a [element 2] : | array_flow.rb:1232:9:1232:24 | call to slice [element] : | | array_flow.rb:1232:9:1232:9 | a [element 2] : | array_flow.rb:1232:9:1232:24 | call to slice [element] : | | array_flow.rb:1232:9:1232:9 | a [element 4] : | array_flow.rb:1232:9:1232:24 | call to slice [element] : | | array_flow.rb:1232:9:1232:9 | a [element 4] : | array_flow.rb:1232:9:1232:24 | call to slice [element] : | -| array_flow.rb:1232:9:1232:24 | call to slice [element] : | array_flow.rb:1233:10:1233:10 | b [element] : | -| array_flow.rb:1232:9:1232:24 | call to slice [element] : | array_flow.rb:1233:10:1233:10 | b [element] : | -| array_flow.rb:1232:9:1232:24 | call to slice [element] : | array_flow.rb:1234:10:1234:10 | b [element] : | -| array_flow.rb:1232:9:1232:24 | call to slice [element] : | array_flow.rb:1234:10:1234:10 | b [element] : | +| array_flow.rb:1232:9:1232:24 | call to slice [element] : | array_flow.rb:1232:5:1232:5 | b [element] : | +| array_flow.rb:1232:9:1232:24 | call to slice [element] : | array_flow.rb:1232:5:1232:5 | b [element] : | | array_flow.rb:1233:10:1233:10 | b [element] : | array_flow.rb:1233:10:1233:13 | ...[...] | | array_flow.rb:1233:10:1233:10 | b [element] : | array_flow.rb:1233:10:1233:13 | ...[...] | | array_flow.rb:1234:10:1234:10 | b [element] : | array_flow.rb:1234:10:1234:13 | ...[...] | | array_flow.rb:1234:10:1234:10 | b [element] : | array_flow.rb:1234:10:1234:13 | ...[...] | +| array_flow.rb:1236:5:1236:5 | b [element 2] : | array_flow.rb:1239:10:1239:10 | b [element 2] : | +| array_flow.rb:1236:5:1236:5 | b [element 2] : | array_flow.rb:1239:10:1239:10 | b [element 2] : | | array_flow.rb:1236:9:1236:9 | a [element 2] : | array_flow.rb:1236:9:1236:20 | call to slice [element 2] : | | array_flow.rb:1236:9:1236:9 | a [element 2] : | array_flow.rb:1236:9:1236:20 | call to slice [element 2] : | -| array_flow.rb:1236:9:1236:20 | call to slice [element 2] : | array_flow.rb:1239:10:1239:10 | b [element 2] : | -| array_flow.rb:1236:9:1236:20 | call to slice [element 2] : | array_flow.rb:1239:10:1239:10 | b [element 2] : | +| array_flow.rb:1236:9:1236:20 | call to slice [element 2] : | array_flow.rb:1236:5:1236:5 | b [element 2] : | +| array_flow.rb:1236:9:1236:20 | call to slice [element 2] : | array_flow.rb:1236:5:1236:5 | b [element 2] : | | array_flow.rb:1239:10:1239:10 | b [element 2] : | array_flow.rb:1239:10:1239:13 | ...[...] | | array_flow.rb:1239:10:1239:10 | b [element 2] : | array_flow.rb:1239:10:1239:13 | ...[...] | +| array_flow.rb:1241:5:1241:5 | b [element] : | array_flow.rb:1242:10:1242:10 | b [element] : | +| array_flow.rb:1241:5:1241:5 | b [element] : | array_flow.rb:1242:10:1242:10 | b [element] : | +| array_flow.rb:1241:5:1241:5 | b [element] : | array_flow.rb:1243:10:1243:10 | b [element] : | +| array_flow.rb:1241:5:1241:5 | b [element] : | array_flow.rb:1243:10:1243:10 | b [element] : | +| array_flow.rb:1241:5:1241:5 | b [element] : | array_flow.rb:1244:10:1244:10 | b [element] : | +| array_flow.rb:1241:5:1241:5 | b [element] : | array_flow.rb:1244:10:1244:10 | b [element] : | | array_flow.rb:1241:9:1241:9 | a [element 2] : | array_flow.rb:1241:9:1241:20 | call to slice [element] : | | array_flow.rb:1241:9:1241:9 | a [element 2] : | array_flow.rb:1241:9:1241:20 | call to slice [element] : | | array_flow.rb:1241:9:1241:9 | a [element 4] : | array_flow.rb:1241:9:1241:20 | call to slice [element] : | | array_flow.rb:1241:9:1241:9 | a [element 4] : | array_flow.rb:1241:9:1241:20 | call to slice [element] : | -| array_flow.rb:1241:9:1241:20 | call to slice [element] : | array_flow.rb:1242:10:1242:10 | b [element] : | -| array_flow.rb:1241:9:1241:20 | call to slice [element] : | array_flow.rb:1242:10:1242:10 | b [element] : | -| array_flow.rb:1241:9:1241:20 | call to slice [element] : | array_flow.rb:1243:10:1243:10 | b [element] : | -| array_flow.rb:1241:9:1241:20 | call to slice [element] : | array_flow.rb:1243:10:1243:10 | b [element] : | -| array_flow.rb:1241:9:1241:20 | call to slice [element] : | array_flow.rb:1244:10:1244:10 | b [element] : | -| array_flow.rb:1241:9:1241:20 | call to slice [element] : | array_flow.rb:1244:10:1244:10 | b [element] : | +| array_flow.rb:1241:9:1241:20 | call to slice [element] : | array_flow.rb:1241:5:1241:5 | b [element] : | +| array_flow.rb:1241:9:1241:20 | call to slice [element] : | array_flow.rb:1241:5:1241:5 | b [element] : | | array_flow.rb:1242:10:1242:10 | b [element] : | array_flow.rb:1242:10:1242:13 | ...[...] | | array_flow.rb:1242:10:1242:10 | b [element] : | array_flow.rb:1242:10:1242:13 | ...[...] | | array_flow.rb:1243:10:1243:10 | b [element] : | array_flow.rb:1243:10:1243:13 | ...[...] | | array_flow.rb:1243:10:1243:10 | b [element] : | array_flow.rb:1243:10:1243:13 | ...[...] | | array_flow.rb:1244:10:1244:10 | b [element] : | array_flow.rb:1244:10:1244:13 | ...[...] | | array_flow.rb:1244:10:1244:10 | b [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 [element 2] : | -| array_flow.rb:1248:16:1248:28 | call to source : | array_flow.rb:1249:9:1249:9 | a [element 2] : | -| array_flow.rb:1248:34:1248:46 | call to source : | array_flow.rb:1249:9:1249:9 | a [element 4] : | -| array_flow.rb:1248:34:1248:46 | call to source : | array_flow.rb:1249:9:1249:9 | a [element 4] : | +| array_flow.rb:1248:5:1248:5 | a [element 2] : | array_flow.rb:1249:9:1249:9 | a [element 2] : | +| array_flow.rb:1248:5:1248:5 | a [element 2] : | array_flow.rb:1249:9:1249:9 | a [element 2] : | +| array_flow.rb:1248:5:1248:5 | a [element 4] : | array_flow.rb:1249:9:1249:9 | a [element 4] : | +| array_flow.rb:1248:5:1248:5 | a [element 4] : | array_flow.rb:1249:9:1249:9 | a [element 4] : | +| array_flow.rb:1248:16:1248:28 | call to source : | array_flow.rb:1248:5:1248:5 | a [element 2] : | +| array_flow.rb:1248:16:1248:28 | call to source : | array_flow.rb:1248:5:1248:5 | a [element 2] : | +| array_flow.rb:1248:34:1248:46 | call to source : | array_flow.rb:1248:5:1248:5 | a [element 4] : | +| array_flow.rb:1248:34:1248:46 | call to source : | array_flow.rb:1248:5:1248:5 | a [element 4] : | +| array_flow.rb:1249:5:1249:5 | b : | array_flow.rb:1250:10:1250:10 | b | +| array_flow.rb:1249:5:1249:5 | b : | array_flow.rb:1250:10:1250:10 | b | | array_flow.rb:1249:9:1249:9 | [post] a [element 3] : | array_flow.rb:1254:10:1254:10 | a [element 3] : | | array_flow.rb:1249:9:1249:9 | [post] a [element 3] : | array_flow.rb:1254:10:1254:10 | a [element 3] : | | array_flow.rb:1249:9:1249:9 | a [element 2] : | array_flow.rb:1249:9:1249:19 | call to slice! : | | array_flow.rb:1249:9:1249:9 | a [element 2] : | array_flow.rb:1249:9:1249:19 | call to slice! : | | array_flow.rb:1249:9:1249:9 | a [element 4] : | array_flow.rb:1249:9:1249:9 | [post] a [element 3] : | | array_flow.rb:1249:9:1249:9 | a [element 4] : | array_flow.rb:1249:9:1249:9 | [post] a [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:1249:9:1249:19 | call to slice! : | array_flow.rb:1249:5:1249:5 | b : | +| array_flow.rb:1249:9:1249:19 | call to slice! : | array_flow.rb:1249:5:1249:5 | b : | | array_flow.rb:1254:10:1254:10 | a [element 3] : | array_flow.rb:1254:10:1254:13 | ...[...] | | array_flow.rb:1254:10:1254:10 | a [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 [element 2] : | -| array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1257:9:1257:9 | a [element 2] : | -| array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1257:9:1257:9 | a [element 4] : | -| array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1257:9:1257:9 | a [element 4] : | +| array_flow.rb:1256:5:1256:5 | a [element 2] : | array_flow.rb:1257:9:1257:9 | a [element 2] : | +| array_flow.rb:1256:5:1256:5 | a [element 2] : | array_flow.rb:1257:9:1257:9 | a [element 2] : | +| array_flow.rb:1256:5:1256:5 | a [element 4] : | array_flow.rb:1257:9:1257:9 | a [element 4] : | +| array_flow.rb:1256:5:1256:5 | a [element 4] : | array_flow.rb:1257:9:1257:9 | a [element 4] : | +| array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1256:5:1256:5 | a [element 2] : | +| array_flow.rb:1256:16:1256:28 | call to source : | array_flow.rb:1256:5:1256:5 | a [element 2] : | +| array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1256:5:1256:5 | a [element 4] : | +| array_flow.rb:1256:34:1256:46 | call to source : | array_flow.rb:1256:5:1256:5 | a [element 4] : | +| array_flow.rb:1257:5:1257:5 | b : | array_flow.rb:1263:10:1263:10 | b | +| array_flow.rb:1257:5:1257:5 | b : | array_flow.rb:1263:10:1263:10 | b | +| array_flow.rb:1257:5:1257:5 | b : | array_flow.rb:1265:10:1265:10 | b : | +| array_flow.rb:1257:5:1257:5 | b [element] : | array_flow.rb:1265:10:1265:10 | b [element] : | +| array_flow.rb:1257:5:1257:5 | b [element] : | array_flow.rb:1265:10:1265:10 | b [element] : | | array_flow.rb:1257:9:1257:9 | [post] a [element] : | array_flow.rb:1258:10:1258:10 | a [element] : | | array_flow.rb:1257:9:1257:9 | [post] a [element] : | array_flow.rb:1258:10:1258:10 | a [element] : | | array_flow.rb:1257:9:1257:9 | [post] a [element] : | array_flow.rb:1259:10:1259:10 | a [element] : | @@ -2571,11 +3195,10 @@ edges | array_flow.rb:1257:9:1257:9 | a [element 4] : | array_flow.rb:1257:9:1257:19 | call to slice! : | | array_flow.rb:1257:9:1257:9 | a [element 4] : | array_flow.rb:1257:9:1257:19 | call to slice! [element] : | | array_flow.rb:1257:9:1257:9 | a [element 4] : | array_flow.rb:1257:9:1257:19 | call to slice! [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! [element] : | array_flow.rb:1265:10:1265:10 | b [element] : | -| array_flow.rb:1257:9:1257:19 | call to slice! [element] : | array_flow.rb:1265:10:1265:10 | b [element] : | +| array_flow.rb:1257:9:1257:19 | call to slice! : | array_flow.rb:1257:5:1257:5 | b : | +| array_flow.rb:1257:9:1257:19 | call to slice! : | array_flow.rb:1257:5:1257:5 | b : | +| array_flow.rb:1257:9:1257:19 | call to slice! [element] : | array_flow.rb:1257:5:1257:5 | b [element] : | +| array_flow.rb:1257:9:1257:19 | call to slice! [element] : | array_flow.rb:1257:5:1257:5 | b [element] : | | array_flow.rb:1258:10:1258:10 | a [element] : | array_flow.rb:1258:10:1258:13 | ...[...] | | array_flow.rb:1258:10:1258:10 | a [element] : | array_flow.rb:1258:10:1258:13 | ...[...] | | array_flow.rb:1259:10:1259:10 | a [element] : | array_flow.rb:1259:10:1259:13 | ...[...] | @@ -2587,58 +3210,88 @@ edges | array_flow.rb:1265:10:1265:10 | b : | array_flow.rb:1265:10:1265:13 | ...[...] | | array_flow.rb:1265:10:1265:10 | b [element] : | array_flow.rb:1265:10:1265:13 | ...[...] | | array_flow.rb:1265:10:1265:10 | b [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 [element 2] : | -| array_flow.rb:1267:16:1267:28 | call to source : | array_flow.rb:1268:9:1268:9 | a [element 2] : | -| array_flow.rb:1267:34:1267:46 | call to source : | array_flow.rb:1268:9:1268:9 | a [element 4] : | -| array_flow.rb:1267:34:1267:46 | call to source : | array_flow.rb:1268:9:1268:9 | a [element 4] : | +| array_flow.rb:1267:5:1267:5 | a [element 2] : | array_flow.rb:1268:9:1268:9 | a [element 2] : | +| array_flow.rb:1267:5:1267:5 | a [element 2] : | array_flow.rb:1268:9:1268:9 | a [element 2] : | +| array_flow.rb:1267:5:1267:5 | a [element 4] : | array_flow.rb:1268:9:1268:9 | a [element 4] : | +| array_flow.rb:1267:5:1267:5 | a [element 4] : | array_flow.rb:1268:9:1268:9 | a [element 4] : | +| array_flow.rb:1267:16:1267:28 | call to source : | array_flow.rb:1267:5:1267:5 | a [element 2] : | +| array_flow.rb:1267:16:1267:28 | call to source : | array_flow.rb:1267:5:1267:5 | a [element 2] : | +| array_flow.rb:1267:34:1267:46 | call to source : | array_flow.rb:1267:5:1267:5 | a [element 4] : | +| array_flow.rb:1267:34:1267:46 | call to source : | array_flow.rb:1267:5:1267:5 | a [element 4] : | +| array_flow.rb:1268:5:1268:5 | b [element 0] : | array_flow.rb:1269:10:1269:10 | b [element 0] : | +| array_flow.rb:1268:5:1268:5 | b [element 0] : | array_flow.rb:1269:10:1269:10 | b [element 0] : | +| array_flow.rb:1268:5:1268:5 | b [element 2] : | array_flow.rb:1271:10:1271:10 | b [element 2] : | +| array_flow.rb:1268:5:1268:5 | b [element 2] : | array_flow.rb:1271:10:1271:10 | b [element 2] : | | array_flow.rb:1268:9:1268:9 | a [element 2] : | array_flow.rb:1268:9:1268:22 | call to slice! [element 0] : | | array_flow.rb:1268:9:1268:9 | a [element 2] : | array_flow.rb:1268:9:1268:22 | call to slice! [element 0] : | | array_flow.rb:1268:9:1268:9 | a [element 4] : | array_flow.rb:1268:9:1268:22 | call to slice! [element 2] : | | array_flow.rb:1268:9:1268:9 | a [element 4] : | array_flow.rb:1268:9:1268:22 | call to slice! [element 2] : | -| array_flow.rb:1268:9:1268:22 | call to slice! [element 0] : | array_flow.rb:1269:10:1269:10 | b [element 0] : | -| array_flow.rb:1268:9:1268:22 | call to slice! [element 0] : | array_flow.rb:1269:10:1269:10 | b [element 0] : | -| array_flow.rb:1268:9:1268:22 | call to slice! [element 2] : | array_flow.rb:1271:10:1271:10 | b [element 2] : | -| array_flow.rb:1268:9:1268:22 | call to slice! [element 2] : | array_flow.rb:1271:10:1271:10 | b [element 2] : | +| array_flow.rb:1268:9:1268:22 | call to slice! [element 0] : | array_flow.rb:1268:5:1268:5 | b [element 0] : | +| array_flow.rb:1268:9:1268:22 | call to slice! [element 0] : | array_flow.rb:1268:5:1268:5 | b [element 0] : | +| array_flow.rb:1268:9:1268:22 | call to slice! [element 2] : | array_flow.rb:1268:5:1268:5 | b [element 2] : | +| array_flow.rb:1268:9:1268:22 | call to slice! [element 2] : | array_flow.rb:1268:5:1268:5 | b [element 2] : | | array_flow.rb:1269:10:1269:10 | b [element 0] : | array_flow.rb:1269:10:1269:13 | ...[...] | | array_flow.rb:1269:10:1269:10 | b [element 0] : | array_flow.rb:1269:10:1269:13 | ...[...] | | array_flow.rb:1271:10:1271:10 | b [element 2] : | array_flow.rb:1271:10:1271:13 | ...[...] | | array_flow.rb:1271:10:1271:10 | b [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 [element 2] : | -| array_flow.rb:1278:16:1278:28 | call to source : | array_flow.rb:1279:9:1279:9 | a [element 2] : | -| array_flow.rb:1278:34:1278:46 | call to source : | array_flow.rb:1279:9:1279:9 | a [element 4] : | -| array_flow.rb:1278:34:1278:46 | call to source : | array_flow.rb:1279:9:1279:9 | a [element 4] : | +| array_flow.rb:1278:5:1278:5 | a [element 2] : | array_flow.rb:1279:9:1279:9 | a [element 2] : | +| array_flow.rb:1278:5:1278:5 | a [element 2] : | array_flow.rb:1279:9:1279:9 | a [element 2] : | +| array_flow.rb:1278:5:1278:5 | a [element 4] : | array_flow.rb:1279:9:1279:9 | a [element 4] : | +| array_flow.rb:1278:5:1278:5 | a [element 4] : | array_flow.rb:1279:9:1279:9 | a [element 4] : | +| array_flow.rb:1278:16:1278:28 | call to source : | array_flow.rb:1278:5:1278:5 | a [element 2] : | +| array_flow.rb:1278:16:1278:28 | call to source : | array_flow.rb:1278:5:1278:5 | a [element 2] : | +| array_flow.rb:1278:34:1278:46 | call to source : | array_flow.rb:1278:5:1278:5 | a [element 4] : | +| array_flow.rb:1278:34:1278:46 | call to source : | array_flow.rb:1278:5:1278:5 | a [element 4] : | +| array_flow.rb:1279:5:1279:5 | b [element 0] : | array_flow.rb:1280:10:1280:10 | b [element 0] : | +| array_flow.rb:1279:5:1279:5 | b [element 0] : | array_flow.rb:1280:10:1280:10 | b [element 0] : | | array_flow.rb:1279:9:1279:9 | [post] a [element 2] : | array_flow.rb:1285:10:1285:10 | a [element 2] : | | array_flow.rb:1279:9:1279:9 | [post] a [element 2] : | array_flow.rb:1285:10:1285:10 | a [element 2] : | | array_flow.rb:1279:9:1279:9 | a [element 2] : | array_flow.rb:1279:9:1279:22 | call to slice! [element 0] : | | array_flow.rb:1279:9:1279:9 | a [element 2] : | array_flow.rb:1279:9:1279:22 | call to slice! [element 0] : | | array_flow.rb:1279:9:1279:9 | a [element 4] : | array_flow.rb:1279:9:1279:9 | [post] a [element 2] : | | array_flow.rb:1279:9:1279:9 | a [element 4] : | array_flow.rb:1279:9:1279:9 | [post] a [element 2] : | -| array_flow.rb:1279:9:1279:22 | call to slice! [element 0] : | array_flow.rb:1280:10:1280:10 | b [element 0] : | -| array_flow.rb:1279:9:1279:22 | call to slice! [element 0] : | array_flow.rb:1280:10:1280:10 | b [element 0] : | +| array_flow.rb:1279:9:1279:22 | call to slice! [element 0] : | array_flow.rb:1279:5:1279:5 | b [element 0] : | +| array_flow.rb:1279:9:1279:22 | call to slice! [element 0] : | array_flow.rb:1279:5:1279:5 | b [element 0] : | | array_flow.rb:1280:10:1280:10 | b [element 0] : | array_flow.rb:1280:10:1280:13 | ...[...] | | array_flow.rb:1280:10:1280:10 | b [element 0] : | array_flow.rb:1280:10:1280:13 | ...[...] | | array_flow.rb:1285:10:1285:10 | a [element 2] : | array_flow.rb:1285:10:1285:13 | ...[...] | | array_flow.rb:1285:10:1285:10 | a [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 [element 2] : | -| array_flow.rb:1289:16:1289:28 | call to source : | array_flow.rb:1290:9:1290:9 | a [element 2] : | -| array_flow.rb:1289:34:1289:46 | call to source : | array_flow.rb:1290:9:1290:9 | a [element 4] : | -| array_flow.rb:1289:34:1289:46 | call to source : | array_flow.rb:1290:9:1290:9 | a [element 4] : | +| array_flow.rb:1289:5:1289:5 | a [element 2] : | array_flow.rb:1290:9:1290:9 | a [element 2] : | +| array_flow.rb:1289:5:1289:5 | a [element 2] : | array_flow.rb:1290:9:1290:9 | a [element 2] : | +| array_flow.rb:1289:5:1289:5 | a [element 4] : | array_flow.rb:1290:9:1290:9 | a [element 4] : | +| array_flow.rb:1289:5:1289:5 | a [element 4] : | array_flow.rb:1290:9:1290:9 | a [element 4] : | +| array_flow.rb:1289:16:1289:28 | call to source : | array_flow.rb:1289:5:1289:5 | a [element 2] : | +| array_flow.rb:1289:16:1289:28 | call to source : | array_flow.rb:1289:5:1289:5 | a [element 2] : | +| array_flow.rb:1289:34:1289:46 | call to source : | array_flow.rb:1289:5:1289:5 | a [element 4] : | +| array_flow.rb:1289:34:1289:46 | call to source : | array_flow.rb:1289:5:1289:5 | a [element 4] : | +| array_flow.rb:1290:5:1290:5 | b [element 0] : | array_flow.rb:1291:10:1291:10 | b [element 0] : | +| array_flow.rb:1290:5:1290:5 | b [element 0] : | array_flow.rb:1291:10:1291:10 | b [element 0] : | | array_flow.rb:1290:9:1290:9 | [post] a [element 2] : | array_flow.rb:1296:10:1296:10 | a [element 2] : | | array_flow.rb:1290:9:1290:9 | [post] a [element 2] : | array_flow.rb:1296:10:1296:10 | a [element 2] : | | array_flow.rb:1290:9:1290:9 | a [element 2] : | array_flow.rb:1290:9:1290:23 | call to slice! [element 0] : | | array_flow.rb:1290:9:1290:9 | a [element 2] : | array_flow.rb:1290:9:1290:23 | call to slice! [element 0] : | | array_flow.rb:1290:9:1290:9 | a [element 4] : | array_flow.rb:1290:9:1290:9 | [post] a [element 2] : | | array_flow.rb:1290:9:1290:9 | a [element 4] : | array_flow.rb:1290:9:1290:9 | [post] a [element 2] : | -| array_flow.rb:1290:9:1290:23 | call to slice! [element 0] : | array_flow.rb:1291:10:1291:10 | b [element 0] : | -| array_flow.rb:1290:9:1290:23 | call to slice! [element 0] : | array_flow.rb:1291:10:1291:10 | b [element 0] : | +| array_flow.rb:1290:9:1290:23 | call to slice! [element 0] : | array_flow.rb:1290:5:1290:5 | b [element 0] : | +| array_flow.rb:1290:9:1290:23 | call to slice! [element 0] : | array_flow.rb:1290:5:1290:5 | b [element 0] : | | array_flow.rb:1291:10:1291:10 | b [element 0] : | array_flow.rb:1291:10:1291:13 | ...[...] | | array_flow.rb:1291:10:1291:10 | b [element 0] : | array_flow.rb:1291:10:1291:13 | ...[...] | | array_flow.rb:1296:10:1296:10 | a [element 2] : | array_flow.rb:1296:10:1296:13 | ...[...] | | array_flow.rb:1296:10:1296:10 | a [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 [element 2] : | -| array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1301:9:1301:9 | a [element 2] : | -| array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1301:9:1301:9 | a [element 4] : | -| array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1301:9:1301:9 | a [element 4] : | +| array_flow.rb:1300:5:1300:5 | a [element 2] : | array_flow.rb:1301:9:1301:9 | a [element 2] : | +| array_flow.rb:1300:5:1300:5 | a [element 2] : | array_flow.rb:1301:9:1301:9 | a [element 2] : | +| array_flow.rb:1300:5:1300:5 | a [element 4] : | array_flow.rb:1301:9:1301:9 | a [element 4] : | +| array_flow.rb:1300:5:1300:5 | a [element 4] : | array_flow.rb:1301:9:1301:9 | a [element 4] : | +| array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1300:5:1300:5 | a [element 2] : | +| array_flow.rb:1300:16:1300:28 | call to source : | array_flow.rb:1300:5:1300:5 | a [element 2] : | +| array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1300:5:1300:5 | a [element 4] : | +| array_flow.rb:1300:34:1300:46 | call to source : | array_flow.rb:1300:5:1300:5 | a [element 4] : | +| array_flow.rb:1301:5:1301:5 | b [element] : | array_flow.rb:1302:10:1302:10 | b [element] : | +| array_flow.rb:1301:5:1301:5 | b [element] : | array_flow.rb:1302:10:1302:10 | b [element] : | +| array_flow.rb:1301:5:1301:5 | b [element] : | array_flow.rb:1303:10:1303:10 | b [element] : | +| array_flow.rb:1301:5:1301:5 | b [element] : | array_flow.rb:1303:10:1303:10 | b [element] : | +| array_flow.rb:1301:5:1301:5 | b [element] : | array_flow.rb:1304:10:1304:10 | b [element] : | +| array_flow.rb:1301:5:1301:5 | b [element] : | array_flow.rb:1304:10:1304:10 | b [element] : | | array_flow.rb:1301:9:1301:9 | [post] a [element] : | array_flow.rb:1305:10:1305:10 | a [element] : | | array_flow.rb:1301:9:1301:9 | [post] a [element] : | array_flow.rb:1305:10:1305:10 | a [element] : | | array_flow.rb:1301:9:1301:9 | [post] a [element] : | array_flow.rb:1306:10:1306:10 | a [element] : | @@ -2653,12 +3306,8 @@ edges | array_flow.rb:1301:9:1301:9 | a [element 4] : | array_flow.rb:1301:9:1301:9 | [post] a [element] : | | array_flow.rb:1301:9:1301:9 | a [element 4] : | array_flow.rb:1301:9:1301:22 | call to slice! [element] : | | array_flow.rb:1301:9:1301:9 | a [element 4] : | array_flow.rb:1301:9:1301:22 | call to slice! [element] : | -| array_flow.rb:1301:9:1301:22 | call to slice! [element] : | array_flow.rb:1302:10:1302:10 | b [element] : | -| array_flow.rb:1301:9:1301:22 | call to slice! [element] : | array_flow.rb:1302:10:1302:10 | b [element] : | -| array_flow.rb:1301:9:1301:22 | call to slice! [element] : | array_flow.rb:1303:10:1303:10 | b [element] : | -| array_flow.rb:1301:9:1301:22 | call to slice! [element] : | array_flow.rb:1303:10:1303:10 | b [element] : | -| array_flow.rb:1301:9:1301:22 | call to slice! [element] : | array_flow.rb:1304:10:1304:10 | b [element] : | -| array_flow.rb:1301:9:1301:22 | call to slice! [element] : | array_flow.rb:1304:10:1304:10 | b [element] : | +| array_flow.rb:1301:9:1301:22 | call to slice! [element] : | array_flow.rb:1301:5:1301:5 | b [element] : | +| array_flow.rb:1301:9:1301:22 | call to slice! [element] : | array_flow.rb:1301:5:1301:5 | b [element] : | | array_flow.rb:1302:10:1302:10 | b [element] : | array_flow.rb:1302:10:1302:13 | ...[...] | | array_flow.rb:1302:10:1302:10 | b [element] : | array_flow.rb:1302:10:1302:13 | ...[...] | | array_flow.rb:1303:10:1303:10 | b [element] : | array_flow.rb:1303:10:1303:13 | ...[...] | @@ -2671,10 +3320,20 @@ edges | array_flow.rb:1306:10:1306:10 | a [element] : | array_flow.rb:1306:10:1306:13 | ...[...] | | array_flow.rb:1307:10:1307:10 | a [element] : | array_flow.rb:1307:10:1307:13 | ...[...] | | array_flow.rb:1307:10:1307:10 | a [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 [element 2] : | -| array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1310:9:1310:9 | a [element 2] : | -| array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1310:9:1310:9 | a [element 4] : | -| array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1310:9:1310:9 | a [element 4] : | +| array_flow.rb:1309:5:1309:5 | a [element 2] : | array_flow.rb:1310:9:1310:9 | a [element 2] : | +| array_flow.rb:1309:5:1309:5 | a [element 2] : | array_flow.rb:1310:9:1310:9 | a [element 2] : | +| array_flow.rb:1309:5:1309:5 | a [element 4] : | array_flow.rb:1310:9:1310:9 | a [element 4] : | +| array_flow.rb:1309:5:1309:5 | a [element 4] : | array_flow.rb:1310:9:1310:9 | a [element 4] : | +| array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1309:5:1309:5 | a [element 2] : | +| array_flow.rb:1309:16:1309:28 | call to source : | array_flow.rb:1309:5:1309:5 | a [element 2] : | +| array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1309:5:1309:5 | a [element 4] : | +| array_flow.rb:1309:34:1309:46 | call to source : | array_flow.rb:1309:5:1309:5 | a [element 4] : | +| array_flow.rb:1310:5:1310:5 | b [element] : | array_flow.rb:1311:10:1311:10 | b [element] : | +| array_flow.rb:1310:5:1310:5 | b [element] : | array_flow.rb:1311:10:1311:10 | b [element] : | +| array_flow.rb:1310:5:1310:5 | b [element] : | array_flow.rb:1312:10:1312:10 | b [element] : | +| array_flow.rb:1310:5:1310:5 | b [element] : | array_flow.rb:1312:10:1312:10 | b [element] : | +| array_flow.rb:1310:5:1310:5 | b [element] : | array_flow.rb:1313:10:1313:10 | b [element] : | +| array_flow.rb:1310:5:1310:5 | b [element] : | array_flow.rb:1313:10:1313:10 | b [element] : | | array_flow.rb:1310:9:1310:9 | [post] a [element] : | array_flow.rb:1314:10:1314:10 | a [element] : | | array_flow.rb:1310:9:1310:9 | [post] a [element] : | array_flow.rb:1314:10:1314:10 | a [element] : | | array_flow.rb:1310:9:1310:9 | [post] a [element] : | array_flow.rb:1315:10:1315:10 | a [element] : | @@ -2689,12 +3348,8 @@ edges | array_flow.rb:1310:9:1310:9 | a [element 4] : | array_flow.rb:1310:9:1310:9 | [post] a [element] : | | array_flow.rb:1310:9:1310:9 | a [element 4] : | array_flow.rb:1310:9:1310:22 | call to slice! [element] : | | array_flow.rb:1310:9:1310:9 | a [element 4] : | array_flow.rb:1310:9:1310:22 | call to slice! [element] : | -| array_flow.rb:1310:9:1310:22 | call to slice! [element] : | array_flow.rb:1311:10:1311:10 | b [element] : | -| array_flow.rb:1310:9:1310:22 | call to slice! [element] : | array_flow.rb:1311:10:1311:10 | b [element] : | -| array_flow.rb:1310:9:1310:22 | call to slice! [element] : | array_flow.rb:1312:10:1312:10 | b [element] : | -| array_flow.rb:1310:9:1310:22 | call to slice! [element] : | array_flow.rb:1312:10:1312:10 | b [element] : | -| array_flow.rb:1310:9:1310:22 | call to slice! [element] : | array_flow.rb:1313:10:1313:10 | b [element] : | -| array_flow.rb:1310:9:1310:22 | call to slice! [element] : | array_flow.rb:1313:10:1313:10 | b [element] : | +| array_flow.rb:1310:9:1310:22 | call to slice! [element] : | array_flow.rb:1310:5:1310:5 | b [element] : | +| array_flow.rb:1310:9:1310:22 | call to slice! [element] : | array_flow.rb:1310:5:1310:5 | b [element] : | | array_flow.rb:1311:10:1311:10 | b [element] : | array_flow.rb:1311:10:1311:13 | ...[...] | | array_flow.rb:1311:10:1311:10 | b [element] : | array_flow.rb:1311:10:1311:13 | ...[...] | | array_flow.rb:1312:10:1312:10 | b [element] : | array_flow.rb:1312:10:1312:13 | ...[...] | @@ -2707,10 +3362,20 @@ edges | array_flow.rb:1315:10:1315:10 | a [element] : | array_flow.rb:1315:10:1315:13 | ...[...] | | array_flow.rb:1316:10:1316:10 | a [element] : | array_flow.rb:1316:10:1316:13 | ...[...] | | array_flow.rb:1316:10:1316:10 | a [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 [element 2] : | -| array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1319:9:1319:9 | a [element 2] : | -| array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1319:9:1319:9 | a [element 4] : | -| array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1319:9:1319:9 | a [element 4] : | +| array_flow.rb:1318:5:1318:5 | a [element 2] : | array_flow.rb:1319:9:1319:9 | a [element 2] : | +| array_flow.rb:1318:5:1318:5 | a [element 2] : | array_flow.rb:1319:9:1319:9 | a [element 2] : | +| array_flow.rb:1318:5:1318:5 | a [element 4] : | array_flow.rb:1319:9:1319:9 | a [element 4] : | +| array_flow.rb:1318:5:1318:5 | a [element 4] : | array_flow.rb:1319:9:1319:9 | a [element 4] : | +| array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1318:5:1318:5 | a [element 2] : | +| array_flow.rb:1318:16:1318:28 | call to source : | array_flow.rb:1318:5:1318:5 | a [element 2] : | +| array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1318:5:1318:5 | a [element 4] : | +| array_flow.rb:1318:34:1318:46 | call to source : | array_flow.rb:1318:5:1318:5 | a [element 4] : | +| array_flow.rb:1319:5:1319:5 | b [element] : | array_flow.rb:1320:10:1320:10 | b [element] : | +| array_flow.rb:1319:5:1319:5 | b [element] : | array_flow.rb:1320:10:1320:10 | b [element] : | +| array_flow.rb:1319:5:1319:5 | b [element] : | array_flow.rb:1321:10:1321:10 | b [element] : | +| array_flow.rb:1319:5:1319:5 | b [element] : | array_flow.rb:1321:10:1321:10 | b [element] : | +| array_flow.rb:1319:5:1319:5 | b [element] : | array_flow.rb:1322:10:1322:10 | b [element] : | +| array_flow.rb:1319:5:1319:5 | b [element] : | array_flow.rb:1322:10:1322:10 | b [element] : | | array_flow.rb:1319:9:1319:9 | [post] a [element] : | array_flow.rb:1323:10:1323:10 | a [element] : | | array_flow.rb:1319:9:1319:9 | [post] a [element] : | array_flow.rb:1323:10:1323:10 | a [element] : | | array_flow.rb:1319:9:1319:9 | [post] a [element] : | array_flow.rb:1324:10:1324:10 | a [element] : | @@ -2725,12 +3390,8 @@ edges | array_flow.rb:1319:9:1319:9 | a [element 4] : | array_flow.rb:1319:9:1319:9 | [post] a [element] : | | array_flow.rb:1319:9:1319:9 | a [element 4] : | array_flow.rb:1319:9:1319:25 | call to slice! [element] : | | array_flow.rb:1319:9:1319:9 | a [element 4] : | array_flow.rb:1319:9:1319:25 | call to slice! [element] : | -| array_flow.rb:1319:9:1319:25 | call to slice! [element] : | array_flow.rb:1320:10:1320:10 | b [element] : | -| array_flow.rb:1319:9:1319:25 | call to slice! [element] : | array_flow.rb:1320:10:1320:10 | b [element] : | -| array_flow.rb:1319:9:1319:25 | call to slice! [element] : | array_flow.rb:1321:10:1321:10 | b [element] : | -| array_flow.rb:1319:9:1319:25 | call to slice! [element] : | array_flow.rb:1321:10:1321:10 | b [element] : | -| array_flow.rb:1319:9:1319:25 | call to slice! [element] : | array_flow.rb:1322:10:1322:10 | b [element] : | -| array_flow.rb:1319:9:1319:25 | call to slice! [element] : | array_flow.rb:1322:10:1322:10 | b [element] : | +| array_flow.rb:1319:9:1319:25 | call to slice! [element] : | array_flow.rb:1319:5:1319:5 | b [element] : | +| array_flow.rb:1319:9:1319:25 | call to slice! [element] : | array_flow.rb:1319:5:1319:5 | b [element] : | | array_flow.rb:1320:10:1320:10 | b [element] : | array_flow.rb:1320:10:1320:13 | ...[...] | | array_flow.rb:1320:10:1320:10 | b [element] : | array_flow.rb:1320:10:1320:13 | ...[...] | | array_flow.rb:1321:10:1321:10 | b [element] : | array_flow.rb:1321:10:1321:13 | ...[...] | @@ -2743,26 +3404,42 @@ edges | array_flow.rb:1324:10:1324:10 | a [element] : | array_flow.rb:1324:10:1324:13 | ...[...] | | array_flow.rb:1325:10:1325:10 | a [element] : | array_flow.rb:1325:10:1325:13 | ...[...] | | array_flow.rb:1325:10:1325:10 | a [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 [element 2] : | -| array_flow.rb:1327:16:1327:28 | call to source : | array_flow.rb:1328:9:1328:9 | a [element 2] : | -| array_flow.rb:1327:34:1327:46 | call to source : | array_flow.rb:1328:9:1328:9 | a [element 4] : | -| array_flow.rb:1327:34:1327:46 | call to source : | array_flow.rb:1328:9:1328:9 | a [element 4] : | +| array_flow.rb:1327:5:1327:5 | a [element 2] : | array_flow.rb:1328:9:1328:9 | a [element 2] : | +| array_flow.rb:1327:5:1327:5 | a [element 2] : | array_flow.rb:1328:9:1328:9 | a [element 2] : | +| array_flow.rb:1327:5:1327:5 | a [element 4] : | array_flow.rb:1328:9:1328:9 | a [element 4] : | +| array_flow.rb:1327:5:1327:5 | a [element 4] : | array_flow.rb:1328:9:1328:9 | a [element 4] : | +| array_flow.rb:1327:16:1327:28 | call to source : | array_flow.rb:1327:5:1327:5 | a [element 2] : | +| array_flow.rb:1327:16:1327:28 | call to source : | array_flow.rb:1327:5:1327:5 | a [element 2] : | +| array_flow.rb:1327:34:1327:46 | call to source : | array_flow.rb:1327:5:1327:5 | a [element 4] : | +| array_flow.rb:1327:34:1327:46 | call to source : | array_flow.rb:1327:5:1327:5 | a [element 4] : | +| array_flow.rb:1328:5:1328:5 | b [element 2] : | array_flow.rb:1331:10:1331:10 | b [element 2] : | +| array_flow.rb:1328:5:1328:5 | b [element 2] : | array_flow.rb:1331:10:1331:10 | b [element 2] : | | array_flow.rb:1328:9:1328:9 | [post] a [element 1] : | array_flow.rb:1333:10:1333:10 | a [element 1] : | | array_flow.rb:1328:9:1328:9 | [post] a [element 1] : | array_flow.rb:1333:10:1333:10 | a [element 1] : | | array_flow.rb:1328:9:1328:9 | a [element 2] : | array_flow.rb:1328:9:1328:21 | call to slice! [element 2] : | | array_flow.rb:1328:9:1328:9 | a [element 2] : | array_flow.rb:1328:9:1328:21 | call to slice! [element 2] : | | array_flow.rb:1328:9:1328:9 | a [element 4] : | array_flow.rb:1328:9:1328:9 | [post] a [element 1] : | | array_flow.rb:1328:9:1328:9 | a [element 4] : | array_flow.rb:1328:9:1328:9 | [post] a [element 1] : | -| array_flow.rb:1328:9:1328:21 | call to slice! [element 2] : | array_flow.rb:1331:10:1331:10 | b [element 2] : | -| array_flow.rb:1328:9:1328:21 | call to slice! [element 2] : | array_flow.rb:1331:10:1331:10 | b [element 2] : | +| array_flow.rb:1328:9:1328:21 | call to slice! [element 2] : | array_flow.rb:1328:5:1328:5 | b [element 2] : | +| array_flow.rb:1328:9:1328:21 | call to slice! [element 2] : | array_flow.rb:1328:5:1328:5 | b [element 2] : | | array_flow.rb:1331:10:1331:10 | b [element 2] : | array_flow.rb:1331:10:1331:13 | ...[...] | | array_flow.rb:1331:10:1331:10 | b [element 2] : | array_flow.rb:1331:10:1331:13 | ...[...] | | array_flow.rb:1333:10:1333:10 | a [element 1] : | array_flow.rb:1333:10:1333:13 | ...[...] | | array_flow.rb:1333:10:1333:10 | a [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 [element 2] : | -| array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1337:9:1337:9 | a [element 2] : | -| array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1337:9:1337:9 | a [element 4] : | -| array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1337:9:1337:9 | a [element 4] : | +| array_flow.rb:1336:5:1336:5 | a [element 2] : | array_flow.rb:1337:9:1337:9 | a [element 2] : | +| array_flow.rb:1336:5:1336:5 | a [element 2] : | array_flow.rb:1337:9:1337:9 | a [element 2] : | +| array_flow.rb:1336:5:1336:5 | a [element 4] : | array_flow.rb:1337:9:1337:9 | a [element 4] : | +| array_flow.rb:1336:5:1336:5 | a [element 4] : | array_flow.rb:1337:9:1337:9 | a [element 4] : | +| array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1336:5:1336:5 | a [element 2] : | +| array_flow.rb:1336:16:1336:28 | call to source : | array_flow.rb:1336:5:1336:5 | a [element 2] : | +| array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1336:5:1336:5 | a [element 4] : | +| array_flow.rb:1336:34:1336:46 | call to source : | array_flow.rb:1336:5:1336:5 | a [element 4] : | +| array_flow.rb:1337:5:1337:5 | b [element] : | array_flow.rb:1338:10:1338:10 | b [element] : | +| array_flow.rb:1337:5:1337:5 | b [element] : | array_flow.rb:1338:10:1338:10 | b [element] : | +| array_flow.rb:1337:5:1337:5 | b [element] : | array_flow.rb:1339:10:1339:10 | b [element] : | +| array_flow.rb:1337:5:1337:5 | b [element] : | array_flow.rb:1339:10:1339:10 | b [element] : | +| array_flow.rb:1337:5:1337:5 | b [element] : | array_flow.rb:1340:10:1340:10 | b [element] : | +| array_flow.rb:1337:5:1337:5 | b [element] : | array_flow.rb:1340:10:1340:10 | b [element] : | | array_flow.rb:1337:9:1337:9 | [post] a [element] : | array_flow.rb:1341:10:1341:10 | a [element] : | | array_flow.rb:1337:9:1337:9 | [post] a [element] : | array_flow.rb:1341:10:1341:10 | a [element] : | | array_flow.rb:1337:9:1337:9 | [post] a [element] : | array_flow.rb:1342:10:1342:10 | a [element] : | @@ -2777,12 +3454,8 @@ edges | array_flow.rb:1337:9:1337:9 | a [element 4] : | array_flow.rb:1337:9:1337:9 | [post] a [element] : | | array_flow.rb:1337:9:1337:9 | a [element 4] : | array_flow.rb:1337:9:1337:21 | call to slice! [element] : | | array_flow.rb:1337:9:1337:9 | a [element 4] : | array_flow.rb:1337:9:1337:21 | call to slice! [element] : | -| array_flow.rb:1337:9:1337:21 | call to slice! [element] : | array_flow.rb:1338:10:1338:10 | b [element] : | -| array_flow.rb:1337:9:1337:21 | call to slice! [element] : | array_flow.rb:1338:10:1338:10 | b [element] : | -| array_flow.rb:1337:9:1337:21 | call to slice! [element] : | array_flow.rb:1339:10:1339:10 | b [element] : | -| array_flow.rb:1337:9:1337:21 | call to slice! [element] : | array_flow.rb:1339:10:1339:10 | b [element] : | -| array_flow.rb:1337:9:1337:21 | call to slice! [element] : | array_flow.rb:1340:10:1340:10 | b [element] : | -| array_flow.rb:1337:9:1337:21 | call to slice! [element] : | array_flow.rb:1340:10:1340:10 | b [element] : | +| array_flow.rb:1337:9:1337:21 | call to slice! [element] : | array_flow.rb:1337:5:1337:5 | b [element] : | +| array_flow.rb:1337:9:1337:21 | call to slice! [element] : | array_flow.rb:1337:5:1337:5 | b [element] : | | array_flow.rb:1338:10:1338:10 | b [element] : | array_flow.rb:1338:10:1338:13 | ...[...] | | array_flow.rb:1338:10:1338:10 | b [element] : | array_flow.rb:1338:10:1338:13 | ...[...] | | array_flow.rb:1339:10:1339:10 | b [element] : | array_flow.rb:1339:10:1339:13 | ...[...] | @@ -2795,20 +3468,26 @@ edges | array_flow.rb:1342:10:1342:10 | a [element] : | array_flow.rb:1342:10:1342:13 | ...[...] | | array_flow.rb:1343:10:1343:10 | a [element] : | array_flow.rb:1343:10:1343:13 | ...[...] | | array_flow.rb:1343:10:1343:10 | a [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 [element 2] : | -| array_flow.rb:1347:16:1347:26 | call to source : | array_flow.rb:1348:9:1348:9 | a [element 2] : | +| array_flow.rb:1347:5:1347:5 | a [element 2] : | array_flow.rb:1348:9:1348:9 | a [element 2] : | +| array_flow.rb:1347:5:1347:5 | a [element 2] : | array_flow.rb:1348:9:1348:9 | a [element 2] : | +| array_flow.rb:1347:16:1347:26 | call to source : | array_flow.rb:1347:5:1347:5 | a [element 2] : | +| array_flow.rb:1347:16:1347:26 | call to source : | array_flow.rb:1347:5:1347:5 | a [element 2] : | | array_flow.rb:1348:9:1348:9 | a [element 2] : | array_flow.rb:1348:27:1348:27 | x : | | array_flow.rb:1348:9:1348:9 | a [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 [element 2] : | -| array_flow.rb:1355:16:1355:26 | call to source : | array_flow.rb:1356:9:1356:9 | a [element 2] : | +| array_flow.rb:1355:5:1355:5 | a [element 2] : | array_flow.rb:1356:9:1356:9 | a [element 2] : | +| array_flow.rb:1355:5:1355:5 | a [element 2] : | array_flow.rb:1356:9:1356:9 | a [element 2] : | +| array_flow.rb:1355:16:1355:26 | call to source : | array_flow.rb:1355:5:1355:5 | a [element 2] : | +| array_flow.rb:1355:16:1355:26 | call to source : | array_flow.rb:1355:5:1355:5 | a [element 2] : | | array_flow.rb:1356:9:1356:9 | a [element 2] : | array_flow.rb:1356:28:1356:28 | x : | | array_flow.rb:1356:9:1356:9 | a [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 [element 2] : | -| array_flow.rb:1363:16:1363:26 | call to source : | array_flow.rb:1364:9:1364:9 | a [element 2] : | +| array_flow.rb:1363:5:1363:5 | a [element 2] : | array_flow.rb:1364:9:1364:9 | a [element 2] : | +| array_flow.rb:1363:5:1363:5 | a [element 2] : | array_flow.rb:1364:9:1364:9 | a [element 2] : | +| array_flow.rb:1363:16:1363:26 | call to source : | array_flow.rb:1363:5:1363:5 | a [element 2] : | +| array_flow.rb:1363:16:1363:26 | call to source : | array_flow.rb:1363:5:1363:5 | a [element 2] : | | array_flow.rb:1364:9:1364:9 | a [element 2] : | array_flow.rb:1364:26:1364:26 | x : | | array_flow.rb:1364:9:1364:9 | a [element 2] : | array_flow.rb:1364:26:1364:26 | x : | | array_flow.rb:1364:9:1364:9 | a [element 2] : | array_flow.rb:1364:29:1364:29 | y : | @@ -2817,30 +3496,36 @@ edges | 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 [element 2] : | -| array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1372:9:1372:9 | a [element 2] : | -| array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1375:9:1375:9 | a [element 2] : | -| array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1375:9:1375:9 | a [element 2] : | +| array_flow.rb:1371:5:1371:5 | a [element 2] : | array_flow.rb:1372:9:1372:9 | a [element 2] : | +| array_flow.rb:1371:5:1371:5 | a [element 2] : | array_flow.rb:1372:9:1372:9 | a [element 2] : | +| array_flow.rb:1371:5:1371:5 | a [element 2] : | array_flow.rb:1375:9:1375:9 | a [element 2] : | +| array_flow.rb:1371:5:1371:5 | a [element 2] : | array_flow.rb:1375:9:1375:9 | a [element 2] : | +| array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1371:5:1371:5 | a [element 2] : | +| array_flow.rb:1371:16:1371:26 | call to source : | array_flow.rb:1371:5:1371:5 | a [element 2] : | +| array_flow.rb:1372:5:1372:5 | b [element] : | array_flow.rb:1373:10:1373:10 | b [element] : | +| array_flow.rb:1372:5:1372:5 | b [element] : | array_flow.rb:1373:10:1373:10 | b [element] : | +| array_flow.rb:1372:5:1372:5 | b [element] : | array_flow.rb:1374:10:1374:10 | b [element] : | +| array_flow.rb:1372:5:1372:5 | b [element] : | array_flow.rb:1374:10:1374:10 | b [element] : | | array_flow.rb:1372:9:1372:9 | a [element 2] : | array_flow.rb:1372:9:1372:14 | call to sort [element] : | | array_flow.rb:1372:9:1372:9 | a [element 2] : | array_flow.rb:1372:9:1372:14 | call to sort [element] : | -| array_flow.rb:1372:9:1372:14 | call to sort [element] : | array_flow.rb:1373:10:1373:10 | b [element] : | -| array_flow.rb:1372:9:1372:14 | call to sort [element] : | array_flow.rb:1373:10:1373:10 | b [element] : | -| array_flow.rb:1372:9:1372:14 | call to sort [element] : | array_flow.rb:1374:10:1374:10 | b [element] : | -| array_flow.rb:1372:9:1372:14 | call to sort [element] : | array_flow.rb:1374:10:1374:10 | b [element] : | +| array_flow.rb:1372:9:1372:14 | call to sort [element] : | array_flow.rb:1372:5:1372:5 | b [element] : | +| array_flow.rb:1372:9:1372:14 | call to sort [element] : | array_flow.rb:1372:5:1372:5 | b [element] : | | array_flow.rb:1373:10:1373:10 | b [element] : | array_flow.rb:1373:10:1373:13 | ...[...] | | array_flow.rb:1373:10:1373:10 | b [element] : | array_flow.rb:1373:10:1373:13 | ...[...] | | array_flow.rb:1374:10:1374:10 | b [element] : | array_flow.rb:1374:10:1374:13 | ...[...] | | array_flow.rb:1374:10:1374:10 | b [element] : | array_flow.rb:1374:10:1374:13 | ...[...] | +| array_flow.rb:1375:5:1375:5 | c [element] : | array_flow.rb:1380:10:1380:10 | c [element] : | +| array_flow.rb:1375:5:1375:5 | c [element] : | array_flow.rb:1380:10:1380:10 | c [element] : | +| array_flow.rb:1375:5:1375:5 | c [element] : | array_flow.rb:1381:10:1381:10 | c [element] : | +| array_flow.rb:1375:5:1375:5 | c [element] : | array_flow.rb:1381:10:1381:10 | c [element] : | | array_flow.rb:1375:9:1375:9 | a [element 2] : | array_flow.rb:1375:9:1379:7 | call to sort [element] : | | array_flow.rb:1375:9:1375:9 | a [element 2] : | array_flow.rb:1375:9:1379:7 | call to sort [element] : | | array_flow.rb:1375:9:1375:9 | a [element 2] : | array_flow.rb:1375:20:1375:20 | x : | | array_flow.rb:1375:9:1375:9 | a [element 2] : | array_flow.rb:1375:20:1375:20 | x : | | array_flow.rb:1375:9:1375:9 | a [element 2] : | array_flow.rb:1375:23:1375:23 | y : | | array_flow.rb:1375:9:1375:9 | a [element 2] : | array_flow.rb:1375:23:1375:23 | y : | -| array_flow.rb:1375:9:1379:7 | call to sort [element] : | array_flow.rb:1380:10:1380:10 | c [element] : | -| array_flow.rb:1375:9:1379:7 | call to sort [element] : | array_flow.rb:1380:10:1380:10 | c [element] : | -| array_flow.rb:1375:9:1379:7 | call to sort [element] : | array_flow.rb:1381:10:1381:10 | c [element] : | -| array_flow.rb:1375:9:1379:7 | call to sort [element] : | array_flow.rb:1381:10:1381:10 | c [element] : | +| array_flow.rb:1375:9:1379:7 | call to sort [element] : | array_flow.rb:1375:5:1375:5 | c [element] : | +| array_flow.rb:1375:9:1379:7 | call to sort [element] : | array_flow.rb:1375:5:1375:5 | c [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 | @@ -2849,8 +3534,14 @@ edges | array_flow.rb:1380:10:1380:10 | c [element] : | array_flow.rb:1380:10:1380:13 | ...[...] | | array_flow.rb:1381:10:1381:10 | c [element] : | array_flow.rb:1381:10:1381:13 | ...[...] | | array_flow.rb:1381:10:1381:10 | c [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 [element 2] : | -| array_flow.rb:1385:16:1385:26 | call to source : | array_flow.rb:1386:9:1386:9 | a [element 2] : | +| array_flow.rb:1385:5:1385:5 | a [element 2] : | array_flow.rb:1386:9:1386:9 | a [element 2] : | +| array_flow.rb:1385:5:1385:5 | a [element 2] : | array_flow.rb:1386:9:1386:9 | a [element 2] : | +| array_flow.rb:1385:16:1385:26 | call to source : | array_flow.rb:1385:5:1385:5 | a [element 2] : | +| array_flow.rb:1385:16:1385:26 | call to source : | array_flow.rb:1385:5:1385:5 | a [element 2] : | +| array_flow.rb:1386:5:1386:5 | b [element] : | array_flow.rb:1387:10:1387:10 | b [element] : | +| array_flow.rb:1386:5:1386:5 | b [element] : | array_flow.rb:1387:10:1387:10 | b [element] : | +| array_flow.rb:1386:5:1386:5 | b [element] : | array_flow.rb:1388:10:1388:10 | b [element] : | +| array_flow.rb:1386:5:1386:5 | b [element] : | array_flow.rb:1388:10:1388:10 | b [element] : | | array_flow.rb:1386:9:1386:9 | [post] a [element] : | array_flow.rb:1389:10:1389:10 | a [element] : | | array_flow.rb:1386:9:1386:9 | [post] a [element] : | array_flow.rb:1389:10:1389:10 | a [element] : | | array_flow.rb:1386:9:1386:9 | [post] a [element] : | array_flow.rb:1390:10:1390:10 | a [element] : | @@ -2859,10 +3550,8 @@ edges | array_flow.rb:1386:9:1386:9 | a [element 2] : | array_flow.rb:1386:9:1386:9 | [post] a [element] : | | array_flow.rb:1386:9:1386:9 | a [element 2] : | array_flow.rb:1386:9:1386:15 | call to sort! [element] : | | array_flow.rb:1386:9:1386:9 | a [element 2] : | array_flow.rb:1386:9:1386:15 | call to sort! [element] : | -| array_flow.rb:1386:9:1386:15 | call to sort! [element] : | array_flow.rb:1387:10:1387:10 | b [element] : | -| array_flow.rb:1386:9:1386:15 | call to sort! [element] : | array_flow.rb:1387:10:1387:10 | b [element] : | -| array_flow.rb:1386:9:1386:15 | call to sort! [element] : | array_flow.rb:1388:10:1388:10 | b [element] : | -| array_flow.rb:1386:9:1386:15 | call to sort! [element] : | array_flow.rb:1388:10:1388:10 | b [element] : | +| array_flow.rb:1386:9:1386:15 | call to sort! [element] : | array_flow.rb:1386:5:1386:5 | b [element] : | +| array_flow.rb:1386:9:1386:15 | call to sort! [element] : | array_flow.rb:1386:5:1386:5 | b [element] : | | array_flow.rb:1387:10:1387:10 | b [element] : | array_flow.rb:1387:10:1387:13 | ...[...] | | array_flow.rb:1387:10:1387:10 | b [element] : | array_flow.rb:1387:10:1387:13 | ...[...] | | array_flow.rb:1388:10:1388:10 | b [element] : | array_flow.rb:1388:10:1388:13 | ...[...] | @@ -2871,8 +3560,14 @@ edges | array_flow.rb:1389:10:1389:10 | a [element] : | array_flow.rb:1389:10:1389:13 | ...[...] | | array_flow.rb:1390:10:1390:10 | a [element] : | array_flow.rb:1390:10:1390:13 | ...[...] | | array_flow.rb:1390:10:1390:10 | a [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 [element 2] : | -| array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1393:9:1393:9 | a [element 2] : | +| array_flow.rb:1392:5:1392:5 | a [element 2] : | array_flow.rb:1393:9:1393:9 | a [element 2] : | +| array_flow.rb:1392:5:1392:5 | a [element 2] : | array_flow.rb:1393:9:1393:9 | a [element 2] : | +| array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1392:5:1392:5 | a [element 2] : | +| array_flow.rb:1392:16:1392:26 | call to source : | array_flow.rb:1392:5:1392:5 | a [element 2] : | +| array_flow.rb:1393:5:1393:5 | b [element] : | array_flow.rb:1398:10:1398:10 | b [element] : | +| array_flow.rb:1393:5:1393:5 | b [element] : | array_flow.rb:1398:10:1398:10 | b [element] : | +| array_flow.rb:1393:5:1393:5 | b [element] : | array_flow.rb:1399:10:1399:10 | b [element] : | +| array_flow.rb:1393:5:1393:5 | b [element] : | array_flow.rb:1399:10:1399:10 | b [element] : | | array_flow.rb:1393:9:1393:9 | [post] a [element] : | array_flow.rb:1400:10:1400:10 | a [element] : | | array_flow.rb:1393:9:1393:9 | [post] a [element] : | array_flow.rb:1400:10:1400:10 | a [element] : | | array_flow.rb:1393:9:1393:9 | [post] a [element] : | array_flow.rb:1401:10:1401:10 | a [element] : | @@ -2885,10 +3580,8 @@ edges | array_flow.rb:1393:9:1393:9 | a [element 2] : | array_flow.rb:1393:21:1393:21 | x : | | array_flow.rb:1393:9:1393:9 | a [element 2] : | array_flow.rb:1393:24:1393:24 | y : | | array_flow.rb:1393:9:1393:9 | a [element 2] : | array_flow.rb:1393:24:1393:24 | y : | -| array_flow.rb:1393:9:1397:7 | call to sort! [element] : | array_flow.rb:1398:10:1398:10 | b [element] : | -| array_flow.rb:1393:9:1397:7 | call to sort! [element] : | array_flow.rb:1398:10:1398:10 | b [element] : | -| array_flow.rb:1393:9:1397:7 | call to sort! [element] : | array_flow.rb:1399:10:1399:10 | b [element] : | -| array_flow.rb:1393:9:1397:7 | call to sort! [element] : | array_flow.rb:1399:10:1399:10 | b [element] : | +| array_flow.rb:1393:9:1397:7 | call to sort! [element] : | array_flow.rb:1393:5:1393:5 | b [element] : | +| array_flow.rb:1393:9:1397:7 | call to sort! [element] : | array_flow.rb:1393:5:1393:5 | b [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 | @@ -2901,24 +3594,34 @@ edges | array_flow.rb:1400:10:1400:10 | a [element] : | array_flow.rb:1400:10:1400:13 | ...[...] | | array_flow.rb:1401:10:1401:10 | a [element] : | array_flow.rb:1401:10:1401:13 | ...[...] | | array_flow.rb:1401:10:1401:10 | a [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 [element 2] : | -| array_flow.rb:1405:16:1405:26 | call to source : | array_flow.rb:1406:9:1406:9 | a [element 2] : | +| array_flow.rb:1405:5:1405:5 | a [element 2] : | array_flow.rb:1406:9:1406:9 | a [element 2] : | +| array_flow.rb:1405:5:1405:5 | a [element 2] : | array_flow.rb:1406:9:1406:9 | a [element 2] : | +| array_flow.rb:1405:16:1405:26 | call to source : | array_flow.rb:1405:5:1405:5 | a [element 2] : | +| array_flow.rb:1405:16:1405:26 | call to source : | array_flow.rb:1405:5:1405:5 | a [element 2] : | +| array_flow.rb:1406:5:1406:5 | b [element] : | array_flow.rb:1410:10:1410:10 | b [element] : | +| array_flow.rb:1406:5:1406:5 | b [element] : | array_flow.rb:1410:10:1410:10 | b [element] : | +| array_flow.rb:1406:5:1406:5 | b [element] : | array_flow.rb:1411:10:1411:10 | b [element] : | +| array_flow.rb:1406:5:1406:5 | b [element] : | array_flow.rb:1411:10:1411:10 | b [element] : | | array_flow.rb:1406:9:1406:9 | a [element 2] : | array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | | array_flow.rb:1406:9:1406:9 | a [element 2] : | array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | | array_flow.rb:1406:9:1406:9 | a [element 2] : | array_flow.rb:1406:23:1406:23 | x : | | array_flow.rb:1406:9:1406:9 | a [element 2] : | array_flow.rb:1406:23:1406:23 | x : | -| array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | array_flow.rb:1410:10:1410:10 | b [element] : | -| array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | array_flow.rb:1410:10:1410:10 | b [element] : | -| array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | array_flow.rb:1411:10:1411:10 | b [element] : | -| array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | array_flow.rb:1411:10:1411:10 | b [element] : | +| array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | array_flow.rb:1406:5:1406:5 | b [element] : | +| array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | array_flow.rb:1406:5:1406:5 | b [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 [element] : | array_flow.rb:1410:10:1410:13 | ...[...] | | array_flow.rb:1410:10:1410:10 | b [element] : | array_flow.rb:1410:10:1410:13 | ...[...] | | array_flow.rb:1411:10:1411:10 | b [element] : | array_flow.rb:1411:10:1411:13 | ...[...] | | array_flow.rb:1411:10:1411:10 | b [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 [element 2] : | -| array_flow.rb:1415:16:1415:26 | call to source : | array_flow.rb:1416:9:1416:9 | a [element 2] : | +| array_flow.rb:1415:5:1415:5 | a [element 2] : | array_flow.rb:1416:9:1416:9 | a [element 2] : | +| array_flow.rb:1415:5:1415:5 | a [element 2] : | array_flow.rb:1416:9:1416:9 | a [element 2] : | +| array_flow.rb:1415:16:1415:26 | call to source : | array_flow.rb:1415:5:1415:5 | a [element 2] : | +| array_flow.rb:1415:16:1415:26 | call to source : | array_flow.rb:1415:5:1415:5 | a [element 2] : | +| array_flow.rb:1416:5:1416:5 | b [element] : | array_flow.rb:1422:10:1422:10 | b [element] : | +| array_flow.rb:1416:5:1416:5 | b [element] : | array_flow.rb:1422:10:1422:10 | b [element] : | +| array_flow.rb:1416:5:1416:5 | b [element] : | array_flow.rb:1423:10:1423:10 | b [element] : | +| array_flow.rb:1416:5:1416:5 | b [element] : | array_flow.rb:1423:10:1423:10 | b [element] : | | array_flow.rb:1416:9:1416:9 | [post] a [element] : | array_flow.rb:1420:10:1420:10 | a [element] : | | array_flow.rb:1416:9:1416:9 | [post] a [element] : | array_flow.rb:1420:10:1420:10 | a [element] : | | array_flow.rb:1416:9:1416:9 | [post] a [element] : | array_flow.rb:1421:10:1421:10 | a [element] : | @@ -2929,10 +3632,8 @@ edges | array_flow.rb:1416:9:1416:9 | a [element 2] : | array_flow.rb:1416:9:1419:7 | call to sort_by! [element] : | | array_flow.rb:1416:9:1416:9 | a [element 2] : | array_flow.rb:1416:24:1416:24 | x : | | array_flow.rb:1416:9:1416:9 | a [element 2] : | array_flow.rb:1416:24:1416:24 | x : | -| array_flow.rb:1416:9:1419:7 | call to sort_by! [element] : | array_flow.rb:1422:10:1422:10 | b [element] : | -| array_flow.rb:1416:9:1419:7 | call to sort_by! [element] : | array_flow.rb:1422:10:1422:10 | b [element] : | -| array_flow.rb:1416:9:1419:7 | call to sort_by! [element] : | array_flow.rb:1423:10:1423:10 | b [element] : | -| array_flow.rb:1416:9:1419:7 | call to sort_by! [element] : | array_flow.rb:1423:10:1423:10 | b [element] : | +| array_flow.rb:1416:9:1419:7 | call to sort_by! [element] : | array_flow.rb:1416:5:1416:5 | b [element] : | +| array_flow.rb:1416:9:1419:7 | call to sort_by! [element] : | array_flow.rb:1416:5:1416:5 | b [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 [element] : | array_flow.rb:1420:10:1420:13 | ...[...] | @@ -2943,58 +3644,74 @@ edges | array_flow.rb:1422:10:1422:10 | b [element] : | array_flow.rb:1422:10:1422:13 | ...[...] | | array_flow.rb:1423:10:1423:10 | b [element] : | array_flow.rb:1423:10:1423:13 | ...[...] | | array_flow.rb:1423:10:1423:10 | b [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 [element 2] : | -| array_flow.rb:1427:16:1427:26 | call to source : | array_flow.rb:1428:9:1428:9 | a [element 2] : | +| array_flow.rb:1427:5:1427:5 | a [element 2] : | array_flow.rb:1428:9:1428:9 | a [element 2] : | +| array_flow.rb:1427:5:1427:5 | a [element 2] : | array_flow.rb:1428:9:1428:9 | a [element 2] : | +| array_flow.rb:1427:16:1427:26 | call to source : | array_flow.rb:1427:5:1427:5 | a [element 2] : | +| array_flow.rb:1427:16:1427:26 | call to source : | array_flow.rb:1427:5:1427:5 | a [element 2] : | | array_flow.rb:1428:9:1428:9 | a [element 2] : | array_flow.rb:1428:19:1428:19 | x : | | array_flow.rb:1428:9:1428:9 | a [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 [element 2] : | -| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1436:9:1436:9 | a [element 2] : | -| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1441:9:1441:9 | a [element 2] : | -| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1441:9:1441:9 | a [element 2] : | -| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1447:9:1447:9 | a [element 2] : | -| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1447:9:1447:9 | a [element 2] : | -| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1454:9:1454:9 | a [element 2] : | -| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1454:9:1454:9 | a [element 2] : | -| array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1436:9:1436:9 | a [element 3] : | -| array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1436:9:1436:9 | a [element 3] : | -| array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1447:9:1447:9 | a [element 3] : | -| array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1447:9:1447:9 | a [element 3] : | +| array_flow.rb:1435:5:1435:5 | a [element 2] : | array_flow.rb:1436:9:1436:9 | a [element 2] : | +| array_flow.rb:1435:5:1435:5 | a [element 2] : | array_flow.rb:1436:9:1436:9 | a [element 2] : | +| array_flow.rb:1435:5:1435:5 | a [element 2] : | array_flow.rb:1441:9:1441:9 | a [element 2] : | +| array_flow.rb:1435:5:1435:5 | a [element 2] : | array_flow.rb:1441:9:1441:9 | a [element 2] : | +| array_flow.rb:1435:5:1435:5 | a [element 2] : | array_flow.rb:1447:9:1447:9 | a [element 2] : | +| array_flow.rb:1435:5:1435:5 | a [element 2] : | array_flow.rb:1447:9:1447:9 | a [element 2] : | +| array_flow.rb:1435:5:1435:5 | a [element 2] : | array_flow.rb:1454:9:1454:9 | a [element 2] : | +| array_flow.rb:1435:5:1435:5 | a [element 2] : | array_flow.rb:1454:9:1454:9 | a [element 2] : | +| array_flow.rb:1435:5:1435:5 | a [element 3] : | array_flow.rb:1436:9:1436:9 | a [element 3] : | +| array_flow.rb:1435:5:1435:5 | a [element 3] : | array_flow.rb:1436:9:1436:9 | a [element 3] : | +| array_flow.rb:1435:5:1435:5 | a [element 3] : | array_flow.rb:1447:9:1447:9 | a [element 3] : | +| array_flow.rb:1435:5:1435:5 | a [element 3] : | array_flow.rb:1447:9:1447:9 | a [element 3] : | +| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1435:5:1435:5 | a [element 2] : | +| array_flow.rb:1435:16:1435:28 | call to source : | array_flow.rb:1435:5:1435:5 | a [element 2] : | +| array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1435:5:1435:5 | a [element 3] : | +| array_flow.rb:1435:31:1435:43 | call to source : | array_flow.rb:1435:5:1435:5 | a [element 3] : | +| array_flow.rb:1436:5:1436:5 | b [element 2] : | array_flow.rb:1439:10:1439:10 | b [element 2] : | +| array_flow.rb:1436:5:1436:5 | b [element 2] : | array_flow.rb:1439:10:1439:10 | b [element 2] : | +| array_flow.rb:1436:5:1436:5 | b [element 3] : | array_flow.rb:1440:10:1440:10 | b [element 3] : | +| array_flow.rb:1436:5:1436:5 | b [element 3] : | array_flow.rb:1440:10:1440:10 | b [element 3] : | | array_flow.rb:1436:9:1436:9 | a [element 2] : | array_flow.rb:1436:9:1436:17 | call to take [element 2] : | | array_flow.rb:1436:9:1436:9 | a [element 2] : | array_flow.rb:1436:9:1436:17 | call to take [element 2] : | | array_flow.rb:1436:9:1436:9 | a [element 3] : | array_flow.rb:1436:9:1436:17 | call to take [element 3] : | | array_flow.rb:1436:9:1436:9 | a [element 3] : | array_flow.rb:1436:9:1436:17 | call to take [element 3] : | -| array_flow.rb:1436:9:1436:17 | call to take [element 2] : | array_flow.rb:1439:10:1439:10 | b [element 2] : | -| array_flow.rb:1436:9:1436:17 | call to take [element 2] : | array_flow.rb:1439:10:1439:10 | b [element 2] : | -| array_flow.rb:1436:9:1436:17 | call to take [element 3] : | array_flow.rb:1440:10:1440:10 | b [element 3] : | -| array_flow.rb:1436:9:1436:17 | call to take [element 3] : | array_flow.rb:1440:10:1440:10 | b [element 3] : | +| array_flow.rb:1436:9:1436:17 | call to take [element 2] : | array_flow.rb:1436:5:1436:5 | b [element 2] : | +| array_flow.rb:1436:9:1436:17 | call to take [element 2] : | array_flow.rb:1436:5:1436:5 | b [element 2] : | +| array_flow.rb:1436:9:1436:17 | call to take [element 3] : | array_flow.rb:1436:5:1436:5 | b [element 3] : | +| array_flow.rb:1436:9:1436:17 | call to take [element 3] : | array_flow.rb:1436:5:1436:5 | b [element 3] : | | array_flow.rb:1439:10:1439:10 | b [element 2] : | array_flow.rb:1439:10:1439:13 | ...[...] | | array_flow.rb:1439:10:1439:10 | b [element 2] : | array_flow.rb:1439:10:1439:13 | ...[...] | | array_flow.rb:1440:10:1440:10 | b [element 3] : | array_flow.rb:1440:10:1440:13 | ...[...] | | array_flow.rb:1440:10:1440:10 | b [element 3] : | array_flow.rb:1440:10:1440:13 | ...[...] | +| array_flow.rb:1441:5:1441:5 | b [element 2] : | array_flow.rb:1444:10:1444:10 | b [element 2] : | +| array_flow.rb:1441:5:1441:5 | b [element 2] : | array_flow.rb:1444:10:1444:10 | b [element 2] : | +| array_flow.rb:1441:5:1441:5 | b [element 2] : | array_flow.rb:1446:10:1446:10 | b [element 2] : | +| array_flow.rb:1441:5:1441:5 | b [element 2] : | array_flow.rb:1446:10:1446:10 | b [element 2] : | | array_flow.rb:1441:9:1441:9 | a [element 2] : | array_flow.rb:1441:9:1441:17 | call to take [element 2] : | | array_flow.rb:1441:9:1441:9 | a [element 2] : | array_flow.rb:1441:9:1441:17 | call to take [element 2] : | -| array_flow.rb:1441:9:1441:17 | call to take [element 2] : | array_flow.rb:1444:10:1444:10 | b [element 2] : | -| array_flow.rb:1441:9:1441:17 | call to take [element 2] : | array_flow.rb:1444:10:1444:10 | b [element 2] : | -| array_flow.rb:1441:9:1441:17 | call to take [element 2] : | array_flow.rb:1446:10:1446:10 | b [element 2] : | -| array_flow.rb:1441:9:1441:17 | call to take [element 2] : | array_flow.rb:1446:10:1446:10 | b [element 2] : | +| array_flow.rb:1441:9:1441:17 | call to take [element 2] : | array_flow.rb:1441:5:1441:5 | b [element 2] : | +| array_flow.rb:1441:9:1441:17 | call to take [element 2] : | array_flow.rb:1441:5:1441:5 | b [element 2] : | | array_flow.rb:1444:10:1444:10 | b [element 2] : | array_flow.rb:1444:10:1444:13 | ...[...] | | array_flow.rb:1444:10:1444:10 | b [element 2] : | array_flow.rb:1444:10:1444:13 | ...[...] | | array_flow.rb:1446:10:1446:10 | b [element 2] : | array_flow.rb:1446:10:1446:13 | ...[...] | | array_flow.rb:1446:10:1446:10 | b [element 2] : | array_flow.rb:1446:10:1446:13 | ...[...] | +| array_flow.rb:1447:5:1447:5 | b [element 2] : | array_flow.rb:1450:10:1450:10 | b [element 2] : | +| array_flow.rb:1447:5:1447:5 | b [element 2] : | array_flow.rb:1450:10:1450:10 | b [element 2] : | +| array_flow.rb:1447:5:1447:5 | b [element 2] : | array_flow.rb:1452:10:1452:10 | b [element 2] : | +| array_flow.rb:1447:5:1447:5 | b [element 2] : | array_flow.rb:1452:10:1452:10 | b [element 2] : | +| array_flow.rb:1447:5:1447:5 | b [element 3] : | array_flow.rb:1451:10:1451:10 | b [element 3] : | +| array_flow.rb:1447:5:1447:5 | b [element 3] : | array_flow.rb:1451:10:1451:10 | b [element 3] : | +| array_flow.rb:1447:5:1447:5 | b [element 3] : | array_flow.rb:1452:10:1452:10 | b [element 3] : | +| array_flow.rb:1447:5:1447:5 | b [element 3] : | array_flow.rb:1452:10:1452:10 | b [element 3] : | | array_flow.rb:1447:9:1447:9 | a [element 2] : | array_flow.rb:1447:9:1447:19 | call to take [element 2] : | | array_flow.rb:1447:9:1447:9 | a [element 2] : | array_flow.rb:1447:9:1447:19 | call to take [element 2] : | | array_flow.rb:1447:9:1447:9 | a [element 3] : | array_flow.rb:1447:9:1447:19 | call to take [element 3] : | | array_flow.rb:1447:9:1447:9 | a [element 3] : | array_flow.rb:1447:9:1447:19 | call to take [element 3] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 2] : | array_flow.rb:1450:10:1450:10 | b [element 2] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 2] : | array_flow.rb:1450:10:1450:10 | b [element 2] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 2] : | array_flow.rb:1452:10:1452:10 | b [element 2] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 2] : | array_flow.rb:1452:10:1452:10 | b [element 2] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 3] : | array_flow.rb:1451:10:1451:10 | b [element 3] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 3] : | array_flow.rb:1451:10:1451:10 | b [element 3] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 3] : | array_flow.rb:1452:10:1452:10 | b [element 3] : | -| array_flow.rb:1447:9:1447:19 | call to take [element 3] : | array_flow.rb:1452:10:1452:10 | b [element 3] : | +| array_flow.rb:1447:9:1447:19 | call to take [element 2] : | array_flow.rb:1447:5:1447:5 | b [element 2] : | +| array_flow.rb:1447:9:1447:19 | call to take [element 2] : | array_flow.rb:1447:5:1447:5 | b [element 2] : | +| array_flow.rb:1447:9:1447:19 | call to take [element 3] : | array_flow.rb:1447:5:1447:5 | b [element 3] : | +| array_flow.rb:1447:9:1447:19 | call to take [element 3] : | array_flow.rb:1447:5:1447:5 | b [element 3] : | | array_flow.rb:1450:10:1450:10 | b [element 2] : | array_flow.rb:1450:10:1450:13 | ...[...] | | array_flow.rb:1450:10:1450:10 | b [element 2] : | array_flow.rb:1450:10:1450:13 | ...[...] | | array_flow.rb:1451:10:1451:10 | b [element 3] : | array_flow.rb:1451:10:1451:13 | ...[...] | @@ -3007,64 +3724,92 @@ edges | array_flow.rb:1453:5:1453:5 | [post] a [element] : | array_flow.rb:1454:9:1454:9 | a [element] : | | array_flow.rb:1453:12:1453:24 | call to source : | array_flow.rb:1453:5:1453:5 | [post] a [element] : | | array_flow.rb:1453:12:1453:24 | call to source : | array_flow.rb:1453:5:1453:5 | [post] a [element] : | +| array_flow.rb:1454:5:1454:5 | b [element 2] : | array_flow.rb:1455:10:1455:10 | b [element 2] : | +| array_flow.rb:1454:5:1454:5 | b [element 2] : | array_flow.rb:1455:10:1455:10 | b [element 2] : | +| array_flow.rb:1454:5:1454:5 | b [element] : | array_flow.rb:1455:10:1455:10 | b [element] : | +| array_flow.rb:1454:5:1454:5 | b [element] : | array_flow.rb:1455:10:1455:10 | b [element] : | | array_flow.rb:1454:9:1454:9 | a [element 2] : | array_flow.rb:1454:9:1454:17 | call to take [element 2] : | | array_flow.rb:1454:9:1454:9 | a [element 2] : | array_flow.rb:1454:9:1454:17 | call to take [element 2] : | | array_flow.rb:1454:9:1454:9 | a [element] : | array_flow.rb:1454:9:1454:17 | call to take [element] : | | array_flow.rb:1454:9:1454:9 | a [element] : | array_flow.rb:1454:9:1454:17 | call to take [element] : | -| array_flow.rb:1454:9:1454:17 | call to take [element 2] : | array_flow.rb:1455:10:1455:10 | b [element 2] : | -| array_flow.rb:1454:9:1454:17 | call to take [element 2] : | array_flow.rb:1455:10:1455:10 | b [element 2] : | -| array_flow.rb:1454:9:1454:17 | call to take [element] : | array_flow.rb:1455:10:1455:10 | b [element] : | -| array_flow.rb:1454:9:1454:17 | call to take [element] : | array_flow.rb:1455:10:1455:10 | b [element] : | +| array_flow.rb:1454:9:1454:17 | call to take [element 2] : | array_flow.rb:1454:5:1454:5 | b [element 2] : | +| array_flow.rb:1454:9:1454:17 | call to take [element 2] : | array_flow.rb:1454:5:1454:5 | b [element 2] : | +| array_flow.rb:1454:9:1454:17 | call to take [element] : | array_flow.rb:1454:5:1454:5 | b [element] : | +| array_flow.rb:1454:9:1454:17 | call to take [element] : | array_flow.rb:1454:5:1454:5 | b [element] : | | array_flow.rb:1455:10:1455:10 | b [element 2] : | array_flow.rb:1455:10:1455:13 | ...[...] | | array_flow.rb:1455:10:1455:10 | b [element 2] : | array_flow.rb:1455:10:1455:13 | ...[...] | | array_flow.rb:1455:10:1455:10 | b [element] : | array_flow.rb:1455:10:1455:13 | ...[...] | | array_flow.rb:1455:10:1455:10 | b [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 [element 2] : | -| array_flow.rb:1459:16:1459:26 | call to source : | array_flow.rb:1460:9:1460:9 | a [element 2] : | +| array_flow.rb:1459:5:1459:5 | a [element 2] : | array_flow.rb:1460:9:1460:9 | a [element 2] : | +| array_flow.rb:1459:5:1459:5 | a [element 2] : | array_flow.rb:1460:9:1460:9 | a [element 2] : | +| array_flow.rb:1459:16:1459:26 | call to source : | array_flow.rb:1459:5:1459:5 | a [element 2] : | +| array_flow.rb:1459:16:1459:26 | call to source : | array_flow.rb:1459:5:1459:5 | a [element 2] : | +| array_flow.rb:1460:5:1460:5 | b [element 2] : | array_flow.rb:1466:10:1466:10 | b [element 2] : | +| array_flow.rb:1460:5:1460:5 | b [element 2] : | array_flow.rb:1466:10:1466:10 | b [element 2] : | | array_flow.rb:1460:9:1460:9 | a [element 2] : | array_flow.rb:1460:9:1463:7 | call to take_while [element 2] : | | array_flow.rb:1460:9:1460:9 | a [element 2] : | array_flow.rb:1460:9:1463:7 | call to take_while [element 2] : | | array_flow.rb:1460:9:1460:9 | a [element 2] : | array_flow.rb:1460:26:1460:26 | x : | | array_flow.rb:1460:9:1460:9 | a [element 2] : | array_flow.rb:1460:26:1460:26 | x : | -| array_flow.rb:1460:9:1463:7 | call to take_while [element 2] : | array_flow.rb:1466:10:1466:10 | b [element 2] : | -| array_flow.rb:1460:9:1463:7 | call to take_while [element 2] : | array_flow.rb:1466:10:1466:10 | b [element 2] : | +| array_flow.rb:1460:9:1463:7 | call to take_while [element 2] : | array_flow.rb:1460:5:1460:5 | b [element 2] : | +| array_flow.rb:1460:9:1463:7 | call to take_while [element 2] : | array_flow.rb:1460:5:1460:5 | b [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 [element 2] : | array_flow.rb:1466:10:1466:13 | ...[...] | | array_flow.rb:1466:10:1466:10 | b [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 [element 3] : | -| array_flow.rb:1472:19:1472:29 | call to source : | array_flow.rb:1473:9:1473:9 | a [element 3] : | +| array_flow.rb:1472:5:1472:5 | a [element 3] : | array_flow.rb:1473:9:1473:9 | a [element 3] : | +| array_flow.rb:1472:5:1472:5 | a [element 3] : | array_flow.rb:1473:9:1473:9 | a [element 3] : | +| array_flow.rb:1472:19:1472:29 | call to source : | array_flow.rb:1472:5:1472:5 | a [element 3] : | +| array_flow.rb:1472:19:1472:29 | call to source : | array_flow.rb:1472:5:1472:5 | a [element 3] : | +| array_flow.rb:1473:5:1473:5 | b [element 3] : | array_flow.rb:1474:10:1474:10 | b [element 3] : | +| array_flow.rb:1473:5:1473:5 | b [element 3] : | array_flow.rb:1474:10:1474:10 | b [element 3] : | | array_flow.rb:1473:9:1473:9 | a [element 3] : | array_flow.rb:1473:9:1473:14 | call to to_a [element 3] : | | array_flow.rb:1473:9:1473:9 | a [element 3] : | array_flow.rb:1473:9:1473:14 | call to to_a [element 3] : | -| array_flow.rb:1473:9:1473:14 | call to to_a [element 3] : | array_flow.rb:1474:10:1474:10 | b [element 3] : | -| array_flow.rb:1473:9:1473:14 | call to to_a [element 3] : | array_flow.rb:1474:10:1474:10 | b [element 3] : | +| array_flow.rb:1473:9:1473:14 | call to to_a [element 3] : | array_flow.rb:1473:5:1473:5 | b [element 3] : | +| array_flow.rb:1473:9:1473:14 | call to to_a [element 3] : | array_flow.rb:1473:5:1473:5 | b [element 3] : | | array_flow.rb:1474:10:1474:10 | b [element 3] : | array_flow.rb:1474:10:1474:13 | ...[...] | | array_flow.rb:1474:10:1474:10 | b [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 [element 2] : | -| array_flow.rb:1478:16:1478:26 | call to source : | array_flow.rb:1479:9:1479:9 | a [element 2] : | +| array_flow.rb:1478:5:1478:5 | a [element 2] : | array_flow.rb:1479:9:1479:9 | a [element 2] : | +| array_flow.rb:1478:5:1478:5 | a [element 2] : | array_flow.rb:1479:9:1479:9 | a [element 2] : | +| array_flow.rb:1478:16:1478:26 | call to source : | array_flow.rb:1478:5:1478:5 | a [element 2] : | +| array_flow.rb:1478:16:1478:26 | call to source : | array_flow.rb:1478:5:1478:5 | a [element 2] : | +| array_flow.rb:1479:5:1479:5 | b [element 2] : | array_flow.rb:1482:10:1482:10 | b [element 2] : | +| array_flow.rb:1479:5:1479:5 | b [element 2] : | array_flow.rb:1482:10:1482:10 | b [element 2] : | | array_flow.rb:1479:9:1479:9 | a [element 2] : | array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] : | | array_flow.rb:1479:9:1479:9 | a [element 2] : | array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] : | -| array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] : | array_flow.rb:1482:10:1482:10 | b [element 2] : | -| array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] : | array_flow.rb:1482:10:1482:10 | b [element 2] : | +| array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] : | array_flow.rb:1479:5:1479:5 | b [element 2] : | +| array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] : | array_flow.rb:1479:5:1479:5 | b [element 2] : | | array_flow.rb:1482:10:1482:10 | b [element 2] : | array_flow.rb:1482:10:1482:13 | ...[...] | | array_flow.rb:1482:10:1482:10 | b [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 [element 0, element 1] : | -| array_flow.rb:1495:14:1495:26 | call to source : | array_flow.rb:1496:9:1496:9 | a [element 0, element 1] : | -| array_flow.rb:1495:34:1495:46 | call to source : | array_flow.rb:1496:9:1496:9 | a [element 1, element 1] : | -| array_flow.rb:1495:34:1495:46 | call to source : | array_flow.rb:1496:9:1496:9 | a [element 1, element 1] : | -| array_flow.rb:1495:54:1495:66 | call to source : | array_flow.rb:1496:9:1496:9 | a [element 2, element 1] : | -| array_flow.rb:1495:54:1495:66 | call to source : | array_flow.rb:1496:9:1496:9 | a [element 2, element 1] : | +| array_flow.rb:1495:5:1495:5 | a [element 0, element 1] : | array_flow.rb:1496:9:1496:9 | a [element 0, element 1] : | +| array_flow.rb:1495:5:1495:5 | a [element 0, element 1] : | array_flow.rb:1496:9:1496:9 | a [element 0, element 1] : | +| array_flow.rb:1495:5:1495:5 | a [element 1, element 1] : | array_flow.rb:1496:9:1496:9 | a [element 1, element 1] : | +| array_flow.rb:1495:5:1495:5 | a [element 1, element 1] : | array_flow.rb:1496:9:1496:9 | a [element 1, element 1] : | +| array_flow.rb:1495:5:1495:5 | a [element 2, element 1] : | array_flow.rb:1496:9:1496:9 | a [element 2, element 1] : | +| array_flow.rb:1495:5:1495:5 | a [element 2, element 1] : | array_flow.rb:1496:9:1496:9 | a [element 2, element 1] : | +| array_flow.rb:1495:14:1495:26 | call to source : | array_flow.rb:1495:5:1495:5 | a [element 0, element 1] : | +| array_flow.rb:1495:14:1495:26 | call to source : | array_flow.rb:1495:5:1495:5 | a [element 0, element 1] : | +| array_flow.rb:1495:34:1495:46 | call to source : | array_flow.rb:1495:5:1495:5 | a [element 1, element 1] : | +| array_flow.rb:1495:34:1495:46 | call to source : | array_flow.rb:1495:5:1495:5 | a [element 1, element 1] : | +| array_flow.rb:1495:54:1495:66 | call to source : | array_flow.rb:1495:5:1495:5 | a [element 2, element 1] : | +| array_flow.rb:1495:54:1495:66 | call to source : | array_flow.rb:1495:5:1495:5 | a [element 2, element 1] : | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 0] : | array_flow.rb:1500:10:1500:10 | b [element 1, element 0] : | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 0] : | array_flow.rb:1500:10:1500:10 | b [element 1, element 0] : | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 1] : | array_flow.rb:1501:10:1501:10 | b [element 1, element 1] : | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 1] : | array_flow.rb:1501:10:1501:10 | b [element 1, element 1] : | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 2] : | array_flow.rb:1502:10:1502:10 | b [element 1, element 2] : | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 2] : | array_flow.rb:1502:10:1502:10 | b [element 1, element 2] : | | array_flow.rb:1496:9:1496:9 | a [element 0, element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] : | | array_flow.rb:1496:9:1496:9 | a [element 0, element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] : | | array_flow.rb:1496:9:1496:9 | a [element 1, element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] : | | array_flow.rb:1496:9:1496:9 | a [element 1, element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] : | | array_flow.rb:1496:9:1496:9 | a [element 2, element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] : | | array_flow.rb:1496:9:1496:9 | a [element 2, element 1] : | array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] : | array_flow.rb:1500:10:1500:10 | b [element 1, element 0] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] : | array_flow.rb:1500:10:1500:10 | b [element 1, element 0] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] : | array_flow.rb:1501:10:1501:10 | b [element 1, element 1] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] : | array_flow.rb:1501:10:1501:10 | b [element 1, element 1] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] : | array_flow.rb:1502:10:1502:10 | b [element 1, element 2] : | -| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] : | array_flow.rb:1502:10:1502:10 | b [element 1, element 2] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] : | array_flow.rb:1496:5:1496:5 | b [element 1, element 0] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 0] : | array_flow.rb:1496:5:1496:5 | b [element 1, element 0] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] : | array_flow.rb:1496:5:1496:5 | b [element 1, element 1] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 1] : | array_flow.rb:1496:5:1496:5 | b [element 1, element 1] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] : | array_flow.rb:1496:5:1496:5 | b [element 1, element 2] : | +| array_flow.rb:1496:9:1496:19 | call to transpose [element 1, element 2] : | array_flow.rb:1496:5:1496:5 | b [element 1, element 2] : | | array_flow.rb:1500:10:1500:10 | b [element 1, element 0] : | array_flow.rb:1500:10:1500:13 | ...[...] [element 0] : | | array_flow.rb:1500:10:1500:10 | b [element 1, element 0] : | array_flow.rb:1500:10:1500:13 | ...[...] [element 0] : | | array_flow.rb:1500:10:1500:13 | ...[...] [element 0] : | array_flow.rb:1500:10:1500:16 | ...[...] | @@ -3077,20 +3822,28 @@ edges | array_flow.rb:1502:10:1502:10 | b [element 1, element 2] : | array_flow.rb:1502:10:1502:13 | ...[...] [element 2] : | | array_flow.rb:1502:10:1502:13 | ...[...] [element 2] : | array_flow.rb:1502:10:1502:16 | ...[...] | | array_flow.rb:1502:10:1502:13 | ...[...] [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 [element 2] : | -| array_flow.rb:1506:16:1506:28 | call to source : | array_flow.rb:1509:9:1509:9 | a [element 2] : | -| array_flow.rb:1507:13:1507:25 | call to source : | array_flow.rb:1509:17:1509:17 | b [element 1] : | -| array_flow.rb:1507:13:1507:25 | call to source : | array_flow.rb:1509:17:1509:17 | b [element 1] : | -| array_flow.rb:1508:13:1508:25 | call to source : | array_flow.rb:1509:20:1509:20 | c [element 1] : | -| array_flow.rb:1508:13:1508:25 | call to source : | array_flow.rb:1509:20:1509:20 | c [element 1] : | +| array_flow.rb:1506:5:1506:5 | a [element 2] : | array_flow.rb:1509:9:1509:9 | a [element 2] : | +| array_flow.rb:1506:5:1506:5 | a [element 2] : | array_flow.rb:1509:9:1509:9 | a [element 2] : | +| array_flow.rb:1506:16:1506:28 | call to source : | array_flow.rb:1506:5:1506:5 | a [element 2] : | +| array_flow.rb:1506:16:1506:28 | call to source : | array_flow.rb:1506:5:1506:5 | a [element 2] : | +| array_flow.rb:1507:5:1507:5 | b [element 1] : | array_flow.rb:1509:17:1509:17 | b [element 1] : | +| array_flow.rb:1507:5:1507:5 | b [element 1] : | array_flow.rb:1509:17:1509:17 | b [element 1] : | +| array_flow.rb:1507:13:1507:25 | call to source : | array_flow.rb:1507:5:1507:5 | b [element 1] : | +| array_flow.rb:1507:13:1507:25 | call to source : | array_flow.rb:1507:5:1507:5 | b [element 1] : | +| array_flow.rb:1508:5:1508:5 | c [element 1] : | array_flow.rb:1509:20:1509:20 | c [element 1] : | +| array_flow.rb:1508:5:1508:5 | c [element 1] : | array_flow.rb:1509:20:1509:20 | c [element 1] : | +| array_flow.rb:1508:13:1508:25 | call to source : | array_flow.rb:1508:5:1508:5 | c [element 1] : | +| array_flow.rb:1508:13:1508:25 | call to source : | array_flow.rb:1508:5:1508:5 | c [element 1] : | +| array_flow.rb:1509:5:1509:5 | d [element] : | array_flow.rb:1510:10:1510:10 | d [element] : | +| array_flow.rb:1509:5:1509:5 | d [element] : | array_flow.rb:1510:10:1510:10 | d [element] : | +| array_flow.rb:1509:5:1509:5 | d [element] : | array_flow.rb:1511:10:1511:10 | d [element] : | +| array_flow.rb:1509:5:1509:5 | d [element] : | array_flow.rb:1511:10:1511:10 | d [element] : | +| array_flow.rb:1509:5:1509:5 | d [element] : | array_flow.rb:1512:10:1512:10 | d [element] : | +| array_flow.rb:1509:5:1509:5 | d [element] : | array_flow.rb:1512:10:1512:10 | d [element] : | | array_flow.rb:1509:9:1509:9 | a [element 2] : | array_flow.rb:1509:9:1509:21 | call to union [element] : | | array_flow.rb:1509:9:1509:9 | a [element 2] : | array_flow.rb:1509:9:1509:21 | call to union [element] : | -| array_flow.rb:1509:9:1509:21 | call to union [element] : | array_flow.rb:1510:10:1510:10 | d [element] : | -| array_flow.rb:1509:9:1509:21 | call to union [element] : | array_flow.rb:1510:10:1510:10 | d [element] : | -| array_flow.rb:1509:9:1509:21 | call to union [element] : | array_flow.rb:1511:10:1511:10 | d [element] : | -| array_flow.rb:1509:9:1509:21 | call to union [element] : | array_flow.rb:1511:10:1511:10 | d [element] : | -| array_flow.rb:1509:9:1509:21 | call to union [element] : | array_flow.rb:1512:10:1512:10 | d [element] : | -| array_flow.rb:1509:9:1509:21 | call to union [element] : | array_flow.rb:1512:10:1512:10 | d [element] : | +| array_flow.rb:1509:9:1509:21 | call to union [element] : | array_flow.rb:1509:5:1509:5 | d [element] : | +| array_flow.rb:1509:9:1509:21 | call to union [element] : | array_flow.rb:1509:5:1509:5 | d [element] : | | array_flow.rb:1509:17:1509:17 | b [element 1] : | array_flow.rb:1509:9:1509:21 | call to union [element] : | | array_flow.rb:1509:17:1509:17 | b [element 1] : | array_flow.rb:1509:9:1509:21 | call to union [element] : | | array_flow.rb:1509:20:1509:20 | c [element 1] : | array_flow.rb:1509:9:1509:21 | call to union [element] : | @@ -3101,26 +3854,34 @@ edges | array_flow.rb:1511:10:1511:10 | d [element] : | array_flow.rb:1511:10:1511:13 | ...[...] | | array_flow.rb:1512:10:1512:10 | d [element] : | array_flow.rb:1512:10:1512:13 | ...[...] | | array_flow.rb:1512:10:1512:10 | d [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 [element 3] : | -| array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1518:9:1518:9 | a [element 3] : | -| array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1522:9:1522:9 | a [element 3] : | -| array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1522:9:1522:9 | a [element 3] : | -| array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1518:9:1518:9 | a [element 4] : | -| array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1518:9:1518:9 | a [element 4] : | -| array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1522:9:1522:9 | a [element 4] : | -| array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1522:9:1522:9 | a [element 4] : | +| array_flow.rb:1516:5:1516:5 | a [element 3] : | array_flow.rb:1518:9:1518:9 | a [element 3] : | +| array_flow.rb:1516:5:1516:5 | a [element 3] : | array_flow.rb:1518:9:1518:9 | a [element 3] : | +| array_flow.rb:1516:5:1516:5 | a [element 3] : | array_flow.rb:1522:9:1522:9 | a [element 3] : | +| array_flow.rb:1516:5:1516:5 | a [element 3] : | array_flow.rb:1522:9:1522:9 | a [element 3] : | +| array_flow.rb:1516:5:1516:5 | a [element 4] : | array_flow.rb:1518:9:1518:9 | a [element 4] : | +| array_flow.rb:1516:5:1516:5 | a [element 4] : | array_flow.rb:1518:9:1518:9 | a [element 4] : | +| array_flow.rb:1516:5:1516:5 | a [element 4] : | array_flow.rb:1522:9:1522:9 | a [element 4] : | +| array_flow.rb:1516:5:1516:5 | a [element 4] : | array_flow.rb:1522:9:1522:9 | a [element 4] : | +| array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1516:5:1516:5 | a [element 3] : | +| array_flow.rb:1516:19:1516:31 | call to source : | array_flow.rb:1516:5:1516:5 | a [element 3] : | +| array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1516:5:1516:5 | a [element 4] : | +| array_flow.rb:1516:34:1516:46 | call to source : | array_flow.rb:1516:5:1516:5 | a [element 4] : | +| array_flow.rb:1518:5:1518:5 | b [element] : | array_flow.rb:1519:10:1519:10 | b [element] : | +| array_flow.rb:1518:5:1518:5 | b [element] : | array_flow.rb:1519:10:1519:10 | b [element] : | +| array_flow.rb:1518:5:1518:5 | b [element] : | array_flow.rb:1520:10:1520:10 | b [element] : | +| array_flow.rb:1518:5:1518:5 | b [element] : | array_flow.rb:1520:10:1520:10 | b [element] : | | array_flow.rb:1518:9:1518:9 | a [element 3] : | array_flow.rb:1518:9:1518:14 | call to uniq [element] : | | array_flow.rb:1518:9:1518:9 | a [element 3] : | array_flow.rb:1518:9:1518:14 | call to uniq [element] : | | array_flow.rb:1518:9:1518:9 | a [element 4] : | array_flow.rb:1518:9:1518:14 | call to uniq [element] : | | array_flow.rb:1518:9:1518:9 | a [element 4] : | array_flow.rb:1518:9:1518:14 | call to uniq [element] : | -| array_flow.rb:1518:9:1518:14 | call to uniq [element] : | array_flow.rb:1519:10:1519:10 | b [element] : | -| array_flow.rb:1518:9:1518:14 | call to uniq [element] : | array_flow.rb:1519:10:1519:10 | b [element] : | -| array_flow.rb:1518:9:1518:14 | call to uniq [element] : | array_flow.rb:1520:10:1520:10 | b [element] : | -| array_flow.rb:1518:9:1518:14 | call to uniq [element] : | array_flow.rb:1520:10:1520:10 | b [element] : | +| array_flow.rb:1518:9:1518:14 | call to uniq [element] : | array_flow.rb:1518:5:1518:5 | b [element] : | +| array_flow.rb:1518:9:1518:14 | call to uniq [element] : | array_flow.rb:1518:5:1518:5 | b [element] : | | array_flow.rb:1519:10:1519:10 | b [element] : | array_flow.rb:1519:10:1519:13 | ...[...] | | array_flow.rb:1519:10:1519:10 | b [element] : | array_flow.rb:1519:10:1519:13 | ...[...] | | array_flow.rb:1520:10:1520:10 | b [element] : | array_flow.rb:1520:10:1520:13 | ...[...] | | array_flow.rb:1520:10:1520:10 | b [element] : | array_flow.rb:1520:10:1520:13 | ...[...] | +| array_flow.rb:1522:5:1522:5 | c [element] : | array_flow.rb:1526:10:1526:10 | c [element] : | +| array_flow.rb:1522:5:1522:5 | c [element] : | array_flow.rb:1526:10:1526:10 | c [element] : | | array_flow.rb:1522:9:1522:9 | a [element 3] : | array_flow.rb:1522:9:1525:7 | call to uniq [element] : | | array_flow.rb:1522:9:1522:9 | a [element 3] : | array_flow.rb:1522:9:1525:7 | call to uniq [element] : | | array_flow.rb:1522:9:1522:9 | a [element 3] : | array_flow.rb:1522:20:1522:20 | x : | @@ -3129,16 +3890,24 @@ edges | array_flow.rb:1522:9:1522:9 | a [element 4] : | array_flow.rb:1522:9:1525:7 | call to uniq [element] : | | array_flow.rb:1522:9:1522:9 | a [element 4] : | array_flow.rb:1522:20:1522:20 | x : | | array_flow.rb:1522:9:1522:9 | a [element 4] : | array_flow.rb:1522:20:1522:20 | x : | -| array_flow.rb:1522:9:1525:7 | call to uniq [element] : | array_flow.rb:1526:10:1526:10 | c [element] : | -| array_flow.rb:1522:9:1525:7 | call to uniq [element] : | array_flow.rb:1526:10:1526:10 | c [element] : | +| array_flow.rb:1522:9:1525:7 | call to uniq [element] : | array_flow.rb:1522:5:1522:5 | c [element] : | +| array_flow.rb:1522:9:1525:7 | call to uniq [element] : | array_flow.rb:1522:5:1522:5 | c [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 [element] : | array_flow.rb:1526:10:1526:13 | ...[...] | | array_flow.rb:1526:10:1526:10 | c [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 [element 2] : | -| array_flow.rb:1530:16:1530:28 | call to source : | array_flow.rb:1531:9:1531:9 | a [element 2] : | -| array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1531:9:1531:9 | a [element 3] : | -| array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1531:9:1531:9 | a [element 3] : | +| array_flow.rb:1530:5:1530:5 | a [element 2] : | array_flow.rb:1531:9:1531:9 | a [element 2] : | +| array_flow.rb:1530:5:1530:5 | a [element 2] : | array_flow.rb:1531:9:1531:9 | a [element 2] : | +| array_flow.rb:1530:5:1530:5 | a [element 3] : | array_flow.rb:1531:9:1531:9 | a [element 3] : | +| array_flow.rb:1530:5:1530:5 | a [element 3] : | array_flow.rb:1531:9:1531:9 | a [element 3] : | +| array_flow.rb:1530:16:1530:28 | call to source : | array_flow.rb:1530:5:1530:5 | a [element 2] : | +| array_flow.rb:1530:16:1530:28 | call to source : | array_flow.rb:1530:5:1530:5 | a [element 2] : | +| array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1530:5:1530:5 | a [element 3] : | +| array_flow.rb:1530:31:1530:43 | call to source : | array_flow.rb:1530:5:1530:5 | a [element 3] : | +| array_flow.rb:1531:5:1531:5 | b [element] : | array_flow.rb:1532:10:1532:10 | b [element] : | +| array_flow.rb:1531:5:1531:5 | b [element] : | array_flow.rb:1532:10:1532:10 | b [element] : | +| array_flow.rb:1531:5:1531:5 | b [element] : | array_flow.rb:1533:10:1533:10 | b [element] : | +| array_flow.rb:1531:5:1531:5 | b [element] : | array_flow.rb:1533:10:1533:10 | b [element] : | | array_flow.rb:1531:9:1531:9 | [post] a [element] : | array_flow.rb:1534:10:1534:10 | a [element] : | | array_flow.rb:1531:9:1531:9 | [post] a [element] : | array_flow.rb:1534:10:1534:10 | a [element] : | | array_flow.rb:1531:9:1531:9 | [post] a [element] : | array_flow.rb:1535:10:1535:10 | a [element] : | @@ -3151,10 +3920,8 @@ edges | array_flow.rb:1531:9:1531:9 | a [element 3] : | array_flow.rb:1531:9:1531:9 | [post] a [element] : | | array_flow.rb:1531:9:1531:9 | a [element 3] : | array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | | array_flow.rb:1531:9:1531:9 | a [element 3] : | array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | -| array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | array_flow.rb:1532:10:1532:10 | b [element] : | -| array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | array_flow.rb:1532:10:1532:10 | b [element] : | -| array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | array_flow.rb:1533:10:1533:10 | b [element] : | -| array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | array_flow.rb:1533:10:1533:10 | b [element] : | +| array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | array_flow.rb:1531:5:1531:5 | b [element] : | +| array_flow.rb:1531:9:1531:15 | call to uniq! [element] : | array_flow.rb:1531:5:1531:5 | b [element] : | | array_flow.rb:1532:10:1532:10 | b [element] : | array_flow.rb:1532:10:1532:13 | ...[...] | | array_flow.rb:1532:10:1532:10 | b [element] : | array_flow.rb:1532:10:1532:13 | ...[...] | | array_flow.rb:1533:10:1533:10 | b [element] : | array_flow.rb:1533:10:1533:13 | ...[...] | @@ -3163,10 +3930,18 @@ edges | array_flow.rb:1534:10:1534:10 | a [element] : | array_flow.rb:1534:10:1534:13 | ...[...] | | array_flow.rb:1535:10:1535:10 | a [element] : | array_flow.rb:1535:10:1535:13 | ...[...] | | array_flow.rb:1535:10:1535:10 | a [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 [element 2] : | -| array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1538:9:1538:9 | a [element 2] : | -| array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1538:9:1538:9 | a [element 3] : | -| array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1538:9:1538:9 | a [element 3] : | +| array_flow.rb:1537:5:1537:5 | a [element 2] : | array_flow.rb:1538:9:1538:9 | a [element 2] : | +| array_flow.rb:1537:5:1537:5 | a [element 2] : | array_flow.rb:1538:9:1538:9 | a [element 2] : | +| array_flow.rb:1537:5:1537:5 | a [element 3] : | array_flow.rb:1538:9:1538:9 | a [element 3] : | +| array_flow.rb:1537:5:1537:5 | a [element 3] : | array_flow.rb:1538:9:1538:9 | a [element 3] : | +| array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1537:5:1537:5 | a [element 2] : | +| array_flow.rb:1537:16:1537:28 | call to source : | array_flow.rb:1537:5:1537:5 | a [element 2] : | +| array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1537:5:1537:5 | a [element 3] : | +| array_flow.rb:1537:31:1537:43 | call to source : | array_flow.rb:1537:5:1537:5 | a [element 3] : | +| array_flow.rb:1538:5:1538:5 | b [element] : | array_flow.rb:1542:10:1542:10 | b [element] : | +| array_flow.rb:1538:5:1538:5 | b [element] : | array_flow.rb:1542:10:1542:10 | b [element] : | +| array_flow.rb:1538:5:1538:5 | b [element] : | array_flow.rb:1543:10:1543:10 | b [element] : | +| array_flow.rb:1538:5:1538:5 | b [element] : | array_flow.rb:1543:10:1543:10 | b [element] : | | array_flow.rb:1538:9:1538:9 | [post] a [element] : | array_flow.rb:1544:10:1544:10 | a [element] : | | array_flow.rb:1538:9:1538:9 | [post] a [element] : | array_flow.rb:1544:10:1544:10 | a [element] : | | array_flow.rb:1538:9:1538:9 | [post] a [element] : | array_flow.rb:1545:10:1545:10 | a [element] : | @@ -3183,10 +3958,8 @@ edges | array_flow.rb:1538:9:1538:9 | a [element 3] : | array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | | array_flow.rb:1538:9:1538:9 | a [element 3] : | array_flow.rb:1538:21:1538:21 | x : | | array_flow.rb:1538:9:1538:9 | a [element 3] : | array_flow.rb:1538:21:1538:21 | x : | -| array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | array_flow.rb:1542:10:1542:10 | b [element] : | -| array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | array_flow.rb:1542:10:1542:10 | b [element] : | -| array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | array_flow.rb:1543:10:1543:10 | b [element] : | -| array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | array_flow.rb:1543:10:1543:10 | b [element] : | +| array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | array_flow.rb:1538:5:1538:5 | b [element] : | +| array_flow.rb:1538:9:1541:7 | call to uniq! [element] : | array_flow.rb:1538:5:1538:5 | b [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 [element] : | array_flow.rb:1542:10:1542:13 | ...[...] | @@ -3197,8 +3970,10 @@ edges | array_flow.rb:1544:10:1544:10 | a [element] : | array_flow.rb:1544:10:1544:13 | ...[...] | | array_flow.rb:1545:10:1545:10 | a [element] : | array_flow.rb:1545:10:1545:13 | ...[...] | | array_flow.rb:1545:10:1545:10 | a [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 [element 2] : | -| array_flow.rb:1549:16:1549:28 | call to source : | array_flow.rb:1550:5:1550:5 | a [element 2] : | +| array_flow.rb:1549:5:1549:5 | a [element 2] : | array_flow.rb:1550:5:1550:5 | a [element 2] : | +| array_flow.rb:1549:5:1549:5 | a [element 2] : | array_flow.rb:1550:5:1550:5 | a [element 2] : | +| array_flow.rb:1549:16:1549:28 | call to source : | array_flow.rb:1549:5:1549:5 | a [element 2] : | +| array_flow.rb:1549:16:1549:28 | call to source : | array_flow.rb:1549:5:1549:5 | a [element 2] : | | array_flow.rb:1550:5:1550:5 | [post] a [element 2] : | array_flow.rb:1553:10:1553:10 | a [element 2] : | | array_flow.rb:1550:5:1550:5 | [post] a [element 2] : | array_flow.rb:1553:10:1553:10 | a [element 2] : | | array_flow.rb:1550:5:1550:5 | [post] a [element 5] : | array_flow.rb:1556:10:1556:10 | a [element 5] : | @@ -3211,72 +3986,88 @@ edges | array_flow.rb:1553:10:1553:10 | a [element 2] : | array_flow.rb:1553:10:1553:13 | ...[...] | | array_flow.rb:1556:10:1556:10 | a [element 5] : | array_flow.rb:1556:10:1556:13 | ...[...] | | array_flow.rb:1556:10:1556:10 | a [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 [element 1] : | -| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1562:9:1562:9 | a [element 1] : | -| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1568:9:1568:9 | a [element 1] : | -| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1568:9:1568:9 | a [element 1] : | -| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1572:9:1572:9 | a [element 1] : | -| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1572:9:1572:9 | a [element 1] : | -| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1576:9:1576:9 | a [element 1] : | -| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1576:9:1576:9 | a [element 1] : | -| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1568:9:1568:9 | a [element 3] : | -| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1568:9:1568:9 | a [element 3] : | -| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1572:9:1572:9 | a [element 3] : | -| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1572:9:1572:9 | a [element 3] : | -| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1576:9:1576:9 | a [element 3] : | -| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1576:9:1576:9 | a [element 3] : | +| array_flow.rb:1560:5:1560:5 | a [element 1] : | array_flow.rb:1562:9:1562:9 | a [element 1] : | +| array_flow.rb:1560:5:1560:5 | a [element 1] : | array_flow.rb:1562:9:1562:9 | a [element 1] : | +| array_flow.rb:1560:5:1560:5 | a [element 1] : | array_flow.rb:1568:9:1568:9 | a [element 1] : | +| array_flow.rb:1560:5:1560:5 | a [element 1] : | array_flow.rb:1568:9:1568:9 | a [element 1] : | +| array_flow.rb:1560:5:1560:5 | a [element 1] : | array_flow.rb:1572:9:1572:9 | a [element 1] : | +| array_flow.rb:1560:5:1560:5 | a [element 1] : | array_flow.rb:1572:9:1572:9 | a [element 1] : | +| array_flow.rb:1560:5:1560:5 | a [element 1] : | array_flow.rb:1576:9:1576:9 | a [element 1] : | +| array_flow.rb:1560:5:1560:5 | a [element 1] : | array_flow.rb:1576:9:1576:9 | a [element 1] : | +| array_flow.rb:1560:5:1560:5 | a [element 3] : | array_flow.rb:1568:9:1568:9 | a [element 3] : | +| array_flow.rb:1560:5:1560:5 | a [element 3] : | array_flow.rb:1568:9:1568:9 | a [element 3] : | +| array_flow.rb:1560:5:1560:5 | a [element 3] : | array_flow.rb:1572:9:1572:9 | a [element 3] : | +| array_flow.rb:1560:5:1560:5 | a [element 3] : | array_flow.rb:1572:9:1572:9 | a [element 3] : | +| array_flow.rb:1560:5:1560:5 | a [element 3] : | array_flow.rb:1576:9:1576:9 | a [element 3] : | +| array_flow.rb:1560:5:1560:5 | a [element 3] : | array_flow.rb:1576:9:1576:9 | a [element 3] : | +| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1560:5:1560:5 | a [element 1] : | +| array_flow.rb:1560:13:1560:25 | call to source : | array_flow.rb:1560:5:1560:5 | a [element 1] : | +| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1560:5:1560:5 | a [element 3] : | +| array_flow.rb:1560:31:1560:43 | call to source : | array_flow.rb:1560:5:1560:5 | a [element 3] : | +| array_flow.rb:1562:5:1562:5 | b [element 1] : | array_flow.rb:1564:10:1564:10 | b [element 1] : | +| array_flow.rb:1562:5:1562:5 | b [element 1] : | array_flow.rb:1564:10:1564:10 | b [element 1] : | +| array_flow.rb:1562:5:1562:5 | b [element 3] : | array_flow.rb:1566:10:1566:10 | b [element 3] : | +| array_flow.rb:1562:5:1562:5 | b [element 3] : | array_flow.rb:1566:10:1566:10 | b [element 3] : | | array_flow.rb:1562:9:1562:9 | a [element 1] : | array_flow.rb:1562:9:1562:31 | call to values_at [element 1] : | | array_flow.rb:1562:9:1562:9 | a [element 1] : | array_flow.rb:1562:9:1562:31 | call to values_at [element 1] : | | array_flow.rb:1562:9:1562:9 | a [element 1] : | array_flow.rb:1562:9:1562:31 | call to values_at [element 3] : | | array_flow.rb:1562:9:1562:9 | a [element 1] : | array_flow.rb:1562:9:1562:31 | call to values_at [element 3] : | -| array_flow.rb:1562:9:1562:31 | call to values_at [element 1] : | array_flow.rb:1564:10:1564:10 | b [element 1] : | -| array_flow.rb:1562:9:1562:31 | call to values_at [element 1] : | array_flow.rb:1564:10:1564:10 | b [element 1] : | -| array_flow.rb:1562:9:1562:31 | call to values_at [element 3] : | array_flow.rb:1566:10:1566:10 | b [element 3] : | -| array_flow.rb:1562:9:1562:31 | call to values_at [element 3] : | array_flow.rb:1566:10:1566:10 | b [element 3] : | +| array_flow.rb:1562:9:1562:31 | call to values_at [element 1] : | array_flow.rb:1562:5:1562:5 | b [element 1] : | +| array_flow.rb:1562:9:1562:31 | call to values_at [element 1] : | array_flow.rb:1562:5:1562:5 | b [element 1] : | +| array_flow.rb:1562:9:1562:31 | call to values_at [element 3] : | array_flow.rb:1562:5:1562:5 | b [element 3] : | +| array_flow.rb:1562:9:1562:31 | call to values_at [element 3] : | array_flow.rb:1562:5:1562:5 | b [element 3] : | | array_flow.rb:1564:10:1564:10 | b [element 1] : | array_flow.rb:1564:10:1564:13 | ...[...] | | array_flow.rb:1564:10:1564:10 | b [element 1] : | array_flow.rb:1564:10:1564:13 | ...[...] | | array_flow.rb:1566:10:1566:10 | b [element 3] : | array_flow.rb:1566:10:1566:13 | ...[...] | | array_flow.rb:1566:10:1566:10 | b [element 3] : | array_flow.rb:1566:10:1566:13 | ...[...] | +| array_flow.rb:1568:5:1568:5 | b [element] : | array_flow.rb:1569:10:1569:10 | b [element] : | +| array_flow.rb:1568:5:1568:5 | b [element] : | array_flow.rb:1569:10:1569:10 | b [element] : | +| array_flow.rb:1568:5:1568:5 | b [element] : | array_flow.rb:1570:10:1570:10 | b [element] : | +| array_flow.rb:1568:5:1568:5 | b [element] : | array_flow.rb:1570:10:1570:10 | b [element] : | | array_flow.rb:1568:9:1568:9 | a [element 1] : | array_flow.rb:1568:9:1568:25 | call to values_at [element] : | | array_flow.rb:1568:9:1568:9 | a [element 1] : | array_flow.rb:1568:9:1568:25 | call to values_at [element] : | | array_flow.rb:1568:9:1568:9 | a [element 3] : | array_flow.rb:1568:9:1568:25 | call to values_at [element] : | | array_flow.rb:1568:9:1568:9 | a [element 3] : | array_flow.rb:1568:9:1568:25 | call to values_at [element] : | -| array_flow.rb:1568:9:1568:25 | call to values_at [element] : | array_flow.rb:1569:10:1569:10 | b [element] : | -| array_flow.rb:1568:9:1568:25 | call to values_at [element] : | array_flow.rb:1569:10:1569:10 | b [element] : | -| array_flow.rb:1568:9:1568:25 | call to values_at [element] : | array_flow.rb:1570:10:1570:10 | b [element] : | -| array_flow.rb:1568:9:1568:25 | call to values_at [element] : | array_flow.rb:1570:10:1570:10 | b [element] : | +| array_flow.rb:1568:9:1568:25 | call to values_at [element] : | array_flow.rb:1568:5:1568:5 | b [element] : | +| array_flow.rb:1568:9:1568:25 | call to values_at [element] : | array_flow.rb:1568:5:1568:5 | b [element] : | | array_flow.rb:1569:10:1569:10 | b [element] : | array_flow.rb:1569:10:1569:13 | ...[...] | | array_flow.rb:1569:10:1569:10 | b [element] : | array_flow.rb:1569:10:1569:13 | ...[...] | | array_flow.rb:1570:10:1570:10 | b [element] : | array_flow.rb:1570:10:1570:13 | ...[...] | | array_flow.rb:1570:10:1570:10 | b [element] : | array_flow.rb:1570:10:1570:13 | ...[...] | +| array_flow.rb:1572:5:1572:5 | b [element] : | array_flow.rb:1573:10:1573:10 | b [element] : | +| array_flow.rb:1572:5:1572:5 | b [element] : | array_flow.rb:1573:10:1573:10 | b [element] : | +| array_flow.rb:1572:5:1572:5 | b [element] : | array_flow.rb:1574:10:1574:10 | b [element] : | +| array_flow.rb:1572:5:1572:5 | b [element] : | array_flow.rb:1574:10:1574:10 | b [element] : | | array_flow.rb:1572:9:1572:9 | a [element 1] : | array_flow.rb:1572:9:1572:26 | call to values_at [element] : | | array_flow.rb:1572:9:1572:9 | a [element 1] : | array_flow.rb:1572:9:1572:26 | call to values_at [element] : | | array_flow.rb:1572:9:1572:9 | a [element 3] : | array_flow.rb:1572:9:1572:26 | call to values_at [element] : | | array_flow.rb:1572:9:1572:9 | a [element 3] : | array_flow.rb:1572:9:1572:26 | call to values_at [element] : | -| array_flow.rb:1572:9:1572:26 | call to values_at [element] : | array_flow.rb:1573:10:1573:10 | b [element] : | -| array_flow.rb:1572:9:1572:26 | call to values_at [element] : | array_flow.rb:1573:10:1573:10 | b [element] : | -| array_flow.rb:1572:9:1572:26 | call to values_at [element] : | array_flow.rb:1574:10:1574:10 | b [element] : | -| array_flow.rb:1572:9:1572:26 | call to values_at [element] : | array_flow.rb:1574:10:1574:10 | b [element] : | +| array_flow.rb:1572:9:1572:26 | call to values_at [element] : | array_flow.rb:1572:5:1572:5 | b [element] : | +| array_flow.rb:1572:9:1572:26 | call to values_at [element] : | array_flow.rb:1572:5:1572:5 | b [element] : | | array_flow.rb:1573:10:1573:10 | b [element] : | array_flow.rb:1573:10:1573:13 | ...[...] | | array_flow.rb:1573:10:1573:10 | b [element] : | array_flow.rb:1573:10:1573:13 | ...[...] | | array_flow.rb:1574:10:1574:10 | b [element] : | array_flow.rb:1574:10:1574:13 | ...[...] | | array_flow.rb:1574:10:1574:10 | b [element] : | array_flow.rb:1574:10:1574:13 | ...[...] | +| array_flow.rb:1576:5:1576:5 | b [element 1] : | array_flow.rb:1578:10:1578:10 | b [element 1] : | +| array_flow.rb:1576:5:1576:5 | b [element 1] : | array_flow.rb:1578:10:1578:10 | b [element 1] : | +| array_flow.rb:1576:5:1576:5 | b [element] : | array_flow.rb:1577:10:1577:10 | b [element] : | +| array_flow.rb:1576:5:1576:5 | b [element] : | array_flow.rb:1577:10:1577:10 | b [element] : | +| array_flow.rb:1576:5:1576:5 | b [element] : | array_flow.rb:1578:10:1578:10 | b [element] : | +| array_flow.rb:1576:5:1576:5 | b [element] : | array_flow.rb:1578:10:1578:10 | b [element] : | +| array_flow.rb:1576:5:1576:5 | b [element] : | array_flow.rb:1579:10:1579:10 | b [element] : | +| array_flow.rb:1576:5:1576:5 | b [element] : | array_flow.rb:1579:10:1579:10 | b [element] : | +| array_flow.rb:1576:5:1576:5 | b [element] : | array_flow.rb:1580:10:1580:10 | b [element] : | +| array_flow.rb:1576:5:1576:5 | b [element] : | array_flow.rb:1580:10:1580:10 | b [element] : | | array_flow.rb:1576:9:1576:9 | a [element 1] : | array_flow.rb:1576:9:1576:28 | call to values_at [element] : | | array_flow.rb:1576:9:1576:9 | a [element 1] : | array_flow.rb:1576:9:1576:28 | call to values_at [element] : | | array_flow.rb:1576:9:1576:9 | a [element 3] : | array_flow.rb:1576:9:1576:28 | call to values_at [element 1] : | | array_flow.rb:1576:9:1576:9 | a [element 3] : | array_flow.rb:1576:9:1576:28 | call to values_at [element 1] : | | array_flow.rb:1576:9:1576:9 | a [element 3] : | array_flow.rb:1576:9:1576:28 | call to values_at [element] : | | array_flow.rb:1576:9:1576:9 | a [element 3] : | array_flow.rb:1576:9:1576:28 | call to values_at [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element 1] : | array_flow.rb:1578:10:1578:10 | b [element 1] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element 1] : | array_flow.rb:1578:10:1578:10 | b [element 1] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1577:10:1577:10 | b [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1577:10:1577:10 | b [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1578:10:1578:10 | b [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1578:10:1578:10 | b [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1579:10:1579:10 | b [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1579:10:1579:10 | b [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1580:10:1580:10 | b [element] : | -| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1580:10:1580:10 | b [element] : | +| array_flow.rb:1576:9:1576:28 | call to values_at [element 1] : | array_flow.rb:1576:5:1576:5 | b [element 1] : | +| array_flow.rb:1576:9:1576:28 | call to values_at [element 1] : | array_flow.rb:1576:5:1576:5 | b [element 1] : | +| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1576:5:1576:5 | b [element] : | +| array_flow.rb:1576:9:1576:28 | call to values_at [element] : | array_flow.rb:1576:5:1576:5 | b [element] : | | array_flow.rb:1577:10:1577:10 | b [element] : | array_flow.rb:1577:10:1577:13 | ...[...] | | array_flow.rb:1577:10:1577:10 | b [element] : | array_flow.rb:1577:10:1577:13 | ...[...] | | array_flow.rb:1578:10:1578:10 | b [element 1] : | array_flow.rb:1578:10:1578:13 | ...[...] | @@ -3287,26 +4078,38 @@ edges | array_flow.rb:1579:10:1579:10 | b [element] : | array_flow.rb:1579:10:1579:13 | ...[...] | | array_flow.rb:1580:10:1580:10 | b [element] : | array_flow.rb:1580:10:1580:13 | ...[...] | | array_flow.rb:1580:10:1580:10 | b [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 [element 2] : | -| array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1587:9:1587:9 | a [element 2] : | -| array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1592:5:1592:5 | a [element 2] : | -| array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1592:5:1592:5 | a [element 2] : | -| array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1587:15:1587:15 | b [element 1] : | -| array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1587:15:1587:15 | b [element 1] : | -| array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1592:11:1592:11 | b [element 1] : | -| array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1592:11:1592:11 | b [element 1] : | -| array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1587:18:1587:18 | c [element 0] : | -| array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1587:18:1587:18 | c [element 0] : | -| array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1592:14:1592:14 | c [element 0] : | -| array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1592:14:1592:14 | c [element 0] : | +| array_flow.rb:1584:5:1584:5 | a [element 2] : | array_flow.rb:1587:9:1587:9 | a [element 2] : | +| array_flow.rb:1584:5:1584:5 | a [element 2] : | array_flow.rb:1587:9:1587:9 | a [element 2] : | +| array_flow.rb:1584:5:1584:5 | a [element 2] : | array_flow.rb:1592:5:1592:5 | a [element 2] : | +| array_flow.rb:1584:5:1584:5 | a [element 2] : | array_flow.rb:1592:5:1592:5 | a [element 2] : | +| array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1584:5:1584:5 | a [element 2] : | +| array_flow.rb:1584:16:1584:28 | call to source : | array_flow.rb:1584:5:1584:5 | a [element 2] : | +| array_flow.rb:1585:5:1585:5 | b [element 1] : | array_flow.rb:1587:15:1587:15 | b [element 1] : | +| array_flow.rb:1585:5:1585:5 | b [element 1] : | array_flow.rb:1587:15:1587:15 | b [element 1] : | +| array_flow.rb:1585:5:1585:5 | b [element 1] : | array_flow.rb:1592:11:1592:11 | b [element 1] : | +| array_flow.rb:1585:5:1585:5 | b [element 1] : | array_flow.rb:1592:11:1592:11 | b [element 1] : | +| array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1585:5:1585:5 | b [element 1] : | +| array_flow.rb:1585:13:1585:25 | call to source : | array_flow.rb:1585:5:1585:5 | b [element 1] : | +| array_flow.rb:1586:5:1586:5 | c [element 0] : | array_flow.rb:1587:18:1587:18 | c [element 0] : | +| array_flow.rb:1586:5:1586:5 | c [element 0] : | array_flow.rb:1587:18:1587:18 | c [element 0] : | +| array_flow.rb:1586:5:1586:5 | c [element 0] : | array_flow.rb:1592:14:1592:14 | c [element 0] : | +| array_flow.rb:1586:5:1586:5 | c [element 0] : | array_flow.rb:1592:14:1592:14 | c [element 0] : | +| array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1586:5:1586:5 | c [element 0] : | +| array_flow.rb:1586:10:1586:22 | call to source : | array_flow.rb:1586:5:1586:5 | c [element 0] : | +| array_flow.rb:1587:5:1587:5 | d [element 0, element 2] : | array_flow.rb:1589:10:1589:10 | d [element 0, element 2] : | +| array_flow.rb:1587:5:1587:5 | d [element 0, element 2] : | array_flow.rb:1589:10:1589:10 | d [element 0, element 2] : | +| array_flow.rb:1587:5:1587:5 | d [element 1, element 1] : | array_flow.rb:1590:10:1590:10 | d [element 1, element 1] : | +| array_flow.rb:1587:5:1587:5 | d [element 1, element 1] : | array_flow.rb:1590:10:1590:10 | d [element 1, element 1] : | +| array_flow.rb:1587:5:1587:5 | d [element 2, element 0] : | array_flow.rb:1591:10:1591:10 | d [element 2, element 0] : | +| array_flow.rb:1587:5:1587:5 | d [element 2, element 0] : | array_flow.rb:1591:10:1591:10 | d [element 2, element 0] : | | array_flow.rb:1587:9:1587:9 | a [element 2] : | array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] : | | array_flow.rb:1587:9:1587:9 | a [element 2] : | array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] : | array_flow.rb:1589:10:1589:10 | d [element 0, element 2] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] : | array_flow.rb:1589:10:1589:10 | d [element 0, element 2] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] : | array_flow.rb:1590:10:1590:10 | d [element 1, element 1] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] : | array_flow.rb:1590:10:1590:10 | d [element 1, element 1] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] : | array_flow.rb:1591:10:1591:10 | d [element 2, element 0] : | -| array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] : | array_flow.rb:1591:10:1591:10 | d [element 2, element 0] : | +| array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] : | array_flow.rb:1587:5:1587:5 | d [element 0, element 2] : | +| array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] : | array_flow.rb:1587:5:1587:5 | d [element 0, element 2] : | +| array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] : | array_flow.rb:1587:5:1587:5 | d [element 1, element 1] : | +| array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] : | array_flow.rb:1587:5:1587:5 | d [element 1, element 1] : | +| array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] : | array_flow.rb:1587:5:1587:5 | d [element 2, element 0] : | +| array_flow.rb:1587:9:1587:19 | call to zip [element 2, element 0] : | array_flow.rb:1587:5:1587:5 | d [element 2, element 0] : | | array_flow.rb:1587:15:1587:15 | b [element 1] : | array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] : | | array_flow.rb:1587:15:1587:15 | b [element 1] : | array_flow.rb:1587:9:1587:19 | call to zip [element 1, element 1] : | | array_flow.rb:1587:18:1587:18 | c [element 0] : | array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] : | @@ -3341,18 +4144,24 @@ edges | array_flow.rb:1594:14:1594:14 | x [element 1] : | array_flow.rb:1594:14:1594:17 | ...[...] | | array_flow.rb:1595:14:1595:14 | x [element 2] : | array_flow.rb:1595:14:1595:17 | ...[...] | | array_flow.rb:1595:14:1595:14 | x [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 [element 2] : | -| array_flow.rb:1600:16:1600:28 | call to source : | array_flow.rb:1602:9:1602:9 | a [element 2] : | -| array_flow.rb:1601:13:1601:25 | call to source : | array_flow.rb:1602:13:1602:13 | b [element 1] : | -| array_flow.rb:1601:13:1601:25 | call to source : | array_flow.rb:1602:13:1602:13 | b [element 1] : | +| array_flow.rb:1600:5:1600:5 | a [element 2] : | array_flow.rb:1602:9:1602:9 | a [element 2] : | +| array_flow.rb:1600:5:1600:5 | a [element 2] : | array_flow.rb:1602:9:1602:9 | a [element 2] : | +| array_flow.rb:1600:16:1600:28 | call to source : | array_flow.rb:1600:5:1600:5 | a [element 2] : | +| array_flow.rb:1600:16:1600:28 | call to source : | array_flow.rb:1600:5:1600:5 | a [element 2] : | +| array_flow.rb:1601:5:1601:5 | b [element 1] : | array_flow.rb:1602:13:1602:13 | b [element 1] : | +| array_flow.rb:1601:5:1601:5 | b [element 1] : | array_flow.rb:1602:13:1602:13 | b [element 1] : | +| array_flow.rb:1601:13:1601:25 | call to source : | array_flow.rb:1601:5:1601:5 | b [element 1] : | +| array_flow.rb:1601:13:1601:25 | call to source : | array_flow.rb:1601:5:1601:5 | b [element 1] : | +| array_flow.rb:1602:5:1602:5 | c [element] : | array_flow.rb:1603:10:1603:10 | c [element] : | +| array_flow.rb:1602:5:1602:5 | c [element] : | array_flow.rb:1603:10:1603:10 | c [element] : | +| array_flow.rb:1602:5:1602:5 | c [element] : | array_flow.rb:1604:10:1604:10 | c [element] : | +| array_flow.rb:1602:5:1602:5 | c [element] : | array_flow.rb:1604:10:1604:10 | c [element] : | +| array_flow.rb:1602:5:1602:5 | c [element] : | array_flow.rb:1605:10:1605:10 | c [element] : | +| array_flow.rb:1602:5:1602:5 | c [element] : | array_flow.rb:1605:10:1605:10 | c [element] : | | array_flow.rb:1602:9:1602:9 | a [element 2] : | array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | | array_flow.rb:1602:9:1602:9 | a [element 2] : | array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | -| array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | array_flow.rb:1603:10:1603:10 | c [element] : | -| array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | array_flow.rb:1603:10:1603:10 | c [element] : | -| array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | array_flow.rb:1604:10:1604:10 | c [element] : | -| array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | array_flow.rb:1604:10:1604:10 | c [element] : | -| array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | array_flow.rb:1605:10:1605:10 | c [element] : | -| array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | array_flow.rb:1605:10:1605:10 | c [element] : | +| array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | array_flow.rb:1602:5:1602:5 | c [element] : | +| array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | array_flow.rb:1602:5:1602:5 | c [element] : | | array_flow.rb:1602:13:1602:13 | b [element 1] : | array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | | array_flow.rb:1602:13:1602:13 | b [element 1] : | array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | | array_flow.rb:1603:10:1603:10 | c [element] : | array_flow.rb:1603:10:1603:13 | ...[...] | @@ -3432,6 +4241,8 @@ edges | array_flow.rb:1631:10:1631:10 | a [element] : | array_flow.rb:1631:10:1631:15 | ...[...] | | array_flow.rb:1631:10:1631:10 | a [element] : | array_flow.rb:1631:10:1631:15 | ...[...] | nodes +| array_flow.rb:2:5:2:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:2:5:2:5 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:2:9:2:20 | * ... [element 0] : | semmle.label | * ... [element 0] : | | array_flow.rb:2:9:2:20 | * ... [element 0] : | semmle.label | * ... [element 0] : | | array_flow.rb:2:10:2:20 | call to source : | semmle.label | call to source : | @@ -3444,6 +4255,8 @@ nodes | array_flow.rb:5:10:5:10 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:5:10:5:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:5:10:5:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:9:5:9:5 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:9:5:9:5 | a [element 1] : | semmle.label | a [element 1] : | | 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 [element 1] : | semmle.label | a [element 1] : | @@ -3454,6 +4267,8 @@ nodes | array_flow.rb:13:10:13:10 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:13:10:13:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:13:10:13:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:17:5:17:5 | a [element] : | semmle.label | a [element] : | +| array_flow.rb:17:5:17:5 | a [element] : | semmle.label | a [element] : | | array_flow.rb:17:9:17:33 | call to new [element] : | semmle.label | call to new [element] : | | array_flow.rb:17:9:17:33 | call to new [element] : | semmle.label | call to new [element] : | | array_flow.rb:17:22:17:32 | call to source : | semmle.label | call to source : | @@ -3466,6 +4281,8 @@ nodes | array_flow.rb:19:10:19:10 | a [element] : | semmle.label | a [element] : | | array_flow.rb:19:10:19:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:19:10:19:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:21:5:21:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:21:5:21:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:21:9:21:20 | call to new [element] : | semmle.label | call to new [element] : | | array_flow.rb:21:9:21:20 | call to new [element] : | semmle.label | call to new [element] : | | array_flow.rb:21:19:21:19 | a [element] : | semmle.label | a [element] : | @@ -3478,6 +4295,8 @@ nodes | array_flow.rb:23:10:23:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:23:10:23:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:23:10:23:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:25:5:25:5 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:25:5:25:5 | c [element] : | semmle.label | c [element] : | | array_flow.rb:25:9:27:7 | call to new [element] : | semmle.label | call to new [element] : | | array_flow.rb:25:9:27:7 | call to new [element] : | semmle.label | call to new [element] : | | array_flow.rb:26:9:26:19 | call to source : | semmle.label | call to source : | @@ -3490,8 +4309,12 @@ nodes | array_flow.rb:29:10:29:10 | c [element] : | semmle.label | c [element] : | | array_flow.rb:29:10:29:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:29:10:29:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:33:5:33:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:33:5:33:5 | a [element 0] : | semmle.label | a [element 0] : | | 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:5:34:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:34:5:34:5 | b [element 0] : | semmle.label | b [element 0] : | | array_flow.rb:34:9:34:28 | call to try_convert [element 0] : | semmle.label | call to try_convert [element 0] : | | array_flow.rb:34:9:34:28 | call to try_convert [element 0] : | semmle.label | call to try_convert [element 0] : | | array_flow.rb:34:27:34:27 | a [element 0] : | semmle.label | a [element 0] : | @@ -3500,10 +4323,16 @@ nodes | array_flow.rb:35:10:35:10 | b [element 0] : | semmle.label | b [element 0] : | | array_flow.rb:35:10:35:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:35:10:35:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:40:5:40:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:40:5:40:5 | a [element 0] : | semmle.label | a [element 0] : | | 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:5:41:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:41:5:41:5 | b [element 2] : | semmle.label | b [element 2] : | | 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:5:42:5 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:42:5:42:5 | c [element] : | semmle.label | c [element] : | | array_flow.rb:42:9:42:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:42:9:42:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:42:9:42:13 | ... & ... [element] : | semmle.label | ... & ... [element] : | @@ -3518,8 +4347,12 @@ nodes | array_flow.rb:44:10:44:10 | c [element] : | semmle.label | c [element] : | | array_flow.rb:44:10:44:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:44:10:44:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:48:5:48:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:48:5:48:5 | a [element 0] : | semmle.label | a [element 0] : | | 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:5:49:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:49:5:49:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:49:9:49:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:49:9:49:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:49:9:49:13 | ... * ... [element] : | semmle.label | ... * ... [element] : | @@ -3532,10 +4365,18 @@ nodes | array_flow.rb:51:10:51:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:51:10:51:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:51:10:51:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:55:5:55:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:55:5:55:5 | a [element 0] : | semmle.label | a [element 0] : | | 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:5:56:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:56:5:56:5 | b [element 1] : | semmle.label | b [element 1] : | | 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:5:57:5 | c [element 0] : | semmle.label | c [element 0] : | +| array_flow.rb:57:5:57:5 | c [element 0] : | semmle.label | c [element 0] : | +| array_flow.rb:57:5:57:5 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:57:5:57:5 | c [element] : | semmle.label | c [element] : | | array_flow.rb:57:9:57:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:57:9:57:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:57:9:57:13 | ... + ... [element 0] : | semmle.label | ... + ... [element 0] : | @@ -3554,8 +4395,12 @@ nodes | array_flow.rb:59:10:59:10 | c [element] : | semmle.label | c [element] : | | array_flow.rb:59:10:59:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:59:10:59:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:63:5:63:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:63:5:63:5 | a [element 0] : | semmle.label | a [element 0] : | | 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:5:65:5 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:65:5:65:5 | c [element] : | semmle.label | c [element] : | | array_flow.rb:65:9:65:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:65:9:65:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:65:9:65:13 | ... - ... [element] : | semmle.label | ... - ... [element] : | @@ -3568,8 +4413,15 @@ nodes | array_flow.rb:67:10:67:10 | c [element] : | semmle.label | c [element] : | | array_flow.rb:67:10:67:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:67:10:67:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:71:5:71:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:71:5:71:5 | a [element 0] : | semmle.label | a [element 0] : | | 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:5:72:5 | b : | semmle.label | b : | +| array_flow.rb:72:5:72:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:72:5:72:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:72:5:72:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:72:5:72:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:72:9:72:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:72:9:72:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:72:9:72:9 | a [element 0] : | semmle.label | a [element 0] : | @@ -3602,14 +4454,24 @@ nodes | array_flow.rb:76:10:76:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:76:10:76:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:76:10:76:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:80:5:80:5 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:80:5:80:5 | a [element 1] : | semmle.label | a [element 1] : | | 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:8:81:8 | c : | semmle.label | c : | +| array_flow.rb:81:8:81:8 | c : | semmle.label | c : | +| array_flow.rb:81:15:81:15 | __synth__0 [element 1] : | semmle.label | __synth__0 [element 1] : | +| array_flow.rb:81:15:81:15 | __synth__0 [element 1] : | semmle.label | __synth__0 [element 1] : | | array_flow.rb:81:15:81:15 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:81:15:81:15 | a [element 1] : | semmle.label | a [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:5:88:5 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:88:5:88:5 | a [element 1] : | semmle.label | a [element 1] : | | 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:5:89:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:89:5:89:5 | b [element 1] : | semmle.label | b [element 1] : | | array_flow.rb:89:9:89:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:89:9:89:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:89:9:89:15 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | @@ -3622,8 +4484,12 @@ nodes | array_flow.rb:92:10:92:10 | b [element 1] : | semmle.label | b [element 1] : | | array_flow.rb:92:10:92:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:92:10:92:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:96:5:96:5 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:96:5:96:5 | a [element 1] : | semmle.label | a [element 1] : | | 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:5:97:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:97:5:97:5 | b [element 1] : | semmle.label | b [element 1] : | | array_flow.rb:97:9:97:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:97:9:97:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:97:9:97:15 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | @@ -3636,8 +4502,12 @@ nodes | array_flow.rb:101:10:101:10 | b [element 1] : | semmle.label | b [element 1] : | | array_flow.rb:101:10:101:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:101:10:101:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:103:5:103:5 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:103:5:103:5 | a [element 1] : | semmle.label | a [element 1] : | | 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:5:104:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:104:5:104:5 | b [element 1] : | semmle.label | b [element 1] : | | array_flow.rb:104:9:104:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:104:9:104:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:104:9:104:16 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | @@ -3646,10 +4516,16 @@ nodes | array_flow.rb:106:10:106:10 | b [element 1] : | semmle.label | b [element 1] : | | array_flow.rb:106:10:106:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:106:10:106:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:109:5:109:5 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:109:5:109:5 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:109:5:109:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:109:5:109:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:110:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:110:5:110:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:110:9:110:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:110:9:110:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:110:9:110:9 | a [element 3] : | semmle.label | a [element 3] : | @@ -3664,6 +4540,8 @@ nodes | array_flow.rb:112:10:112:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:112:10:112:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:112:10:112:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:114:5:114:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:114:5:114:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:114:9:114:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:114:9:114:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:114:9:114:9 | a [element 3] : | semmle.label | a [element 3] : | @@ -3742,6 +4620,8 @@ nodes | array_flow.rb:148:10:148:10 | a [element] : | semmle.label | a [element] : | | array_flow.rb:148:10:148:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:148:10:148:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:152:5:152:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:152:5:152:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 [element 2] : | semmle.label | a [element 2] : | @@ -3750,6 +4630,8 @@ nodes | 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:5:159:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:159:5:159:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 [element 2] : | semmle.label | a [element 2] : | @@ -3758,8 +4640,14 @@ nodes | 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:5:166:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:166:5:166:5 | a [element 0] : | semmle.label | a [element 0] : | | 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:5:167:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:167:5:167:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:167:5:167:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:167:5:167:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:167:9:167:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:167:9:167:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:167:9:167:9 | a [element 0] : | semmle.label | a [element 0] : | @@ -3792,8 +4680,12 @@ nodes | array_flow.rb:171:10:171:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:171:10:171:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:171:10:171:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:177:5:177:5 | c [element 1] : | semmle.label | c [element 1] : | +| array_flow.rb:177:5:177:5 | c [element 1] : | semmle.label | c [element 1] : | | 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:5:178:5 | d [element 2, element 1] : | semmle.label | d [element 2, element 1] : | +| array_flow.rb:178:5:178:5 | d [element 2, element 1] : | semmle.label | d [element 2, element 1] : | | array_flow.rb:178:16:178:16 | c [element 1] : | semmle.label | c [element 1] : | | array_flow.rb:178:16:178:16 | c [element 1] : | semmle.label | c [element 1] : | | array_flow.rb:179:10:179:26 | ( ... ) | semmle.label | ( ... ) | @@ -3812,6 +4704,8 @@ nodes | array_flow.rb:180:11:180:22 | call to assoc [element 1] : | semmle.label | call to assoc [element 1] : | | array_flow.rb:180:11:180:25 | ...[...] : | semmle.label | ...[...] : | | array_flow.rb:180:11:180:25 | ...[...] : | semmle.label | ...[...] : | +| array_flow.rb:184:5:184:5 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:184:5:184:5 | a [element 1] : | semmle.label | a [element 1] : | | 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 [element 1] : | semmle.label | a [element 1] : | @@ -3822,8 +4716,12 @@ nodes | array_flow.rb:188:10:188:10 | a [element 1] : | semmle.label | a [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:5:192:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:192:5:192:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:193:5 | b : | semmle.label | b : | +| array_flow.rb:193:5:193:5 | b : | semmle.label | b : | | array_flow.rb:193:9:193:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:193:9:193:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:193:9:195:7 | call to bsearch : | semmle.label | call to bsearch : | @@ -3834,6 +4732,8 @@ nodes | 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:5:200:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:200:5:200:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 [element 2] : | semmle.label | a [element 2] : | @@ -3842,6 +4742,8 @@ nodes | 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:5:208:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:208:5:208:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 [element 2] : | semmle.label | a [element 2] : | @@ -3850,6 +4752,10 @@ nodes | 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:5:215:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:215:5:215:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:215:5:215:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:215:5:215:5 | a [element 3] : | semmle.label | a [element 3] : | | 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 : | @@ -3866,8 +4772,12 @@ nodes | 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:5:231:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:231:5:231:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:232:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:232:5:232:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:232:9:232:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:232:9:232:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:232:9:235:7 | call to collect [element] : | semmle.label | call to collect [element] : | @@ -3882,8 +4792,12 @@ nodes | array_flow.rb:236:10:236:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:236:10:236:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:236:10:236:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:240:5:240:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:240:5:240:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:241:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:241:5:241:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:241:9:241:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:241:9:241:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:241:9:241:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -3904,8 +4818,12 @@ nodes | array_flow.rb:246:10:246:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:246:10:246:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:246:10:246:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:250:5:250:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:250:5:250:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:251:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:251:5:251:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:251:9:251:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:251:9:251:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:251:9:254:7 | call to collect_concat [element] : | semmle.label | call to collect_concat [element] : | @@ -3920,6 +4838,8 @@ nodes | array_flow.rb:255:10:255:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:255:10:255:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:255:10:255:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:256:5:256:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:256:5:256:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:256:9:256:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:256:9:256:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:256:9:259:7 | call to collect_concat [element] : | semmle.label | call to collect_concat [element] : | @@ -3934,8 +4854,12 @@ nodes | array_flow.rb:260:10:260:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:260:10:260:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:260:10:260:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:264:5:264:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:264:5:264:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:265:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:265:5:265:5 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:265:9:265:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:265:9:265:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:265:9:267:7 | call to combination [element 2] : | semmle.label | call to combination [element 2] : | @@ -3950,8 +4874,12 @@ nodes | array_flow.rb:269:10:269:10 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:269:10:269:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:269:10:269:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:273:5:273:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:273:5:273:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:274:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:274:5:274:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:274:9:274:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:274:9:274:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:274:9:274:17 | call to compact [element] : | semmle.label | call to compact [element] : | @@ -3960,8 +4888,12 @@ nodes | array_flow.rb:275:10:275:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:275:10:275:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:275:10:275:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:279:5:279:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:279:5:279:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:280:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:280:5:280:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:280:9:280:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:280:9:280:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:280:9:280:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -3976,8 +4908,12 @@ nodes | array_flow.rb:282:10:282:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:282:10:282:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:282:10:282:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:286:5:286:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:286:5:286:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:287:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:287:5:287:5 | b [element 2] : | semmle.label | b [element 2] : | | 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 [element] : | semmle.label | [post] a [element] : | @@ -3994,6 +4930,8 @@ nodes | array_flow.rb:290:10:290:10 | a [element] : | semmle.label | a [element] : | | array_flow.rb:290:10:290:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:290:10:290:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:294:5:294:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:294:5:294:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 [element 2] : | semmle.label | a [element 2] : | @@ -4002,6 +4940,8 @@ nodes | 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:5:301:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:301:5:301:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 [element 2] : | semmle.label | a [element 2] : | @@ -4010,8 +4950,12 @@ nodes | 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:5:308:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:308:5:308:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:309:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:309:5:309:5 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:309:9:309:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:309:9:309:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:309:9:309:21 | call to deconstruct [element 2] : | semmle.label | call to deconstruct [element 2] : | @@ -4020,8 +4964,12 @@ nodes | array_flow.rb:312:10:312:10 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:312:10:312:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:312:10:312:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:316:5:316:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:316:5:316:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:317:5 | b : | semmle.label | b : | +| array_flow.rb:317:5:317:5 | b : | semmle.label | b : | | array_flow.rb:317:9:317:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:317:9:317:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:317:9:317:36 | call to delete : | semmle.label | call to delete : | @@ -4030,10 +4978,16 @@ nodes | 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:325:5:325:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:325:5:325:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:325:5:325:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:325:5:325:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:326:5 | b : | semmle.label | b : | +| array_flow.rb:326:5:326:5 | b : | semmle.label | b : | | array_flow.rb:326:9:326:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | | array_flow.rb:326:9:326:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | | array_flow.rb:326:9:326:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -4048,10 +5002,16 @@ nodes | array_flow.rb:328:10:328:10 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:328:10:328:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:328:10:328:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:330:5:330:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:330:5:330:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:330:5:330:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:330:5:330:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:331:5 | b : | semmle.label | b : | +| array_flow.rb:331:5:331:5 | b : | semmle.label | b : | | array_flow.rb:331:9:331:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:331:9:331:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:331:9:331:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -4070,8 +5030,12 @@ nodes | array_flow.rb:334:10:334:10 | a [element] : | semmle.label | a [element] : | | array_flow.rb:334:10:334:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:334:10:334:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:338:5:338:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:338:5:338:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:339:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:339:5:339:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:339:9:339:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:339:9:339:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:339:9:339:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -4098,8 +5062,12 @@ nodes | array_flow.rb:345:10:345:10 | a [element] : | semmle.label | a [element] : | | array_flow.rb:345:10:345:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:345:10:345:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:349:5:349:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:349:5:349:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:350:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:350:5:350:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:350:9:350:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:350:9:350:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:350:9:350:25 | call to difference [element] : | semmle.label | call to difference [element] : | @@ -4108,6 +5076,10 @@ nodes | array_flow.rb:351:10:351:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:351:10:351:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:351:10:351:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:355:5:355:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:355:5:355:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:355:5:355:5 | a [element 3, element 1] : | semmle.label | a [element 3, element 1] : | +| array_flow.rb:355:5:355:5 | a [element 3, element 1] : | semmle.label | a [element 3, element 1] : | | 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 : | @@ -4124,8 +5096,12 @@ nodes | array_flow.rb:360:10:360:10 | a [element 3, element 1] : | semmle.label | a [element 3, 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:5:364:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:364:5:364:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:365:5 | b : | semmle.label | b : | +| array_flow.rb:365:5:365:5 | b : | semmle.label | b : | | array_flow.rb:365:9:365:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:365:9:365:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:365:9:367:7 | call to detect : | semmle.label | call to detect : | @@ -4138,10 +5114,16 @@ nodes | 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:5:372:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:372:5:372:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:372:5:372:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:372:5:372:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:373:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:373:5:373:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:373:9:373:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:373:9:373:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:373:9:373:9 | a [element 3] : | semmle.label | a [element 3] : | @@ -4152,6 +5134,10 @@ nodes | array_flow.rb:374:10:374:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:374:10:374:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:374:10:374:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:375:5:375:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:375:5:375:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:375:5:375:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:375:5:375:5 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:375:9:375:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:375:9:375:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:375:9:375:9 | a [element 3] : | semmle.label | a [element 3] : | @@ -4174,6 +5160,10 @@ nodes | array_flow.rb:379:5:379:5 | [post] a [element] : | semmle.label | [post] a [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:5:380:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:380:5:380:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:380:5:380:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:380:5:380:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:380:9:380:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:380:9:380:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:380:9:380:9 | a [element] : | semmle.label | a [element] : | @@ -4188,6 +5178,8 @@ nodes | array_flow.rb:381:10:381:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:381:10:381:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:381:10:381:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:382:5:382:5 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:382:5:382:5 | c [element] : | semmle.label | c [element] : | | array_flow.rb:382:9:382:9 | b [element] : | semmle.label | b [element] : | | array_flow.rb:382:9:382:9 | b [element] : | semmle.label | b [element] : | | array_flow.rb:382:9:382:19 | call to drop [element] : | semmle.label | call to drop [element] : | @@ -4196,10 +5188,16 @@ nodes | array_flow.rb:383:10:383:10 | c [element] : | semmle.label | c [element] : | | array_flow.rb:383:10:383:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:383:10:383:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:387:5:387:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:387:5:387:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:387:5:387:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:387:5:387:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:388:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:388:5:388:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:388:9:388:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:388:9:388:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:388:9:388:9 | a [element 3] : | semmle.label | a [element 3] : | @@ -4214,8 +5212,12 @@ nodes | array_flow.rb:391:10:391:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:391:10:391:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:391:10:391:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:395:5:395:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:395:5:395:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:396:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:396:5:396:5 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:396:9:396:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:396:9:396:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:396:9:398:7 | call to each [element 2] : | semmle.label | call to each [element 2] : | @@ -4228,12 +5230,16 @@ nodes | array_flow.rb:399:10:399:10 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:399:10:399:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:399:10:399:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:403:5:403:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:403:5:403:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:404:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:404:5:404:5 | b [element 2] : | semmle.label | b [element 2] : | | 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:13:404:13 | x : | semmle.label | x : | +| array_flow.rb:404:13:404:13 | x : | semmle.label | x : | | array_flow.rb:404:18:404:18 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:404:18:404:18 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:405:14:405:14 | x | semmle.label | x | @@ -4244,6 +5250,8 @@ nodes | array_flow.rb:408:10:408:10 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:408:10:408:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:408:10:408:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:412:5:412:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:412:5:412:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 [element 2] : | semmle.label | a [element 2] : | @@ -4256,8 +5264,12 @@ nodes | array_flow.rb:414:15:414:15 | x [element] : | semmle.label | x [element] : | | array_flow.rb:414:15:414:18 | ...[...] : | semmle.label | ...[...] : | | array_flow.rb:414:15:414:18 | ...[...] : | semmle.label | ...[...] : | +| array_flow.rb:419:5:419:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:419:5:419:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:420:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:420:5:420:5 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:420:9:420:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:420:9:420:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:420:9:422:7 | call to each_entry [element 2] : | semmle.label | call to each_entry [element 2] : | @@ -4270,8 +5282,12 @@ nodes | array_flow.rb:423:10:423:10 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:423:10:423:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:423:10:423:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:427:5:427:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:427:5:427:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:428:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:428:5:428:5 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:428:9:428:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:428:9:428:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:428:9:430:7 | call to each_index [element 2] : | semmle.label | call to each_index [element 2] : | @@ -4280,6 +5296,8 @@ nodes | array_flow.rb:431:10:431:10 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:431:10:431:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:431:10:431:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:435:5:435:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:435:5:435:5 | a [element 3] : | semmle.label | a [element 3] : | | 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 [element 3] : | semmle.label | a [element 3] : | @@ -4290,8 +5308,12 @@ nodes | array_flow.rb:437:14:437:14 | x [element] : | semmle.label | x [element] : | | array_flow.rb:437:14:437:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:437:14:437:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:442:5:442:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:442:5:442:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:443:5 | b [element 3] : | semmle.label | b [element 3] : | +| array_flow.rb:443:5:443:5 | b [element 3] : | semmle.label | b [element 3] : | | array_flow.rb:443:9:443:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:443:9:443:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:443:9:446:7 | call to each_with_index [element 3] : | semmle.label | call to each_with_index [element 3] : | @@ -4304,8 +5326,12 @@ nodes | array_flow.rb:447:10:447:10 | b [element 3] : | semmle.label | b [element 3] : | | array_flow.rb:447:10:447:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:447:10:447:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:451:5:451:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:451:5:451:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:452:5 | b : | semmle.label | b : | +| array_flow.rb:452:5:452:5 | b : | semmle.label | b : | | array_flow.rb:452:9:452:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:452:9:452:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:452:9:455:7 | call to each_with_object : | semmle.label | call to each_with_object : | @@ -4322,8 +5348,12 @@ nodes | 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:5:460:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:460:5:460:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:461:5 | b [element 3] : | semmle.label | b [element 3] : | +| array_flow.rb:461:5:461:5 | b [element 3] : | semmle.label | b [element 3] : | | array_flow.rb:461:9:461:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:461:9:461:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:461:9:461:17 | call to entries [element 3] : | semmle.label | call to entries [element 3] : | @@ -4332,10 +5362,16 @@ nodes | array_flow.rb:462:10:462:10 | b [element 3] : | semmle.label | b [element 3] : | | array_flow.rb:462:10:462:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:462:10:462:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:466:5:466:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:466:5:466:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:466:5:466:5 | a [element 4] : | semmle.label | a [element 4] : | +| array_flow.rb:466:5:466:5 | a [element 4] : | semmle.label | a [element 4] : | | 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:5:467:5 | b : | semmle.label | b : | +| array_flow.rb:467:5:467:5 | b : | semmle.label | b : | | array_flow.rb:467:9:467:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:467:9:467:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:467:9:467:9 | a [element 4] : | semmle.label | a [element 4] : | @@ -4350,12 +5386,16 @@ nodes | 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:5:471:5 | b : | semmle.label | b : | +| array_flow.rb:471:5:471:5 | b : | semmle.label | b : | | array_flow.rb:471:9:471:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:471:9:471:9 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:473:5 | b : | semmle.label | b : | +| array_flow.rb:473:5:473:5 | b : | semmle.label | b : | | array_flow.rb:473:9:473:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:473:9:473:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:473:9:473:32 | call to fetch : | semmle.label | call to fetch : | @@ -4364,12 +5404,16 @@ nodes | 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:5:475:5 | b : | semmle.label | b : | +| array_flow.rb:475:5:475:5 | b : | semmle.label | b : | | 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:5:477:5 | b : | semmle.label | b : | +| array_flow.rb:477:5:477:5 | b : | semmle.label | b : | | array_flow.rb:477:9:477:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:477:9:477:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:477:9:477:9 | a [element 4] : | semmle.label | a [element 4] : | @@ -4380,6 +5424,8 @@ nodes | 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:5:482:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:482:5:482:5 | a [element 3] : | semmle.label | a [element 3] : | | 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 [element] : | semmle.label | [post] a [element] : | @@ -4416,8 +5462,12 @@ nodes | array_flow.rb:494:10:494:10 | a [element] : | semmle.label | a [element] : | | array_flow.rb:494:10:494:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:494:10:494:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:498:5:498:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:498:5:498:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:499:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:499:5:499:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:499:9:499:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:499:9:499:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:499:9:501:7 | call to filter [element] : | semmle.label | call to filter [element] : | @@ -4430,8 +5480,12 @@ nodes | array_flow.rb:502:10:502:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:502:10:502:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:502:10:502:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:506:5:506:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:506:5:506:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:507:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:507:5:507:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:507:9:507:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:507:9:507:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:507:9:509:7 | call to filter_map [element] : | semmle.label | call to filter_map [element] : | @@ -4444,8 +5498,12 @@ nodes | array_flow.rb:510:10:510:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:510:10:510:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:510:10:510:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:514:5:514:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:514:5:514:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:515:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:515:5:515:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:515:9:515:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:515:9:515:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:515:9:515:9 | a [element 3] : | semmle.label | a [element 3] : | @@ -4464,8 +5522,12 @@ nodes | array_flow.rb:520:10:520:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:520:10:520:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:520:10:520:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:524:5:524:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:524:5:524:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:525:5 | b : | semmle.label | b : | +| array_flow.rb:525:5:525:5 | b : | semmle.label | b : | | array_flow.rb:525:9:525:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:525:9:525:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:525:9:527:7 | call to find : | semmle.label | call to find : | @@ -4478,8 +5540,12 @@ nodes | 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:5:532:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:532:5:532:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:533:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:533:5:533:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:533:9:533:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:533:9:533:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:533:9:535:7 | call to find_all [element] : | semmle.label | call to find_all [element] : | @@ -4492,6 +5558,8 @@ nodes | array_flow.rb:536:10:536:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:536:10:536:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:536:10:536:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:540:5:540:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:540:5:540:5 | a [element 3] : | semmle.label | a [element 3] : | | 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 [element 3] : | semmle.label | a [element 3] : | @@ -4500,6 +5568,10 @@ nodes | 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:5:547:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:547:5:547:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:547:5:547:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:547:5:547:5 | a [element 3] : | semmle.label | a [element 3] : | | 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 : | @@ -4514,6 +5586,10 @@ nodes | array_flow.rb:549:10:549:10 | a [element] : | semmle.label | a [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:5:550:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:550:5:550:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:550:5:550:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:550:5:550:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:550:9:550:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:550:9:550:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:550:9:550:9 | a [element] : | semmle.label | a [element] : | @@ -4532,6 +5608,12 @@ nodes | array_flow.rb:552:10:552:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:552:10:552:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:552:10:552:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:553:5:553:5 | c [element 0] : | semmle.label | c [element 0] : | +| array_flow.rb:553:5:553:5 | c [element 0] : | semmle.label | c [element 0] : | +| array_flow.rb:553:5:553:5 | c [element 3] : | semmle.label | c [element 3] : | +| array_flow.rb:553:5:553:5 | c [element 3] : | semmle.label | c [element 3] : | +| array_flow.rb:553:5:553:5 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:553:5:553:5 | c [element] : | semmle.label | c [element] : | | array_flow.rb:553:9:553:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:553:9:553:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:553:9:553:9 | a [element 3] : | semmle.label | a [element 3] : | @@ -4556,8 +5638,12 @@ nodes | array_flow.rb:555:10:555:10 | c [element] : | semmle.label | c [element] : | | array_flow.rb:555:10:555:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:555:10:555:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:559:5:559:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:559:5:559:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:560:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:560:5:560:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:560:9:560:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:560:9:560:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:560:9:563:7 | call to flat_map [element] : | semmle.label | call to flat_map [element] : | @@ -4572,6 +5658,8 @@ nodes | array_flow.rb:564:10:564:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:564:10:564:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:564:10:564:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:565:5:565:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:565:5:565:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:565:9:565:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:565:9:565:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:565:9:568:7 | call to flat_map [element] : | semmle.label | call to flat_map [element] : | @@ -4586,8 +5674,12 @@ nodes | array_flow.rb:569:10:569:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:569:10:569:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:569:10:569:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:573:5:573:5 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | +| array_flow.rb:573:5:573:5 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | | 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:5:574:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:574:5:574:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:574:9:574:9 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | | array_flow.rb:574:9:574:9 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | | array_flow.rb:574:9:574:17 | call to flatten [element] : | semmle.label | call to flatten [element] : | @@ -4596,6 +5688,8 @@ nodes | array_flow.rb:575:10:575:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:575:10:575:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:575:10:575:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:579:5:579:5 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | +| array_flow.rb:579:5:579:5 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | | 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 [element 2, element 1] : | semmle.label | a [element 2, element 1] : | @@ -4604,6 +5698,10 @@ nodes | array_flow.rb:580:10:580:13 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | | array_flow.rb:580:10:580:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:580:10:580:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:581:5:581:5 | b [element, element 1] : | semmle.label | b [element, element 1] : | +| array_flow.rb:581:5:581:5 | b [element, element 1] : | semmle.label | b [element, element 1] : | +| array_flow.rb:581:5:581:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:581:5:581:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:581:9:581:9 | [post] a [element, element 1] : | semmle.label | [post] a [element, element 1] : | | array_flow.rb:581:9:581:9 | [post] a [element, element 1] : | semmle.label | [post] a [element, element 1] : | | array_flow.rb:581:9:581:9 | [post] a [element] : | semmle.label | [post] a [element] : | @@ -4638,8 +5736,12 @@ nodes | array_flow.rb:585:10:585:13 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | | array_flow.rb:585:10:585:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:585:10:585:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:589:5:589:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:589:5:589:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:590:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:590:5:590:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:590:9:590:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:590:9:590:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:590:9:590:20 | call to grep [element] : | semmle.label | call to grep [element] : | @@ -4648,6 +5750,8 @@ nodes | array_flow.rb:591:10:591:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:591:10:591:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:591:10:591:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:592:5:592:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:592:5:592:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:592:9:592:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:592:9:592:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:592:9:595:7 | call to grep [element] : | semmle.label | call to grep [element] : | @@ -4662,8 +5766,12 @@ nodes | array_flow.rb:596:10:596:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:596:10:596:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:596:10:596:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:600:5:600:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:600:5:600:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:601:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:601:5:601:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:601:9:601:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:601:9:601:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:601:9:601:21 | call to grep_v [element] : | semmle.label | call to grep_v [element] : | @@ -4672,6 +5780,8 @@ nodes | array_flow.rb:602:10:602:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:602:10:602:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:602:10:602:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:603:5:603:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:603:5:603:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:603:9:603:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:603:9:603:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:603:9:606:7 | call to grep_v [element] : | semmle.label | call to grep_v [element] : | @@ -4686,6 +5796,8 @@ nodes | array_flow.rb:607:10:607:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:607:10:607:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:607:10:607:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:611:5:611:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:611:5:611:5 | a [element 3] : | semmle.label | a [element 3] : | | 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 [element 3] : | semmle.label | a [element 3] : | @@ -4694,6 +5806,8 @@ nodes | 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:5:620:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:620:5:620:5 | a [element 3] : | semmle.label | a [element 3] : | | 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 [element 3] : | semmle.label | a [element 3] : | @@ -4702,10 +5816,16 @@ nodes | 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:5:627:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:627:5:627:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:627:5:627:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:627:5:627:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:628:5 | b : | semmle.label | b : | +| array_flow.rb:628:5:628:5 | b : | semmle.label | b : | | array_flow.rb:628:9:628:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:628:9:628:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:628:9:628:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -4724,6 +5844,8 @@ nodes | 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:5:634:5 | c : | semmle.label | c : | +| array_flow.rb:634:5:634:5 | c : | semmle.label | c : | | array_flow.rb:634:9:634:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:634:9:634:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:634:9:634:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -4738,8 +5860,16 @@ nodes | 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:5:644:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:644:5:644:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:645:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:645:5:645:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:645:5:645:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:645:5:645:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:645:5:645:5 | b [element 4] : | semmle.label | b [element 4] : | +| array_flow.rb:645:5:645:5 | b [element 4] : | semmle.label | b [element 4] : | | array_flow.rb:645:9:645:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | | array_flow.rb:645:9:645:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | | array_flow.rb:645:9:645:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | @@ -4782,8 +5912,12 @@ nodes | array_flow.rb:655:10:655:10 | b [element 4] : | semmle.label | b [element 4] : | | array_flow.rb:655:10:655:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:655:10:655:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:658:5:658:5 | c [element 2] : | semmle.label | c [element 2] : | +| array_flow.rb:658:5:658:5 | c [element 2] : | semmle.label | c [element 2] : | | 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:5:659:5 | d [element] : | semmle.label | d [element] : | +| array_flow.rb:659:5:659:5 | d [element] : | semmle.label | d [element] : | | array_flow.rb:659:9:659:9 | [post] c [element] : | semmle.label | [post] c [element] : | | array_flow.rb:659:9:659:9 | [post] c [element] : | semmle.label | [post] c [element] : | | array_flow.rb:659:9:659:9 | c [element 2] : | semmle.label | c [element 2] : | @@ -4802,8 +5936,12 @@ nodes | array_flow.rb:661:10:661:10 | d [element] : | semmle.label | d [element] : | | array_flow.rb:661:10:661:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:661:10:661:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:672:5:672:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:672:5:672:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:673:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:673:5:673:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:673:9:673:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:673:9:673:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:673:9:673:60 | call to intersection [element] : | semmle.label | call to intersection [element] : | @@ -4816,8 +5954,12 @@ nodes | array_flow.rb:674:10:674:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:674:10:674:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:674:10:674:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:678:5:678:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:678:5:678:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:679:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:679:5:679:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:679:9:679:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:679:9:679:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:679:9:679:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -4836,6 +5978,8 @@ nodes | array_flow.rb:684:10:684:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:684:10:684:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:684:10:684:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:688:5:688:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:688:5:688:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 [element] : | semmle.label | [post] a [element] : | @@ -4848,6 +5992,8 @@ nodes | array_flow.rb:690:10:690:10 | a [element] : | semmle.label | a [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:5:691:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:691:5:691:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:691:9:691:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:691:9:691:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:691:9:691:9 | a [element] : | semmle.label | a [element] : | @@ -4862,8 +6008,12 @@ nodes | array_flow.rb:693:10:693:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:693:10:693:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:693:10:693:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:697:5:697:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:697:5:697:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:698:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:698:5:698:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:698:9:698:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:698:9:698:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:698:9:701:7 | call to map [element] : | semmle.label | call to map [element] : | @@ -4878,8 +6028,12 @@ nodes | array_flow.rb:702:10:702:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:702:10:702:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:702:10:702:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:706:5:706:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:706:5:706:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:707:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:707:5:707:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:707:9:707:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:707:9:707:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:707:9:710:7 | call to map! [element] : | semmle.label | call to map! [element] : | @@ -4894,14 +6048,20 @@ nodes | array_flow.rb:711:10:711:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:711:10:711:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:711:10:711:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:715:5:715:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:715:5:715:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:718:5 | b : | semmle.label | b : | +| array_flow.rb:718:5:718:5 | b : | semmle.label | b : | | array_flow.rb:718:9:718:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:718:9:718:9 | a [element 2] : | semmle.label | a [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:5:722:5 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:722:5:722:5 | c [element] : | semmle.label | c [element] : | | array_flow.rb:722:9:722:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:722:9:722:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:722:9:722:16 | call to max [element] : | semmle.label | call to max [element] : | @@ -4910,6 +6070,8 @@ nodes | array_flow.rb:723:10:723:10 | c [element] : | semmle.label | c [element] : | | array_flow.rb:723:10:723:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:723:10:723:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:726:5:726:5 | d : | semmle.label | d : | +| array_flow.rb:726:5:726:5 | d : | semmle.label | d : | | array_flow.rb:726:9:726:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:726:9:726:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:726:9:730:7 | call to max : | semmle.label | call to max : | @@ -4924,6 +6086,8 @@ nodes | 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:5:734:5 | e [element] : | semmle.label | e [element] : | +| array_flow.rb:734:5:734:5 | e [element] : | semmle.label | e [element] : | | array_flow.rb:734:9:734:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:734:9:734:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:734:9:738:7 | call to max [element] : | semmle.label | call to max [element] : | @@ -4940,8 +6104,12 @@ nodes | array_flow.rb:739:10:739:10 | e [element] : | semmle.label | e [element] : | | array_flow.rb:739:10:739:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:739:10:739:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:743:5:743:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:743:5:743:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:746:5 | b : | semmle.label | b : | +| array_flow.rb:746:5:746:5 | b : | semmle.label | b : | | array_flow.rb:746:9:746:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:746:9:746:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:746:9:749:7 | call to max_by : | semmle.label | call to max_by : | @@ -4952,6 +6120,8 @@ nodes | 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:5:753:5 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:753:5:753:5 | c [element] : | semmle.label | c [element] : | | array_flow.rb:753:9:753:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:753:9:753:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:753:9:756:7 | call to max_by [element] : | semmle.label | call to max_by [element] : | @@ -4964,14 +6134,20 @@ nodes | array_flow.rb:757:10:757:10 | c [element] : | semmle.label | c [element] : | | array_flow.rb:757:10:757:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:757:10:757:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:761:5:761:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:761:5:761:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:764:5 | b : | semmle.label | b : | +| array_flow.rb:764:5:764:5 | b : | semmle.label | b : | | array_flow.rb:764:9:764:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:764:9:764:9 | a [element 2] : | semmle.label | a [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:5:768:5 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:768:5:768:5 | c [element] : | semmle.label | c [element] : | | array_flow.rb:768:9:768:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:768:9:768:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:768:9:768:16 | call to min [element] : | semmle.label | call to min [element] : | @@ -4980,6 +6156,8 @@ nodes | array_flow.rb:769:10:769:10 | c [element] : | semmle.label | c [element] : | | array_flow.rb:769:10:769:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:769:10:769:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:772:5:772:5 | d : | semmle.label | d : | +| array_flow.rb:772:5:772:5 | d : | semmle.label | d : | | array_flow.rb:772:9:772:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:772:9:772:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:772:9:776:7 | call to min : | semmle.label | call to min : | @@ -4994,6 +6172,8 @@ nodes | 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:5:780:5 | e [element] : | semmle.label | e [element] : | +| array_flow.rb:780:5:780:5 | e [element] : | semmle.label | e [element] : | | array_flow.rb:780:9:780:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:780:9:780:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:780:9:784:7 | call to min [element] : | semmle.label | call to min [element] : | @@ -5010,8 +6190,12 @@ nodes | array_flow.rb:785:10:785:10 | e [element] : | semmle.label | e [element] : | | array_flow.rb:785:10:785:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:785:10:785:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:789:5:789:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:789:5:789:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:792:5 | b : | semmle.label | b : | +| array_flow.rb:792:5:792:5 | b : | semmle.label | b : | | array_flow.rb:792:9:792:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:792:9:792:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:792:9:795:7 | call to min_by : | semmle.label | call to min_by : | @@ -5022,6 +6206,8 @@ nodes | 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:5:799:5 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:799:5:799:5 | c [element] : | semmle.label | c [element] : | | array_flow.rb:799:9:799:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:799:9:799:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:799:9:802:7 | call to min_by [element] : | semmle.label | call to min_by [element] : | @@ -5034,8 +6220,12 @@ nodes | array_flow.rb:803:10:803:10 | c [element] : | semmle.label | c [element] : | | array_flow.rb:803:10:803:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:803:10:803:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:807:5:807:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:807:5:807:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:809:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:809:5:809:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:809:9:809:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:809:9:809:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:809:9:809:16 | call to minmax [element] : | semmle.label | call to minmax [element] : | @@ -5048,6 +6238,8 @@ nodes | array_flow.rb:811:10:811:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:811:10:811:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:811:10:811:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:813:5:813:5 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:813:5:813:5 | c [element] : | semmle.label | c [element] : | | array_flow.rb:813:9:813:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:813:9:813:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:813:9:817:7 | call to minmax [element] : | semmle.label | call to minmax [element] : | @@ -5068,8 +6260,12 @@ nodes | array_flow.rb:819:10:819:10 | c [element] : | semmle.label | c [element] : | | array_flow.rb:819:10:819:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:819:10:819:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:823:5:823:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:823:5:823:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:824:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:824:5:824:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:824:9:824:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:824:9:824:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:824:9:827:7 | call to minmax_by [element] : | semmle.label | call to minmax_by [element] : | @@ -5086,6 +6282,8 @@ nodes | array_flow.rb:829:10:829:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:829:10:829:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:829:10:829:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:833:5:833:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:833:5:833:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 [element 2] : | semmle.label | a [element 2] : | @@ -5094,6 +6292,8 @@ nodes | 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:5:842:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:842:5:842:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 [element 2] : | semmle.label | a [element 2] : | @@ -5102,12 +6302,18 @@ nodes | 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:5:849:5 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:849:16:849:25 | call to source : | semmle.label | call to source : | +| array_flow.rb:850:5:850:5 | b : | semmle.label | b : | | array_flow.rb:850:9:850:9 | a [element 2] : | semmle.label | a [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:5:855:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:855:5:855:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:856:5 | b [element, element] : | semmle.label | b [element, element] : | +| array_flow.rb:856:5:856:5 | b [element, element] : | semmle.label | b [element, element] : | | array_flow.rb:856:9:856:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:856:9:856:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:856:9:859:7 | call to partition [element, element] : | semmle.label | call to partition [element, element] : | @@ -5128,8 +6334,12 @@ nodes | array_flow.rb:861:10:861:13 | ...[...] [element] : | semmle.label | ...[...] [element] : | | array_flow.rb:861:10:861:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:861:10:861:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:865:5:865:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:865:5:865:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:867:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:867:5:867:5 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:867:9:867:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:867:9:867:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:867:9:871:7 | call to permutation [element 2] : | semmle.label | call to permutation [element 2] : | @@ -5152,6 +6362,8 @@ nodes | array_flow.rb:873:10:873:10 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:873:10:873:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:873:10:873:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:875:5:875:5 | c [element 2] : | semmle.label | c [element 2] : | +| array_flow.rb:875:5:875:5 | c [element 2] : | semmle.label | c [element 2] : | | array_flow.rb:875:9:875:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:875:9:875:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:875:9:878:7 | call to permutation [element 2] : | semmle.label | call to permutation [element 2] : | @@ -5186,10 +6398,16 @@ nodes | array_flow.rb:887:10:887:10 | c [element 2] : | semmle.label | c [element 2] : | | array_flow.rb:887:10:887:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:887:10:887:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:894:5:894:5 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:894:5:894:5 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:894:5:894:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:894:5:894:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:895:5 | b : | semmle.label | b : | +| array_flow.rb:895:5:895:5 | b : | semmle.label | b : | | array_flow.rb:895:9:895:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:895:9:895:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:895:9:895:9 | a [element 3] : | semmle.label | a [element 3] : | @@ -5206,10 +6424,16 @@ nodes | array_flow.rb:900:10:900:10 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:900:10:900:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:900:10:900:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:902:5:902:5 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:902:5:902:5 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:902:5:902:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:902:5:902:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:903:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:903:5:903:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:903:9:903:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:903:9:903:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:903:9:903:9 | a [element 3] : | semmle.label | a [element 3] : | @@ -5232,6 +6456,8 @@ nodes | array_flow.rb:909:10:909:10 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:909:10:909:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:909:10:909:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:913:5:913:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:913:5:913:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 [element 2] : | semmle.label | [post] a [element 2] : | @@ -5250,12 +6476,20 @@ nodes | array_flow.rb:920:10:920:10 | a [element 5] : | semmle.label | a [element 5] : | | array_flow.rb:920:10:920:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:920:10:920:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:924:5:924:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:924:5:924:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:925:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:925:5:925:5 | b [element 1] : | semmle.label | b [element 1] : | | 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:5:926:5 | c [element 0] : | semmle.label | c [element 0] : | +| array_flow.rb:926:5:926:5 | c [element 0] : | semmle.label | c [element 0] : | | 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:5:927:5 | d [element, element] : | semmle.label | d [element, element] : | +| array_flow.rb:927:5:927:5 | d [element, element] : | semmle.label | d [element, element] : | | array_flow.rb:927:9:927:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:927:9:927:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:927:9:927:22 | call to product [element, element] : | semmle.label | call to product [element, element] : | @@ -5276,8 +6510,14 @@ nodes | array_flow.rb:929:10:929:13 | ...[...] [element] : | semmle.label | ...[...] [element] : | | array_flow.rb:929:10:929:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:929:10:929:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:933:5:933:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:933:5:933:5 | a [element 0] : | semmle.label | a [element 0] : | | 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:5:934:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:934:5:934:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:934:5:934:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:934:5:934:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:934:9:934:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:934:9:934:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:934:9:934:9 | a [element 0] : | semmle.label | a [element 0] : | @@ -5310,8 +6550,12 @@ nodes | array_flow.rb:938:10:938:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:938:10:938:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:938:10:938:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:944:5:944:5 | c [element 0] : | semmle.label | c [element 0] : | +| array_flow.rb:944:5:944:5 | c [element 0] : | semmle.label | c [element 0] : | | 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:5:945:5 | d [element 2, element 0] : | semmle.label | d [element 2, element 0] : | +| array_flow.rb:945:5:945:5 | d [element 2, element 0] : | semmle.label | d [element 2, element 0] : | | array_flow.rb:945:16:945:16 | c [element 0] : | semmle.label | c [element 0] : | | array_flow.rb:945:16:945:16 | c [element 0] : | semmle.label | c [element 0] : | | array_flow.rb:946:10:946:10 | d [element 2, element 0] : | semmle.label | d [element 2, element 0] : | @@ -5326,6 +6570,10 @@ nodes | array_flow.rb:947:10:947:22 | call to rassoc [element 0] : | semmle.label | call to rassoc [element 0] : | | array_flow.rb:947:10:947:25 | ...[...] | semmle.label | ...[...] | | array_flow.rb:947:10:947:25 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:951:5:951:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:951:5:951:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:951:5:951:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:951:5:951:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 : | @@ -5350,8 +6598,12 @@ nodes | 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:5:965:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:965:5:965:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:966:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:966:5:966:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:966:9:966:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:966:9:966:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:966:9:969:7 | call to reject [element] : | semmle.label | call to reject [element] : | @@ -5364,8 +6616,12 @@ nodes | array_flow.rb:970:10:970:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:970:10:970:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:970:10:970:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:974:5:974:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:974:5:974:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:975:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:975:5:975:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:975:9:975:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:975:9:975:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:975:9:975:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -5384,8 +6640,12 @@ nodes | array_flow.rb:980:10:980:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:980:10:980:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:980:10:980:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:984:5:984:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:984:5:984:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:985:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:985:5:985:5 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:985:9:985:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:985:9:985:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:985:9:988:7 | call to repeated_combination [element 2] : | semmle.label | call to repeated_combination [element 2] : | @@ -5404,8 +6664,12 @@ nodes | array_flow.rb:990:10:990:10 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:990:10:990:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:990:10:990:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:994:5:994:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:994:5:994:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:995:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:995:5:995:5 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:995:9:995:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:995:9:995:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:995:9:998:7 | call to repeated_permutation [element 2] : | semmle.label | call to repeated_permutation [element 2] : | @@ -5424,6 +6688,8 @@ nodes | array_flow.rb:1000:10:1000:10 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:1000:10:1000:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1000:10:1000:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1006:5:1006:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1006:5:1006:5 | b [element 0] : | semmle.label | b [element 0] : | | array_flow.rb:1006:9:1006:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | | array_flow.rb:1006:9:1006:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | | array_flow.rb:1006:9:1006:33 | call to replace [element 0] : | semmle.label | call to replace [element 0] : | @@ -5438,10 +6704,16 @@ nodes | array_flow.rb:1008:10:1008:10 | b [element 0] : | semmle.label | b [element 0] : | | array_flow.rb:1008:10:1008:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1008:10:1008:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1012:5:1012:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1012:5:1012:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1012:5:1012:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1012:5:1012:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:1013:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1013:5:1013:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1013:9:1013:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1013:9:1013:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1013:9:1013:9 | a [element 3] : | semmle.label | a [element 3] : | @@ -5468,10 +6740,16 @@ nodes | array_flow.rb:1019:10:1019:10 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:1019:10:1019:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1019:10:1019:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1023:5:1023:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1023:5:1023:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1023:5:1023:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1023:5:1023:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:1024:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1024:5:1024:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1024:9:1024:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1024:9:1024:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1024:9:1024:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -5508,8 +6786,12 @@ nodes | array_flow.rb:1030:10:1030:10 | a [element] : | semmle.label | a [element] : | | array_flow.rb:1030:10:1030:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1030:10:1030:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1034:5:1034:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1034:5:1034:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:1035:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1035:5:1035:5 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:1035:9:1035:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1035:9:1035:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1035:9:1037:7 | call to reverse_each [element 2] : | semmle.label | call to reverse_each [element 2] : | @@ -5522,6 +6804,8 @@ nodes | array_flow.rb:1038:10:1038:10 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:1038:10:1038:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1038:10:1038:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1042:5:1042:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1042:5:1042:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 [element 2] : | semmle.label | a [element 2] : | @@ -5530,12 +6814,24 @@ nodes | 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:5:1052:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1052:5:1052:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1052:5:1052:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1052:5:1052:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1052:5:1052:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1052:5:1052:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:1054:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:1054:5:1054:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:1054:5:1054:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1054:5:1054:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1054:5:1054:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1054:5:1054:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1054:9:1054:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:1054:9:1054:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:1054:9:1054:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -5568,6 +6864,12 @@ nodes | array_flow.rb:1058:10:1058:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1058:10:1058:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1058:10:1058:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1060:5:1060:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1060:5:1060:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1060:5:1060:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:1060:5:1060:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:1060:5:1060:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1060:5:1060:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1060:9:1060:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:1060:9:1060:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:1060:9:1060:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -5600,6 +6902,12 @@ nodes | array_flow.rb:1064:10:1064:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1064:10:1064:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1064:10:1064:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1066:5:1066:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1066:5:1066:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1066:5:1066:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1066:5:1066:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1066:5:1066:5 | b [element 3] : | semmle.label | b [element 3] : | +| array_flow.rb:1066:5:1066:5 | b [element 3] : | semmle.label | b [element 3] : | | array_flow.rb:1066:9:1066:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:1066:9:1066:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:1066:9:1066:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -5624,6 +6932,8 @@ nodes | array_flow.rb:1070:10:1070:10 | b [element 3] : | semmle.label | b [element 3] : | | array_flow.rb:1070:10:1070:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1070:10:1070:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1072:5:1072:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1072:5:1072:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1072:9:1072:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:1072:9:1072:9 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:1072:9:1072:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -5648,12 +6958,24 @@ nodes | array_flow.rb:1076:10:1076:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1076:10:1076:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1076:10:1076:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1084:5:1084:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1084:5:1084:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1084:5:1084:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1084:5:1084:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1084:5:1084:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1084:5:1084:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:1085:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:1085:5:1085:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:1085:5:1085:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1085:5:1085:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1085:5:1085:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1085:5:1085:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1085:9:1085:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | | array_flow.rb:1085:9:1085:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | | array_flow.rb:1085:9:1085:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | @@ -5712,12 +7034,24 @@ nodes | array_flow.rb:1093:10:1093:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1093:10:1093:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1093:10:1093:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1095:5:1095:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1095:5:1095:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1095:5:1095:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1095:5:1095:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1095:5:1095:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1095:5:1095:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:1096:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1096:5:1096:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1096:5:1096:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:1096:5:1096:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:1096:5:1096:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1096:5:1096:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1096:9:1096:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | | array_flow.rb:1096:9:1096:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | | array_flow.rb:1096:9:1096:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | @@ -5776,12 +7110,24 @@ nodes | array_flow.rb:1104:10:1104:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1104:10:1104:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1104:10:1104:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1106:5:1106:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1106:5:1106:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1106:5:1106:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1106:5:1106:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1106:5:1106:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1106:5:1106:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:1107:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1107:5:1107:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1107:5:1107:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1107:5:1107:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1107:5:1107:5 | b [element 3] : | semmle.label | b [element 3] : | +| array_flow.rb:1107:5:1107:5 | b [element 3] : | semmle.label | b [element 3] : | | array_flow.rb:1107:9:1107:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | | array_flow.rb:1107:9:1107:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | | array_flow.rb:1107:9:1107:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | @@ -5824,12 +7170,20 @@ nodes | array_flow.rb:1115:10:1115:10 | b [element 3] : | semmle.label | b [element 3] : | | array_flow.rb:1115:10:1115:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1115:10:1115:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1117:5:1117:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1117:5:1117:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1117:5:1117:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1117:5:1117:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1117:5:1117:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1117:5:1117:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:1118:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1118:5:1118:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1118:9:1118:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1118:9:1118:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1118:9:1118:9 | a [element 0] : | semmle.label | a [element 0] : | @@ -5872,8 +7226,12 @@ nodes | array_flow.rb:1126:10:1126:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1126:10:1126:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1126:10:1126:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1130:5:1130:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1130:5:1130:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:1131:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1131:5:1131:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1131:9:1131:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:1131:9:1131:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:1131:9:1133:7 | call to select [element] : | semmle.label | call to select [element] : | @@ -5886,8 +7244,12 @@ nodes | array_flow.rb:1134:10:1134:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1134:10:1134:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1134:10:1134:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1138:5:1138:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1138:5:1138:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:1139:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1139:5:1139:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1139:9:1139:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1139:9:1139:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1139:9:1139:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -5906,10 +7268,16 @@ nodes | array_flow.rb:1144:10:1144:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1144:10:1144:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1144:10:1144:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1148:5:1148:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1148:5:1148:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1148:5:1148:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1148:5:1148:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:1149:5 | b : | semmle.label | b : | +| array_flow.rb:1149:5:1149:5 | b : | semmle.label | b : | | array_flow.rb:1149:9:1149:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | | array_flow.rb:1149:9:1149:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | | array_flow.rb:1149:9:1149:9 | a [element 0] : | semmle.label | a [element 0] : | @@ -5924,10 +7292,16 @@ nodes | array_flow.rb:1152:10:1152:10 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:1152:10:1152:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1152:10:1152:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1155:5:1155:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1155:5:1155:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1155:5:1155:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1155:5:1155:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:1156:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1156:5:1156:5 | b [element 0] : | semmle.label | b [element 0] : | | array_flow.rb:1156:9:1156:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | | array_flow.rb:1156:9:1156:9 | [post] a [element 0] : | semmle.label | [post] a [element 0] : | | array_flow.rb:1156:9:1156:9 | a [element 0] : | semmle.label | a [element 0] : | @@ -5944,10 +7318,16 @@ nodes | array_flow.rb:1159:10:1159:10 | a [element 0] : | semmle.label | a [element 0] : | | array_flow.rb:1159:10:1159:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1159:10:1159:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1163:5:1163:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1163:5:1163:5 | a [element 0] : | semmle.label | a [element 0] : | +| array_flow.rb:1163:5:1163:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1163:5:1163:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:1164:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1164:5:1164:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1164:9:1164:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1164:9:1164:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1164:9:1164:9 | a [element 0] : | semmle.label | a [element 0] : | @@ -5980,8 +7360,12 @@ nodes | array_flow.rb:1169:10:1169:10 | a [element] : | semmle.label | a [element] : | | array_flow.rb:1169:10:1169:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1169:10:1169:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1173:5:1173:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1173:5:1173:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:1174:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1174:5:1174:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1174:9:1174:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1174:9:1174:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1174:9:1174:17 | call to shuffle [element] : | semmle.label | call to shuffle [element] : | @@ -6002,8 +7386,12 @@ nodes | array_flow.rb:1180:10:1180:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1180:10:1180:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1180:10:1180:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1184:5:1184:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1184:5:1184:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:1185:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1185:5:1185:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1185:9:1185:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1185:9:1185:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1185:9:1185:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -6036,16 +7424,24 @@ nodes | array_flow.rb:1191:10:1191:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1191:10:1191:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1191:10:1191:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | semmle.label | a [element 4] : | +| array_flow.rb:1195:5:1195:5 | a [element 4] : | semmle.label | a [element 4] : | | 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:5:1197:5 | b : | semmle.label | b : | +| array_flow.rb:1197:5:1197:5 | b : | semmle.label | b : | | array_flow.rb:1197:9:1197:9 | a [element 4] : | semmle.label | a [element 4] : | | array_flow.rb:1197:9:1197:9 | a [element 4] : | semmle.label | a [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:5:1200:5 | b : | semmle.label | b : | +| array_flow.rb:1200:5:1200:5 | b : | semmle.label | b : | | array_flow.rb:1200:9:1200:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1200:9:1200:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1200:9:1200:9 | a [element 4] : | semmle.label | a [element 4] : | @@ -6054,6 +7450,10 @@ nodes | 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:5:1203:5 | b : | semmle.label | b : | +| array_flow.rb:1203:5:1203:5 | b : | semmle.label | b : | +| array_flow.rb:1203:5:1203:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1203:5:1203:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1203:9:1203:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1203:9:1203:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1203:9:1203:9 | a [element 4] : | semmle.label | a [element 4] : | @@ -6069,6 +7469,10 @@ nodes | array_flow.rb:1207:10:1207:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1207:10:1207:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1207:10:1207:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1209:5:1209:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1209:5:1209:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1209:5:1209:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1209:5:1209:5 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:1209:9:1209:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1209:9:1209:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1209:9:1209:9 | a [element 4] : | semmle.label | a [element 4] : | @@ -6085,6 +7489,8 @@ nodes | array_flow.rb:1212:10:1212:10 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:1212:10:1212:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1212:10:1212:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1214:5:1214:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1214:5:1214:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1214:9:1214:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1214:9:1214:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1214:9:1214:9 | a [element 4] : | semmle.label | a [element 4] : | @@ -6099,6 +7505,8 @@ nodes | array_flow.rb:1216:10:1216:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1216:10:1216:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1216:10:1216:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1218:5:1218:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1218:5:1218:5 | b [element 0] : | semmle.label | b [element 0] : | | array_flow.rb:1218:9:1218:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1218:9:1218:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1218:9:1218:21 | call to slice [element 0] : | semmle.label | call to slice [element 0] : | @@ -6107,6 +7515,8 @@ nodes | array_flow.rb:1219:10:1219:10 | b [element 0] : | semmle.label | b [element 0] : | | array_flow.rb:1219:10:1219:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1219:10:1219:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1223:5:1223:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1223:5:1223:5 | b [element 0] : | semmle.label | b [element 0] : | | array_flow.rb:1223:9:1223:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1223:9:1223:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1223:9:1223:22 | call to slice [element 0] : | semmle.label | call to slice [element 0] : | @@ -6115,6 +7525,8 @@ nodes | array_flow.rb:1224:10:1224:10 | b [element 0] : | semmle.label | b [element 0] : | | array_flow.rb:1224:10:1224:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1224:10:1224:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1228:5:1228:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1228:5:1228:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1228:9:1228:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1228:9:1228:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1228:9:1228:9 | a [element 4] : | semmle.label | a [element 4] : | @@ -6129,6 +7541,8 @@ nodes | array_flow.rb:1230:10:1230:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1230:10:1230:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1230:10:1230:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1232:5:1232:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1232:5:1232:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1232:9:1232:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1232:9:1232:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1232:9:1232:9 | a [element 4] : | semmle.label | a [element 4] : | @@ -6143,6 +7557,8 @@ nodes | array_flow.rb:1234:10:1234:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1234:10:1234:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1234:10:1234:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1236:5:1236:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1236:5:1236:5 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:1236:9:1236:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1236:9:1236:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1236:9:1236:20 | call to slice [element 2] : | semmle.label | call to slice [element 2] : | @@ -6151,6 +7567,8 @@ nodes | array_flow.rb:1239:10:1239:10 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:1239:10:1239:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1239:10:1239:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1241:5:1241:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1241:5:1241:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1241:9:1241:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1241:9:1241:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1241:9:1241:9 | a [element 4] : | semmle.label | a [element 4] : | @@ -6169,10 +7587,16 @@ nodes | array_flow.rb:1244:10:1244:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1244:10:1244:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1244:10:1244:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1248:5:1248:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1248:5:1248:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1248:5:1248:5 | a [element 4] : | semmle.label | a [element 4] : | +| array_flow.rb:1248:5:1248:5 | a [element 4] : | semmle.label | a [element 4] : | | 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:5:1249:5 | b : | semmle.label | b : | +| array_flow.rb:1249:5:1249:5 | b : | semmle.label | b : | | array_flow.rb:1249:9:1249:9 | [post] a [element 3] : | semmle.label | [post] a [element 3] : | | array_flow.rb:1249:9:1249:9 | [post] a [element 3] : | semmle.label | [post] a [element 3] : | | array_flow.rb:1249:9:1249:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -6187,10 +7611,18 @@ nodes | array_flow.rb:1254:10:1254:10 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:1254:10:1254:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1254:10:1254:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1256:5:1256:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1256:5:1256:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1256:5:1256:5 | a [element 4] : | semmle.label | a [element 4] : | +| array_flow.rb:1256:5:1256:5 | a [element 4] : | semmle.label | a [element 4] : | | 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:5:1257:5 | b : | semmle.label | b : | +| array_flow.rb:1257:5:1257:5 | b : | semmle.label | b : | +| array_flow.rb:1257:5:1257:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1257:5:1257:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1257:9:1257:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1257:9:1257:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1257:9:1257:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -6224,10 +7656,18 @@ nodes | array_flow.rb:1265:10:1265:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1265:10:1265:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1265:10:1265:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1267:5:1267:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1267:5:1267:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1267:5:1267:5 | a [element 4] : | semmle.label | a [element 4] : | +| array_flow.rb:1267:5:1267:5 | a [element 4] : | semmle.label | a [element 4] : | | 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:5:1268:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1268:5:1268:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1268:5:1268:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1268:5:1268:5 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:1268:9:1268:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1268:9:1268:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1268:9:1268:9 | a [element 4] : | semmle.label | a [element 4] : | @@ -6244,10 +7684,16 @@ nodes | array_flow.rb:1271:10:1271:10 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:1271:10:1271:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1271:10:1271:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1278:5:1278:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1278:5:1278:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1278:5:1278:5 | a [element 4] : | semmle.label | a [element 4] : | +| array_flow.rb:1278:5:1278:5 | a [element 4] : | semmle.label | a [element 4] : | | 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:5:1279:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1279:5:1279:5 | b [element 0] : | semmle.label | b [element 0] : | | array_flow.rb:1279:9:1279:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | | array_flow.rb:1279:9:1279:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | | array_flow.rb:1279:9:1279:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -6264,10 +7710,16 @@ nodes | array_flow.rb:1285:10:1285:10 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1285:10:1285:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1285:10:1285:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1289:5:1289:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1289:5:1289:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1289:5:1289:5 | a [element 4] : | semmle.label | a [element 4] : | +| array_flow.rb:1289:5:1289:5 | a [element 4] : | semmle.label | a [element 4] : | | 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:5:1290:5 | b [element 0] : | semmle.label | b [element 0] : | +| array_flow.rb:1290:5:1290:5 | b [element 0] : | semmle.label | b [element 0] : | | array_flow.rb:1290:9:1290:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | | array_flow.rb:1290:9:1290:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | | array_flow.rb:1290:9:1290:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -6284,10 +7736,16 @@ nodes | array_flow.rb:1296:10:1296:10 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1296:10:1296:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1296:10:1296:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1300:5:1300:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1300:5:1300:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1300:5:1300:5 | a [element 4] : | semmle.label | a [element 4] : | +| array_flow.rb:1300:5:1300:5 | a [element 4] : | semmle.label | a [element 4] : | | 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:5:1301:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1301:5:1301:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1301:9:1301:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1301:9:1301:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1301:9:1301:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -6320,10 +7778,16 @@ nodes | array_flow.rb:1307:10:1307:10 | a [element] : | semmle.label | a [element] : | | array_flow.rb:1307:10:1307:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1307:10:1307:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1309:5:1309:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1309:5:1309:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1309:5:1309:5 | a [element 4] : | semmle.label | a [element 4] : | +| array_flow.rb:1309:5:1309:5 | a [element 4] : | semmle.label | a [element 4] : | | 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:5:1310:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1310:5:1310:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1310:9:1310:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1310:9:1310:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1310:9:1310:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -6356,10 +7820,16 @@ nodes | array_flow.rb:1316:10:1316:10 | a [element] : | semmle.label | a [element] : | | array_flow.rb:1316:10:1316:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1316:10:1316:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1318:5:1318:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1318:5:1318:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1318:5:1318:5 | a [element 4] : | semmle.label | a [element 4] : | +| array_flow.rb:1318:5:1318:5 | a [element 4] : | semmle.label | a [element 4] : | | 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:5:1319:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1319:5:1319:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1319:9:1319:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1319:9:1319:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1319:9:1319:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -6392,10 +7862,16 @@ nodes | array_flow.rb:1325:10:1325:10 | a [element] : | semmle.label | a [element] : | | array_flow.rb:1325:10:1325:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1325:10:1325:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1327:5:1327:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1327:5:1327:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1327:5:1327:5 | a [element 4] : | semmle.label | a [element 4] : | +| array_flow.rb:1327:5:1327:5 | a [element 4] : | semmle.label | a [element 4] : | | 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:5:1328:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1328:5:1328:5 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:1328:9:1328:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | | array_flow.rb:1328:9:1328:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | | array_flow.rb:1328:9:1328:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -6412,10 +7888,16 @@ nodes | array_flow.rb:1333:10:1333:10 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:1333:10:1333:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1333:10:1333:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1336:5:1336:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1336:5:1336:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1336:5:1336:5 | a [element 4] : | semmle.label | a [element 4] : | +| array_flow.rb:1336:5:1336:5 | a [element 4] : | semmle.label | a [element 4] : | | 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:5:1337:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1337:5:1337:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1337:9:1337:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1337:9:1337:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1337:9:1337:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -6448,6 +7930,8 @@ nodes | array_flow.rb:1343:10:1343:10 | a [element] : | semmle.label | a [element] : | | array_flow.rb:1343:10:1343:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1343:10:1343:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1347:5:1347:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1347:5:1347:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 [element 2] : | semmle.label | a [element 2] : | @@ -6456,6 +7940,8 @@ nodes | 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:5:1355:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1355:5:1355:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 [element 2] : | semmle.label | a [element 2] : | @@ -6464,6 +7950,8 @@ nodes | 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:5:1363:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1363:5:1363:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 [element 2] : | semmle.label | a [element 2] : | @@ -6476,8 +7964,12 @@ nodes | 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:5:1371:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1371:5:1371:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:1372:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1372:5:1372:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1372:9:1372:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1372:9:1372:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1372:9:1372:14 | call to sort [element] : | semmle.label | call to sort [element] : | @@ -6490,6 +7982,8 @@ nodes | array_flow.rb:1374:10:1374:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1374:10:1374:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1374:10:1374:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1375:5:1375:5 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:1375:5:1375:5 | c [element] : | semmle.label | c [element] : | | array_flow.rb:1375:9:1375:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1375:9:1375:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1375:9:1379:7 | call to sort [element] : | semmle.label | call to sort [element] : | @@ -6510,8 +8004,12 @@ nodes | array_flow.rb:1381:10:1381:10 | c [element] : | semmle.label | c [element] : | | array_flow.rb:1381:10:1381:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1381:10:1381:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1385:5:1385:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1385:5:1385:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:1386:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1386:5:1386:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1386:9:1386:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1386:9:1386:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1386:9:1386:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -6534,8 +8032,12 @@ nodes | array_flow.rb:1390:10:1390:10 | a [element] : | semmle.label | a [element] : | | array_flow.rb:1390:10:1390:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1390:10:1390:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1392:5:1392:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1392:5:1392:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:1393:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1393:5:1393:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1393:9:1393:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1393:9:1393:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1393:9:1393:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -6566,8 +8068,12 @@ nodes | array_flow.rb:1401:10:1401:10 | a [element] : | semmle.label | a [element] : | | array_flow.rb:1401:10:1401:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1401:10:1401:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1405:5:1405:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1405:5:1405:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:1406:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1406:5:1406:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1406:9:1406:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1406:9:1406:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1406:9:1409:7 | call to sort_by [element] : | semmle.label | call to sort_by [element] : | @@ -6584,8 +8090,12 @@ nodes | array_flow.rb:1411:10:1411:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1411:10:1411:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1411:10:1411:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1415:5:1415:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1415:5:1415:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:1416:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1416:5:1416:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1416:9:1416:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1416:9:1416:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1416:9:1416:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -6612,6 +8122,8 @@ nodes | array_flow.rb:1423:10:1423:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1423:10:1423:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1423:10:1423:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1427:5:1427:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1427:5:1427:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 [element 2] : | semmle.label | a [element 2] : | @@ -6620,10 +8132,18 @@ nodes | 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:5:1435:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1435:5:1435:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1435:5:1435:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1435:5:1435:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:1436:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1436:5:1436:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1436:5:1436:5 | b [element 3] : | semmle.label | b [element 3] : | +| array_flow.rb:1436:5:1436:5 | b [element 3] : | semmle.label | b [element 3] : | | array_flow.rb:1436:9:1436:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1436:9:1436:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1436:9:1436:9 | a [element 3] : | semmle.label | a [element 3] : | @@ -6640,6 +8160,8 @@ nodes | array_flow.rb:1440:10:1440:10 | b [element 3] : | semmle.label | b [element 3] : | | array_flow.rb:1440:10:1440:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1440:10:1440:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1441:5:1441:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1441:5:1441:5 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:1441:9:1441:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1441:9:1441:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1441:9:1441:17 | call to take [element 2] : | semmle.label | call to take [element 2] : | @@ -6652,6 +8174,10 @@ nodes | array_flow.rb:1446:10:1446:10 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:1446:10:1446:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1446:10:1446:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1447:5:1447:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1447:5:1447:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1447:5:1447:5 | b [element 3] : | semmle.label | b [element 3] : | +| array_flow.rb:1447:5:1447:5 | b [element 3] : | semmle.label | b [element 3] : | | array_flow.rb:1447:9:1447:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1447:9:1447:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1447:9:1447:9 | a [element 3] : | semmle.label | a [element 3] : | @@ -6678,6 +8204,10 @@ nodes | array_flow.rb:1453:5:1453:5 | [post] a [element] : | semmle.label | [post] a [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:5:1454:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1454:5:1454:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1454:5:1454:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1454:5:1454:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1454:9:1454:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1454:9:1454:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1454:9:1454:9 | a [element] : | semmle.label | a [element] : | @@ -6692,8 +8222,12 @@ nodes | array_flow.rb:1455:10:1455:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1455:10:1455:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1455:10:1455:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1459:5:1459:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1459:5:1459:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:1460:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1460:5:1460:5 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:1460:9:1460:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1460:9:1460:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1460:9:1463:7 | call to take_while [element 2] : | semmle.label | call to take_while [element 2] : | @@ -6706,8 +8240,12 @@ nodes | array_flow.rb:1466:10:1466:10 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:1466:10:1466:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1466:10:1466:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1472:5:1472:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1472:5:1472:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:1473:5 | b [element 3] : | semmle.label | b [element 3] : | +| array_flow.rb:1473:5:1473:5 | b [element 3] : | semmle.label | b [element 3] : | | array_flow.rb:1473:9:1473:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:1473:9:1473:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:1473:9:1473:14 | call to to_a [element 3] : | semmle.label | call to to_a [element 3] : | @@ -6716,8 +8254,12 @@ nodes | array_flow.rb:1474:10:1474:10 | b [element 3] : | semmle.label | b [element 3] : | | array_flow.rb:1474:10:1474:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1474:10:1474:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1478:5:1478:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1478:5:1478:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:1479:5 | b [element 2] : | semmle.label | b [element 2] : | +| array_flow.rb:1479:5:1479:5 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:1479:9:1479:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1479:9:1479:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1479:9:1479:16 | call to to_ary [element 2] : | semmle.label | call to to_ary [element 2] : | @@ -6726,12 +8268,24 @@ nodes | array_flow.rb:1482:10:1482:10 | b [element 2] : | semmle.label | b [element 2] : | | array_flow.rb:1482:10:1482:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1482:10:1482:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1495:5:1495:5 | a [element 0, element 1] : | semmle.label | a [element 0, element 1] : | +| array_flow.rb:1495:5:1495:5 | a [element 0, element 1] : | semmle.label | a [element 0, element 1] : | +| array_flow.rb:1495:5:1495:5 | a [element 1, element 1] : | semmle.label | a [element 1, element 1] : | +| array_flow.rb:1495:5:1495:5 | a [element 1, element 1] : | semmle.label | a [element 1, element 1] : | +| array_flow.rb:1495:5:1495:5 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | +| array_flow.rb:1495:5:1495:5 | a [element 2, element 1] : | semmle.label | a [element 2, element 1] : | | 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:5:1496:5 | b [element 1, element 0] : | semmle.label | b [element 1, element 0] : | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 0] : | semmle.label | b [element 1, element 0] : | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 1] : | semmle.label | b [element 1, element 1] : | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 1] : | semmle.label | b [element 1, element 1] : | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 2] : | semmle.label | b [element 1, element 2] : | +| array_flow.rb:1496:5:1496:5 | b [element 1, element 2] : | semmle.label | b [element 1, element 2] : | | array_flow.rb:1496:9:1496:9 | a [element 0, element 1] : | semmle.label | a [element 0, element 1] : | | array_flow.rb:1496:9:1496:9 | a [element 0, element 1] : | semmle.label | a [element 0, element 1] : | | array_flow.rb:1496:9:1496:9 | a [element 1, element 1] : | semmle.label | a [element 1, element 1] : | @@ -6762,12 +8316,20 @@ nodes | array_flow.rb:1502:10:1502:13 | ...[...] [element 2] : | semmle.label | ...[...] [element 2] : | | array_flow.rb:1502:10:1502:16 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1502:10:1502:16 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1506:5:1506:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1506:5:1506:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:1507:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:1507:5:1507:5 | b [element 1] : | semmle.label | b [element 1] : | | 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:5:1508:5 | c [element 1] : | semmle.label | c [element 1] : | +| array_flow.rb:1508:5:1508:5 | c [element 1] : | semmle.label | c [element 1] : | | 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:5:1509:5 | d [element] : | semmle.label | d [element] : | +| array_flow.rb:1509:5:1509:5 | d [element] : | semmle.label | d [element] : | | array_flow.rb:1509:9:1509:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1509:9:1509:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1509:9:1509:21 | call to union [element] : | semmle.label | call to union [element] : | @@ -6788,10 +8350,16 @@ nodes | array_flow.rb:1512:10:1512:10 | d [element] : | semmle.label | d [element] : | | array_flow.rb:1512:10:1512:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1512:10:1512:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1516:5:1516:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1516:5:1516:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1516:5:1516:5 | a [element 4] : | semmle.label | a [element 4] : | +| array_flow.rb:1516:5:1516:5 | a [element 4] : | semmle.label | a [element 4] : | | 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:5:1518:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1518:5:1518:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1518:9:1518:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:1518:9:1518:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:1518:9:1518:9 | a [element 4] : | semmle.label | a [element 4] : | @@ -6806,6 +8374,8 @@ nodes | array_flow.rb:1520:10:1520:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1520:10:1520:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1520:10:1520:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1522:5:1522:5 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:1522:5:1522:5 | c [element] : | semmle.label | c [element] : | | array_flow.rb:1522:9:1522:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:1522:9:1522:9 | a [element 3] : | semmle.label | a [element 3] : | | array_flow.rb:1522:9:1522:9 | a [element 4] : | semmle.label | a [element 4] : | @@ -6820,10 +8390,16 @@ nodes | array_flow.rb:1526:10:1526:10 | c [element] : | semmle.label | c [element] : | | array_flow.rb:1526:10:1526:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1526:10:1526:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1530:5:1530:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1530:5:1530:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1530:5:1530:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1530:5:1530:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:1531:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1531:5:1531:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1531:9:1531:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1531:9:1531:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1531:9:1531:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -6848,10 +8424,16 @@ nodes | array_flow.rb:1535:10:1535:10 | a [element] : | semmle.label | a [element] : | | array_flow.rb:1535:10:1535:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1535:10:1535:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1537:5:1537:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1537:5:1537:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1537:5:1537:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1537:5:1537:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:1538:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1538:5:1538:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1538:9:1538:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1538:9:1538:9 | [post] a [element] : | semmle.label | [post] a [element] : | | array_flow.rb:1538:9:1538:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -6880,6 +8462,8 @@ nodes | array_flow.rb:1545:10:1545:10 | a [element] : | semmle.label | a [element] : | | array_flow.rb:1545:10:1545:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1545:10:1545:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1549:5:1549:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1549:5:1549:5 | a [element 2] : | semmle.label | a [element 2] : | | 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 [element 2] : | semmle.label | [post] a [element 2] : | @@ -6898,10 +8482,18 @@ nodes | array_flow.rb:1556:10:1556:10 | a [element 5] : | semmle.label | a [element 5] : | | array_flow.rb:1556:10:1556:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1556:10:1556:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1560:5:1560:5 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:1560:5:1560:5 | a [element 1] : | semmle.label | a [element 1] : | +| array_flow.rb:1560:5:1560:5 | a [element 3] : | semmle.label | a [element 3] : | +| array_flow.rb:1560:5:1560:5 | a [element 3] : | semmle.label | a [element 3] : | | 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:5:1562:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:1562:5:1562:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:1562:5:1562:5 | b [element 3] : | semmle.label | b [element 3] : | +| array_flow.rb:1562:5:1562:5 | b [element 3] : | semmle.label | b [element 3] : | | array_flow.rb:1562:9:1562:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:1562:9:1562:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:1562:9:1562:31 | call to values_at [element 1] : | semmle.label | call to values_at [element 1] : | @@ -6916,6 +8508,8 @@ nodes | array_flow.rb:1566:10:1566:10 | b [element 3] : | semmle.label | b [element 3] : | | array_flow.rb:1566:10:1566:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1566:10:1566:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1568:5:1568:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1568:5:1568:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1568:9:1568:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:1568:9:1568:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:1568:9:1568:9 | a [element 3] : | semmle.label | a [element 3] : | @@ -6930,6 +8524,8 @@ nodes | array_flow.rb:1570:10:1570:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1570:10:1570:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1570:10:1570:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1572:5:1572:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1572:5:1572:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1572:9:1572:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:1572:9:1572:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:1572:9:1572:9 | a [element 3] : | semmle.label | a [element 3] : | @@ -6944,6 +8540,10 @@ nodes | array_flow.rb:1574:10:1574:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1574:10:1574:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1574:10:1574:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1576:5:1576:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:1576:5:1576:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:1576:5:1576:5 | b [element] : | semmle.label | b [element] : | +| array_flow.rb:1576:5:1576:5 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1576:9:1576:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:1576:9:1576:9 | a [element 1] : | semmle.label | a [element 1] : | | array_flow.rb:1576:9:1576:9 | a [element 3] : | semmle.label | a [element 3] : | @@ -6970,12 +8570,24 @@ nodes | array_flow.rb:1580:10:1580:10 | b [element] : | semmle.label | b [element] : | | array_flow.rb:1580:10:1580:13 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1580:10:1580:13 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1584:5:1584:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1584:5:1584:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:1585:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:1585:5:1585:5 | b [element 1] : | semmle.label | b [element 1] : | | 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:5:1586:5 | c [element 0] : | semmle.label | c [element 0] : | +| array_flow.rb:1586:5:1586:5 | c [element 0] : | semmle.label | c [element 0] : | | 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:5:1587:5 | d [element 0, element 2] : | semmle.label | d [element 0, element 2] : | +| array_flow.rb:1587:5:1587:5 | d [element 0, element 2] : | semmle.label | d [element 0, element 2] : | +| array_flow.rb:1587:5:1587:5 | d [element 1, element 1] : | semmle.label | d [element 1, element 1] : | +| array_flow.rb:1587:5:1587:5 | d [element 1, element 1] : | semmle.label | d [element 1, element 1] : | +| array_flow.rb:1587:5:1587:5 | d [element 2, element 0] : | semmle.label | d [element 2, element 0] : | +| array_flow.rb:1587:5:1587:5 | d [element 2, element 0] : | semmle.label | d [element 2, element 0] : | | array_flow.rb:1587:9:1587:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1587:9:1587:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1587:9:1587:19 | call to zip [element 0, element 2] : | semmle.label | call to zip [element 0, element 2] : | @@ -7030,10 +8642,16 @@ nodes | array_flow.rb:1595:14:1595:14 | x [element 2] : | semmle.label | x [element 2] : | | array_flow.rb:1595:14:1595:17 | ...[...] | semmle.label | ...[...] | | array_flow.rb:1595:14:1595:17 | ...[...] | semmle.label | ...[...] | +| array_flow.rb:1600:5:1600:5 | a [element 2] : | semmle.label | a [element 2] : | +| array_flow.rb:1600:5:1600:5 | a [element 2] : | semmle.label | a [element 2] : | | 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:5:1601:5 | b [element 1] : | semmle.label | b [element 1] : | +| array_flow.rb:1601:5:1601:5 | b [element 1] : | semmle.label | b [element 1] : | | 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:5:1602:5 | c [element] : | semmle.label | c [element] : | +| array_flow.rb:1602:5:1602:5 | c [element] : | semmle.label | c [element] : | | array_flow.rb:1602:9:1602:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1602:9:1602:9 | a [element 2] : | semmle.label | a [element 2] : | | array_flow.rb:1602:9:1602:13 | ... \| ... [element] : | semmle.label | ... \| ... [element] : | diff --git a/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected b/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected index 4ef45d2ae92..db759c1f86a 100644 --- a/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected +++ b/ruby/ql/test/library-tests/dataflow/flow-summaries/semantics.expected @@ -1,19 +1,27 @@ failures edges -| semantics.rb:2:9:2:18 | call to source : | semantics.rb:3:9:3:9 | a : | -| semantics.rb:2:9:2:18 | call to source : | semantics.rb:3:9:3:9 | a : | +| semantics.rb:2:5:2:5 | a : | semantics.rb:3:9:3:9 | a : | +| semantics.rb:2:5:2:5 | a : | semantics.rb:3:9:3:9 | a : | +| semantics.rb:2:9:2:18 | call to source : | semantics.rb:2:5:2:5 | a : | +| semantics.rb:2:9:2:18 | call to source : | semantics.rb:2:5:2:5 | a : | +| semantics.rb:3:5:3:5 | x : | semantics.rb:4:10:4:10 | x | +| semantics.rb:3:5:3:5 | x : | semantics.rb:4:10:4:10 | x | | semantics.rb:3:9:3:9 | a : | semantics.rb:3:9:3:14 | call to s1 : | | semantics.rb:3:9:3:9 | a : | semantics.rb:3:9:3:14 | call to s1 : | -| semantics.rb:3:9:3:14 | call to s1 : | semantics.rb:4:10:4:10 | x | -| semantics.rb:3:9:3:14 | call to s1 : | semantics.rb:4:10:4:10 | x | -| semantics.rb:8:9:8:18 | call to source : | semantics.rb:9:10:9:10 | a : | -| semantics.rb:8:9:8:18 | call to source : | semantics.rb:9:10:9:10 | a : | +| semantics.rb:3:9:3:14 | call to s1 : | semantics.rb:3:5:3:5 | x : | +| semantics.rb:3:9:3:14 | call to s1 : | semantics.rb:3:5:3:5 | x : | +| semantics.rb:8:5:8:5 | a : | semantics.rb:9:10:9:10 | a : | +| semantics.rb:8:5:8:5 | a : | semantics.rb:9:10:9:10 | a : | +| semantics.rb:8:9:8:18 | call to source : | semantics.rb:8:5:8:5 | a : | +| semantics.rb:8:9:8:18 | call to source : | semantics.rb:8:5:8:5 | a : | | semantics.rb:9:5:9:5 | [post] x : | semantics.rb:10:10:10:10 | x | | semantics.rb:9:5:9:5 | [post] x : | semantics.rb:10:10:10:10 | x | | semantics.rb:9:10:9:10 | a : | semantics.rb:9:5:9:5 | [post] x : | | semantics.rb:9:10:9:10 | a : | semantics.rb:9:5:9:5 | [post] x : | -| semantics.rb:14:9:14:18 | call to source : | semantics.rb:15:8:15:8 | a : | -| semantics.rb:14:9:14:18 | call to source : | semantics.rb:15:8:15:8 | a : | +| semantics.rb:14:5:14:5 | a : | semantics.rb:15:8:15:8 | a : | +| semantics.rb:14:5:14:5 | a : | semantics.rb:15:8:15:8 | a : | +| semantics.rb:14:9:14:18 | call to source : | semantics.rb:14:5:14:5 | a : | +| semantics.rb:14:9:14:18 | call to source : | semantics.rb:14:5:14:5 | a : | | semantics.rb:15:8:15:8 | a : | semantics.rb:15:11:15:11 | [post] x : | | semantics.rb:15:8:15:8 | a : | semantics.rb:15:11:15:11 | [post] x : | | semantics.rb:15:11:15:11 | [post] x : | semantics.rb:16:10:16:10 | x | @@ -22,8 +30,10 @@ edges | semantics.rb:22:18:22:32 | call to source : | semantics.rb:22:10:22:33 | call to s4 | | semantics.rb:23:23:23:32 | call to source : | semantics.rb:23:10:23:33 | call to s4 | | semantics.rb:23:23:23:32 | call to source : | semantics.rb:23:10:23:33 | call to s4 | -| semantics.rb:28:9:28:18 | call to source : | semantics.rb:29:8:29:8 | a : | -| semantics.rb:28:9:28:18 | call to source : | semantics.rb:29:8:29:8 | a : | +| semantics.rb:28:5:28:5 | a : | semantics.rb:29:8:29:8 | a : | +| semantics.rb:28:5:28:5 | a : | semantics.rb:29:8:29:8 | a : | +| semantics.rb:28:9:28:18 | call to source : | semantics.rb:28:5:28:5 | a : | +| semantics.rb:28:9:28:18 | call to source : | semantics.rb:28:5:28:5 | a : | | semantics.rb:29:8:29:8 | a : | semantics.rb:29:14:29:14 | [post] y : | | semantics.rb:29:8:29:8 | a : | semantics.rb:29:14:29:14 | [post] y : | | semantics.rb:29:8:29:8 | a : | semantics.rb:29:17:29:17 | [post] z : | @@ -32,8 +42,10 @@ edges | semantics.rb:29:14:29:14 | [post] y : | semantics.rb:31:10:31:10 | y | | semantics.rb:29:17:29:17 | [post] z : | semantics.rb:32:10:32:10 | z | | semantics.rb:29:17:29:17 | [post] z : | semantics.rb:32:10:32:10 | z | -| semantics.rb:40:9:40:18 | call to source : | semantics.rb:41:8:41:8 | a : | -| semantics.rb:40:9:40:18 | call to source : | semantics.rb:41:8:41:8 | a : | +| semantics.rb:40:5:40:5 | a : | semantics.rb:41:8:41:8 | a : | +| semantics.rb:40:5:40:5 | a : | semantics.rb:41:8:41:8 | a : | +| semantics.rb:40:9:40:18 | call to source : | semantics.rb:40:5:40:5 | a : | +| semantics.rb:40:9:40:18 | call to source : | semantics.rb:40:5:40:5 | a : | | semantics.rb:41:8:41:8 | a : | semantics.rb:41:16:41:16 | [post] x : | | semantics.rb:41:8:41:8 | a : | semantics.rb:41:16:41:16 | [post] x : | | semantics.rb:41:16:41:16 | [post] x : | semantics.rb:42:10:42:10 | x | @@ -50,16 +62,18 @@ edges | semantics.rb:54:8:54:17 | call to source : | semantics.rb:54:24:54:24 | x : | | semantics.rb:54:24:54:24 | x : | semantics.rb:55:14:55:14 | x | | semantics.rb:54:24:54:24 | x : | semantics.rb:55:14:55:14 | x | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:61:14:61:14 | a : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:61:14:61:14 | a : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:62:17:62:17 | a : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:62:17:62:17 | a : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:63:19:63:19 | a : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:63:19:63:19 | a : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:64:27:64:27 | a : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:64:27:64:27 | a : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:66:14:66:15 | &... : | -| semantics.rb:60:9:60:18 | call to source : | semantics.rb:66:14:66:15 | &... : | +| semantics.rb:60:5:60:5 | a : | semantics.rb:61:14:61:14 | a : | +| semantics.rb:60:5:60:5 | a : | semantics.rb:61:14:61:14 | a : | +| semantics.rb:60:5:60:5 | a : | semantics.rb:62:17:62:17 | a : | +| semantics.rb:60:5:60:5 | a : | semantics.rb:62:17:62:17 | a : | +| semantics.rb:60:5:60:5 | a : | semantics.rb:63:19:63:19 | a : | +| semantics.rb:60:5:60:5 | a : | semantics.rb:63:19:63:19 | a : | +| semantics.rb:60:5:60:5 | a : | semantics.rb:64:27:64:27 | a : | +| semantics.rb:60:5:60:5 | a : | semantics.rb:64:27:64:27 | a : | +| semantics.rb:60:5:60:5 | a : | semantics.rb:66:14:66:15 | &... : | +| semantics.rb:60:5:60:5 | a : | semantics.rb:66:14:66:15 | &... : | +| semantics.rb:60:9:60:18 | call to source : | semantics.rb:60:5:60:5 | a : | +| semantics.rb:60:9:60:18 | call to source : | semantics.rb:60:5:60:5 | a : | | semantics.rb:61:14:61:14 | a : | semantics.rb:61:10:61:15 | call to s10 | | semantics.rb:61:14:61:14 | a : | semantics.rb:61:10:61:15 | call to s10 | | semantics.rb:62:17:62:17 | a : | semantics.rb:62:10:62:18 | call to s10 | @@ -70,8 +84,10 @@ edges | semantics.rb:64:27:64:27 | a : | semantics.rb:64:10:64:28 | call to s10 | | semantics.rb:66:14:66:15 | &... : | semantics.rb:66:10:66:16 | call to s10 | | semantics.rb:66:14:66:15 | &... : | semantics.rb:66:10:66:16 | call to s10 | -| semantics.rb:80:9:80:18 | call to source : | semantics.rb:81:5:81:5 | a : | -| semantics.rb:80:9:80:18 | call to source : | semantics.rb:81:5:81:5 | a : | +| semantics.rb:80:5:80:5 | a : | semantics.rb:81:5:81:5 | a : | +| semantics.rb:80:5:80:5 | a : | semantics.rb:81:5:81:5 | a : | +| semantics.rb:80:9:80:18 | call to source : | semantics.rb:80:5:80:5 | a : | +| semantics.rb:80:9:80:18 | call to source : | semantics.rb:80:5:80:5 | a : | | semantics.rb:81:5:81:5 | a : | semantics.rb:81:11:81:11 | [post] x : | | semantics.rb:81:5:81:5 | a : | semantics.rb:81:11:81:11 | [post] x : | | semantics.rb:81:5:81:5 | a : | semantics.rb:81:14:81:14 | [post] y : | @@ -84,18 +100,22 @@ edges | semantics.rb:81:14:81:14 | [post] y : | semantics.rb:83:10:83:10 | y | | semantics.rb:81:22:81:22 | [post] z : | semantics.rb:84:10:84:10 | z | | semantics.rb:81:22:81:22 | [post] z : | semantics.rb:84:10:84:10 | z | -| semantics.rb:89:9:89:18 | call to source : | semantics.rb:91:19:91:19 | a : | -| semantics.rb:89:9:89:18 | call to source : | semantics.rb:91:19:91:19 | a : | -| semantics.rb:89:9:89:18 | call to source : | semantics.rb:92:27:92:27 | a : | -| semantics.rb:89:9:89:18 | call to source : | semantics.rb:92:27:92:27 | a : | +| semantics.rb:89:5:89:5 | a : | semantics.rb:91:19:91:19 | a : | +| semantics.rb:89:5:89:5 | a : | semantics.rb:91:19:91:19 | a : | +| semantics.rb:89:5:89:5 | a : | semantics.rb:92:27:92:27 | a : | +| semantics.rb:89:5:89:5 | a : | semantics.rb:92:27:92:27 | a : | +| semantics.rb:89:9:89:18 | call to source : | semantics.rb:89:5:89:5 | a : | +| semantics.rb:89:9:89:18 | call to source : | semantics.rb:89:5:89:5 | a : | | semantics.rb:91:19:91:19 | a : | semantics.rb:91:10:91:20 | call to s13 | | semantics.rb:91:19:91:19 | a : | semantics.rb:91:10:91:20 | call to s13 | | semantics.rb:92:27:92:27 | a : | semantics.rb:92:10:92:28 | call to s13 | | semantics.rb:92:27:92:27 | a : | semantics.rb:92:10:92:28 | call to s13 | -| semantics.rb:97:9:97:18 | call to source : | semantics.rb:98:5:98:5 | a : | -| semantics.rb:97:9:97:18 | call to source : | semantics.rb:98:5:98:5 | a : | -| semantics.rb:97:9:97:18 | call to source : | semantics.rb:99:5:99:5 | a : | -| semantics.rb:97:9:97:18 | call to source : | semantics.rb:99:5:99:5 | a : | +| semantics.rb:97:5:97:5 | a : | semantics.rb:98:5:98:5 | a : | +| semantics.rb:97:5:97:5 | a : | semantics.rb:98:5:98:5 | a : | +| semantics.rb:97:5:97:5 | a : | semantics.rb:99:5:99:5 | a : | +| semantics.rb:97:5:97:5 | a : | semantics.rb:99:5:99:5 | a : | +| semantics.rb:97:9:97:18 | call to source : | semantics.rb:97:5:97:5 | a : | +| semantics.rb:97:9:97:18 | call to source : | semantics.rb:97:5:97:5 | a : | | semantics.rb:98:5:98:5 | a : | semantics.rb:98:19:98:19 | [post] x : | | semantics.rb:98:5:98:5 | a : | semantics.rb:98:19:98:19 | [post] x : | | semantics.rb:98:19:98:19 | [post] x : | semantics.rb:101:10:101:10 | x | @@ -108,20 +128,27 @@ edges | semantics.rb:99:16:99:16 | [post] y : | semantics.rb:102:10:102:10 | y | | semantics.rb:99:24:99:24 | [post] z : | semantics.rb:103:10:103:10 | z | | semantics.rb:99:24:99:24 | [post] z : | semantics.rb:103:10:103:10 | z | -| semantics.rb:107:9:107:18 | call to source : | semantics.rb:109:14:109:16 | ** ... : | -| semantics.rb:107:9:107:18 | call to source : | semantics.rb:110:28:110:30 | ** ... : | +| semantics.rb:107:5:107:5 | a : | semantics.rb:109:14:109:16 | ** ... : | +| semantics.rb:107:5:107:5 | a : | semantics.rb:110:28:110:30 | ** ... : | +| semantics.rb:107:9:107:18 | call to source : | semantics.rb:107:5:107:5 | a : | | semantics.rb:109:14:109:16 | ** ... : | semantics.rb:109:10:109:17 | call to s15 | | semantics.rb:110:28:110:30 | ** ... : | semantics.rb:110:10:110:31 | call to s15 | -| semantics.rb:114:9:114:18 | call to source : | semantics.rb:116:14:116:14 | a : | -| semantics.rb:114:9:114:18 | call to source : | semantics.rb:116:14:116:14 | a : | -| semantics.rb:114:9:114:18 | call to source : | semantics.rb:119:17:119:17 | a : | -| semantics.rb:114:9:114:18 | call to source : | semantics.rb:119:17:119:17 | a : | -| semantics.rb:115:9:115:18 | call to source : | semantics.rb:121:17:121:17 | b : | -| semantics.rb:115:9:115:18 | call to source : | semantics.rb:121:17:121:17 | b : | -| semantics.rb:116:14:116:14 | a : | semantics.rb:117:16:117:16 | h [element :a] : | -| semantics.rb:116:14:116:14 | a : | semantics.rb:117:16:117:16 | h [element :a] : | -| semantics.rb:116:14:116:14 | a : | semantics.rb:121:22:121:22 | h [element :a] : | -| semantics.rb:116:14:116:14 | a : | semantics.rb:121:22:121:22 | h [element :a] : | +| semantics.rb:114:5:114:5 | a : | semantics.rb:116:14:116:14 | a : | +| semantics.rb:114:5:114:5 | a : | semantics.rb:116:14:116:14 | a : | +| semantics.rb:114:5:114:5 | a : | semantics.rb:119:17:119:17 | a : | +| semantics.rb:114:5:114:5 | a : | semantics.rb:119:17:119:17 | a : | +| semantics.rb:114:9:114:18 | call to source : | semantics.rb:114:5:114:5 | a : | +| semantics.rb:114:9:114:18 | call to source : | semantics.rb:114:5:114:5 | a : | +| semantics.rb:115:5:115:5 | b : | semantics.rb:121:17:121:17 | b : | +| semantics.rb:115:5:115:5 | b : | semantics.rb:121:17:121:17 | b : | +| semantics.rb:115:9:115:18 | call to source : | semantics.rb:115:5:115:5 | b : | +| semantics.rb:115:9:115:18 | call to source : | semantics.rb:115:5:115:5 | b : | +| semantics.rb:116:5:116:5 | h [element :a] : | semantics.rb:117:16:117:16 | h [element :a] : | +| semantics.rb:116:5:116:5 | h [element :a] : | semantics.rb:117:16:117:16 | h [element :a] : | +| semantics.rb:116:5:116:5 | h [element :a] : | semantics.rb:121:22:121:22 | h [element :a] : | +| semantics.rb:116:5:116:5 | h [element :a] : | semantics.rb:121:22:121:22 | h [element :a] : | +| semantics.rb:116:14:116:14 | a : | semantics.rb:116:5:116:5 | h [element :a] : | +| semantics.rb:116:14:116:14 | a : | semantics.rb:116:5:116:5 | h [element :a] : | | semantics.rb:117:14:117:16 | ** ... [element :a] : | semantics.rb:117:10:117:17 | call to s16 | | semantics.rb:117:14:117:16 | ** ... [element :a] : | semantics.rb:117:10:117:17 | call to s16 | | semantics.rb:117:16:117:16 | h [element :a] : | semantics.rb:117:14:117:16 | ** ... [element :a] : | @@ -134,34 +161,46 @@ edges | semantics.rb:121:20:121:22 | ** ... [element :a] : | semantics.rb:121:10:121:23 | call to s16 | | semantics.rb:121:22:121:22 | h [element :a] : | semantics.rb:121:20:121:22 | ** ... [element :a] : | | semantics.rb:121:22:121:22 | h [element :a] : | semantics.rb:121:20:121:22 | ** ... [element :a] : | -| semantics.rb:125:9:125:18 | call to source : | semantics.rb:126:9:126:9 | a : | -| semantics.rb:125:9:125:18 | call to source : | semantics.rb:126:9:126:9 | a : | +| semantics.rb:125:5:125:5 | a : | semantics.rb:126:9:126:9 | a : | +| semantics.rb:125:5:125:5 | a : | semantics.rb:126:9:126:9 | a : | +| semantics.rb:125:9:125:18 | call to source : | semantics.rb:125:5:125:5 | a : | +| semantics.rb:125:9:125:18 | call to source : | semantics.rb:125:5:125:5 | a : | | semantics.rb:126:9:126:9 | a : | semantics.rb:126:12:126:14 | [post] ** ... : | | semantics.rb:126:9:126:9 | a : | semantics.rb:126:12:126:14 | [post] ** ... : | | semantics.rb:126:12:126:14 | [post] ** ... : | semantics.rb:127:10:127:10 | h | | semantics.rb:126:12:126:14 | [post] ** ... : | semantics.rb:127:10:127:10 | h | -| semantics.rb:141:9:141:18 | call to source : | semantics.rb:145:5:145:5 | [post] h [element] : | -| semantics.rb:141:9:141:18 | call to source : | semantics.rb:145:5:145:5 | [post] h [element] : | +| semantics.rb:141:5:141:5 | b : | semantics.rb:145:5:145:5 | [post] h [element] : | +| semantics.rb:141:5:141:5 | b : | semantics.rb:145:5:145:5 | [post] h [element] : | +| semantics.rb:141:9:141:18 | call to source : | semantics.rb:141:5:141:5 | b : | +| semantics.rb:141:9:141:18 | call to source : | semantics.rb:141:5:141:5 | b : | | semantics.rb:145:5:145:5 | [post] h [element] : | semantics.rb:147:14:147:14 | h [element] : | | semantics.rb:145:5:145:5 | [post] h [element] : | semantics.rb:147:14:147:14 | h [element] : | | semantics.rb:147:14:147:14 | h [element] : | semantics.rb:147:10:147:15 | call to s19 | | semantics.rb:147:14:147:14 | h [element] : | semantics.rb:147:10:147:15 | call to s19 | -| semantics.rb:151:9:151:18 | call to source : | semantics.rb:152:13:152:13 | a : | -| semantics.rb:151:9:151:18 | call to source : | semantics.rb:152:13:152:13 | a : | -| semantics.rb:152:9:152:14 | call to s20 [element] : | semantics.rb:153:10:153:10 | x [element] : | -| semantics.rb:152:9:152:14 | call to s20 [element] : | semantics.rb:153:10:153:10 | x [element] : | -| semantics.rb:152:9:152:14 | call to s20 [element] : | semantics.rb:154:10:154:10 | x [element] : | -| semantics.rb:152:9:152:14 | call to s20 [element] : | semantics.rb:154:10:154:10 | x [element] : | +| semantics.rb:151:5:151:5 | a : | semantics.rb:152:13:152:13 | a : | +| semantics.rb:151:5:151:5 | a : | semantics.rb:152:13:152:13 | a : | +| semantics.rb:151:9:151:18 | call to source : | semantics.rb:151:5:151:5 | a : | +| semantics.rb:151:9:151:18 | call to source : | semantics.rb:151:5:151:5 | a : | +| semantics.rb:152:5:152:5 | x [element] : | semantics.rb:153:10:153:10 | x [element] : | +| semantics.rb:152:5:152:5 | x [element] : | semantics.rb:153:10:153:10 | x [element] : | +| semantics.rb:152:5:152:5 | x [element] : | semantics.rb:154:10:154:10 | x [element] : | +| semantics.rb:152:5:152:5 | x [element] : | semantics.rb:154:10:154:10 | x [element] : | +| semantics.rb:152:9:152:14 | call to s20 [element] : | semantics.rb:152:5:152:5 | x [element] : | +| semantics.rb:152:9:152:14 | call to s20 [element] : | semantics.rb:152:5:152:5 | x [element] : | | semantics.rb:152:13:152:13 | a : | semantics.rb:152:9:152:14 | call to s20 [element] : | | semantics.rb:152:13:152:13 | a : | semantics.rb:152:9:152:14 | call to s20 [element] : | | semantics.rb:153:10:153:10 | x [element] : | semantics.rb:153:10:153:13 | ...[...] | | semantics.rb:153:10:153:10 | x [element] : | semantics.rb:153:10:153:13 | ...[...] | | semantics.rb:154:10:154:10 | x [element] : | semantics.rb:154:10:154:13 | ...[...] | | semantics.rb:154:10:154:10 | x [element] : | semantics.rb:154:10:154:13 | ...[...] | -| semantics.rb:158:9:158:18 | call to source : | semantics.rb:162:5:162:5 | [post] h [element 0] : | -| semantics.rb:158:9:158:18 | call to source : | semantics.rb:162:5:162:5 | [post] h [element 0] : | -| semantics.rb:159:9:159:18 | call to source : | semantics.rb:163:5:163:5 | [post] h [element] : | -| semantics.rb:159:9:159:18 | call to source : | semantics.rb:163:5:163:5 | [post] h [element] : | +| semantics.rb:158:5:158:5 | a : | semantics.rb:162:5:162:5 | [post] h [element 0] : | +| semantics.rb:158:5:158:5 | a : | semantics.rb:162:5:162:5 | [post] h [element 0] : | +| semantics.rb:158:9:158:18 | call to source : | semantics.rb:158:5:158:5 | a : | +| semantics.rb:158:9:158:18 | call to source : | semantics.rb:158:5:158:5 | a : | +| semantics.rb:159:5:159:5 | b : | semantics.rb:163:5:163:5 | [post] h [element] : | +| semantics.rb:159:5:159:5 | b : | semantics.rb:163:5:163:5 | [post] h [element] : | +| semantics.rb:159:9:159:18 | call to source : | semantics.rb:159:5:159:5 | b : | +| semantics.rb:159:9:159:18 | call to source : | semantics.rb:159:5:159:5 | b : | | semantics.rb:162:5:162:5 | [post] h [element 0] : | semantics.rb:165:14:165:14 | h [element 0] : | | semantics.rb:162:5:162:5 | [post] h [element 0] : | semantics.rb:165:14:165:14 | h [element 0] : | | semantics.rb:163:5:163:5 | [post] h [element] : | semantics.rb:165:14:165:14 | h [element] : | @@ -170,20 +209,26 @@ edges | semantics.rb:165:14:165:14 | h [element 0] : | semantics.rb:165:10:165:15 | call to s21 | | semantics.rb:165:14:165:14 | h [element] : | semantics.rb:165:10:165:15 | call to s21 | | semantics.rb:165:14:165:14 | h [element] : | semantics.rb:165:10:165:15 | call to s21 | -| semantics.rb:169:9:169:18 | call to source : | semantics.rb:170:13:170:13 | a : | -| semantics.rb:169:9:169:18 | call to source : | semantics.rb:170:13:170:13 | a : | -| semantics.rb:170:9:170:14 | call to s22 [element] : | semantics.rb:171:10:171:10 | x [element] : | -| semantics.rb:170:9:170:14 | call to s22 [element] : | semantics.rb:171:10:171:10 | x [element] : | -| semantics.rb:170:9:170:14 | call to s22 [element] : | semantics.rb:172:10:172:10 | x [element] : | -| semantics.rb:170:9:170:14 | call to s22 [element] : | semantics.rb:172:10:172:10 | x [element] : | +| semantics.rb:169:5:169:5 | a : | semantics.rb:170:13:170:13 | a : | +| semantics.rb:169:5:169:5 | a : | semantics.rb:170:13:170:13 | a : | +| semantics.rb:169:9:169:18 | call to source : | semantics.rb:169:5:169:5 | a : | +| semantics.rb:169:9:169:18 | call to source : | semantics.rb:169:5:169:5 | a : | +| semantics.rb:170:5:170:5 | x [element] : | semantics.rb:171:10:171:10 | x [element] : | +| semantics.rb:170:5:170:5 | x [element] : | semantics.rb:171:10:171:10 | x [element] : | +| semantics.rb:170:5:170:5 | x [element] : | semantics.rb:172:10:172:10 | x [element] : | +| semantics.rb:170:5:170:5 | x [element] : | semantics.rb:172:10:172:10 | x [element] : | +| semantics.rb:170:9:170:14 | call to s22 [element] : | semantics.rb:170:5:170:5 | x [element] : | +| semantics.rb:170:9:170:14 | call to s22 [element] : | semantics.rb:170:5:170:5 | x [element] : | | semantics.rb:170:13:170:13 | a : | semantics.rb:170:9:170:14 | call to s22 [element] : | | semantics.rb:170:13:170:13 | a : | semantics.rb:170:9:170:14 | call to s22 [element] : | | semantics.rb:171:10:171:10 | x [element] : | semantics.rb:171:10:171:13 | ...[...] | | semantics.rb:171:10:171:10 | x [element] : | semantics.rb:171:10:171:13 | ...[...] | | semantics.rb:172:10:172:10 | x [element] : | semantics.rb:172:10:172:13 | ...[...] | | semantics.rb:172:10:172:10 | x [element] : | semantics.rb:172:10:172:13 | ...[...] | -| semantics.rb:176:9:176:18 | call to source : | semantics.rb:179:5:179:5 | [post] h [element 0] : | -| semantics.rb:176:9:176:18 | call to source : | semantics.rb:179:5:179:5 | [post] h [element 0] : | +| semantics.rb:176:5:176:5 | a : | semantics.rb:179:5:179:5 | [post] h [element 0] : | +| semantics.rb:176:5:176:5 | a : | semantics.rb:179:5:179:5 | [post] h [element 0] : | +| semantics.rb:176:9:176:18 | call to source : | semantics.rb:176:5:176:5 | a : | +| semantics.rb:176:9:176:18 | call to source : | semantics.rb:176:5:176:5 | a : | | semantics.rb:179:5:179:5 | [post] h [element 0] : | semantics.rb:180:5:180:5 | h [element 0] : | | semantics.rb:179:5:179:5 | [post] h [element 0] : | semantics.rb:180:5:180:5 | h [element 0] : | | semantics.rb:180:5:180:5 | [post] h [element 0] : | semantics.rb:181:14:181:14 | h [element 0] : | @@ -192,20 +237,26 @@ edges | semantics.rb:180:5:180:5 | h [element 0] : | semantics.rb:180:5:180:5 | [post] h [element 0] : | | semantics.rb:181:14:181:14 | h [element 0] : | semantics.rb:181:10:181:15 | call to s23 | | semantics.rb:181:14:181:14 | h [element 0] : | semantics.rb:181:10:181:15 | call to s23 | -| semantics.rb:185:9:185:18 | call to source : | semantics.rb:186:13:186:13 | a : | -| semantics.rb:185:9:185:18 | call to source : | semantics.rb:186:13:186:13 | a : | -| semantics.rb:186:9:186:14 | call to s24 [element 0] : | semantics.rb:187:10:187:10 | x [element 0] : | -| semantics.rb:186:9:186:14 | call to s24 [element 0] : | semantics.rb:187:10:187:10 | x [element 0] : | -| semantics.rb:186:9:186:14 | call to s24 [element 0] : | semantics.rb:189:10:189:10 | x [element 0] : | -| semantics.rb:186:9:186:14 | call to s24 [element 0] : | semantics.rb:189:10:189:10 | x [element 0] : | +| semantics.rb:185:5:185:5 | a : | semantics.rb:186:13:186:13 | a : | +| semantics.rb:185:5:185:5 | a : | semantics.rb:186:13:186:13 | a : | +| semantics.rb:185:9:185:18 | call to source : | semantics.rb:185:5:185:5 | a : | +| semantics.rb:185:9:185:18 | call to source : | semantics.rb:185:5:185:5 | a : | +| semantics.rb:186:5:186:5 | x [element 0] : | semantics.rb:187:10:187:10 | x [element 0] : | +| semantics.rb:186:5:186:5 | x [element 0] : | semantics.rb:187:10:187:10 | x [element 0] : | +| semantics.rb:186:5:186:5 | x [element 0] : | semantics.rb:189:10:189:10 | x [element 0] : | +| semantics.rb:186:5:186:5 | x [element 0] : | semantics.rb:189:10:189:10 | x [element 0] : | +| semantics.rb:186:9:186:14 | call to s24 [element 0] : | semantics.rb:186:5:186:5 | x [element 0] : | +| semantics.rb:186:9:186:14 | call to s24 [element 0] : | semantics.rb:186:5:186:5 | x [element 0] : | | semantics.rb:186:13:186:13 | a : | semantics.rb:186:9:186:14 | call to s24 [element 0] : | | semantics.rb:186:13:186:13 | a : | semantics.rb:186:9:186:14 | call to s24 [element 0] : | | semantics.rb:187:10:187:10 | x [element 0] : | semantics.rb:187:10:187:13 | ...[...] | | semantics.rb:187:10:187:10 | x [element 0] : | semantics.rb:187:10:187:13 | ...[...] | | semantics.rb:189:10:189:10 | x [element 0] : | semantics.rb:189:10:189:13 | ...[...] | | semantics.rb:189:10:189:10 | x [element 0] : | semantics.rb:189:10:189:13 | ...[...] | -| semantics.rb:193:9:193:18 | call to source : | semantics.rb:196:5:196:5 | [post] h [element 0] : | -| semantics.rb:193:9:193:18 | call to source : | semantics.rb:196:5:196:5 | [post] h [element 0] : | +| semantics.rb:193:5:193:5 | a : | semantics.rb:196:5:196:5 | [post] h [element 0] : | +| semantics.rb:193:5:193:5 | a : | semantics.rb:196:5:196:5 | [post] h [element 0] : | +| semantics.rb:193:9:193:18 | call to source : | semantics.rb:193:5:193:5 | a : | +| semantics.rb:193:9:193:18 | call to source : | semantics.rb:193:5:193:5 | a : | | semantics.rb:196:5:196:5 | [post] h [element 0] : | semantics.rb:197:5:197:5 | h [element 0] : | | semantics.rb:196:5:196:5 | [post] h [element 0] : | semantics.rb:197:5:197:5 | h [element 0] : | | semantics.rb:197:5:197:5 | [post] h [element 0] : | semantics.rb:198:14:198:14 | h [element 0] : | @@ -214,24 +265,34 @@ edges | semantics.rb:197:5:197:5 | h [element 0] : | semantics.rb:197:5:197:5 | [post] h [element 0] : | | semantics.rb:198:14:198:14 | h [element 0] : | semantics.rb:198:10:198:15 | call to s25 | | semantics.rb:198:14:198:14 | h [element 0] : | semantics.rb:198:10:198:15 | call to s25 | -| semantics.rb:202:9:202:18 | call to source : | semantics.rb:203:13:203:13 | a : | -| semantics.rb:202:9:202:18 | call to source : | semantics.rb:203:13:203:13 | a : | -| semantics.rb:203:9:203:14 | call to s26 [element 0] : | semantics.rb:204:10:204:10 | x [element 0] : | -| semantics.rb:203:9:203:14 | call to s26 [element 0] : | semantics.rb:204:10:204:10 | x [element 0] : | -| semantics.rb:203:9:203:14 | call to s26 [element 0] : | semantics.rb:206:10:206:10 | x [element 0] : | -| semantics.rb:203:9:203:14 | call to s26 [element 0] : | semantics.rb:206:10:206:10 | x [element 0] : | +| semantics.rb:202:5:202:5 | a : | semantics.rb:203:13:203:13 | a : | +| semantics.rb:202:5:202:5 | a : | semantics.rb:203:13:203:13 | a : | +| semantics.rb:202:9:202:18 | call to source : | semantics.rb:202:5:202:5 | a : | +| semantics.rb:202:9:202:18 | call to source : | semantics.rb:202:5:202:5 | a : | +| semantics.rb:203:5:203:5 | x [element 0] : | semantics.rb:204:10:204:10 | x [element 0] : | +| semantics.rb:203:5:203:5 | x [element 0] : | semantics.rb:204:10:204:10 | x [element 0] : | +| semantics.rb:203:5:203:5 | x [element 0] : | semantics.rb:206:10:206:10 | x [element 0] : | +| semantics.rb:203:5:203:5 | x [element 0] : | semantics.rb:206:10:206:10 | x [element 0] : | +| semantics.rb:203:9:203:14 | call to s26 [element 0] : | semantics.rb:203:5:203:5 | x [element 0] : | +| semantics.rb:203:9:203:14 | call to s26 [element 0] : | semantics.rb:203:5:203:5 | x [element 0] : | | semantics.rb:203:13:203:13 | a : | semantics.rb:203:9:203:14 | call to s26 [element 0] : | | semantics.rb:203:13:203:13 | a : | semantics.rb:203:9:203:14 | call to s26 [element 0] : | | semantics.rb:204:10:204:10 | x [element 0] : | semantics.rb:204:10:204:13 | ...[...] | | semantics.rb:204:10:204:10 | x [element 0] : | semantics.rb:204:10:204:13 | ...[...] | | semantics.rb:206:10:206:10 | x [element 0] : | semantics.rb:206:10:206:13 | ...[...] | | semantics.rb:206:10:206:10 | x [element 0] : | semantics.rb:206:10:206:13 | ...[...] | -| semantics.rb:211:9:211:18 | call to source : | semantics.rb:217:5:217:5 | [post] h [element 1] : | -| semantics.rb:211:9:211:18 | call to source : | semantics.rb:217:5:217:5 | [post] h [element 1] : | -| semantics.rb:212:9:212:18 | call to source : | semantics.rb:218:5:218:5 | [post] h [element 2] : | -| semantics.rb:212:9:212:18 | call to source : | semantics.rb:218:5:218:5 | [post] h [element 2] : | -| semantics.rb:213:9:213:18 | call to source : | semantics.rb:219:5:219:5 | [post] h [element] : | -| semantics.rb:213:9:213:18 | call to source : | semantics.rb:219:5:219:5 | [post] h [element] : | +| semantics.rb:211:5:211:5 | b : | semantics.rb:217:5:217:5 | [post] h [element 1] : | +| semantics.rb:211:5:211:5 | b : | semantics.rb:217:5:217:5 | [post] h [element 1] : | +| semantics.rb:211:9:211:18 | call to source : | semantics.rb:211:5:211:5 | b : | +| semantics.rb:211:9:211:18 | call to source : | semantics.rb:211:5:211:5 | b : | +| semantics.rb:212:5:212:5 | c : | semantics.rb:218:5:218:5 | [post] h [element 2] : | +| semantics.rb:212:5:212:5 | c : | semantics.rb:218:5:218:5 | [post] h [element 2] : | +| semantics.rb:212:9:212:18 | call to source : | semantics.rb:212:5:212:5 | c : | +| semantics.rb:212:9:212:18 | call to source : | semantics.rb:212:5:212:5 | c : | +| semantics.rb:213:5:213:5 | d : | semantics.rb:219:5:219:5 | [post] h [element] : | +| semantics.rb:213:5:213:5 | d : | semantics.rb:219:5:219:5 | [post] h [element] : | +| semantics.rb:213:9:213:18 | call to source : | semantics.rb:213:5:213:5 | d : | +| semantics.rb:213:9:213:18 | call to source : | semantics.rb:213:5:213:5 | d : | | semantics.rb:217:5:217:5 | [post] h [element 1] : | semantics.rb:218:5:218:5 | h [element 1] : | | semantics.rb:217:5:217:5 | [post] h [element 1] : | semantics.rb:218:5:218:5 | h [element 1] : | | semantics.rb:218:5:218:5 | [post] h [element 1] : | semantics.rb:221:14:221:14 | h [element 1] : | @@ -248,16 +309,20 @@ edges | semantics.rb:221:14:221:14 | h [element 2] : | semantics.rb:221:10:221:15 | call to s27 | | semantics.rb:221:14:221:14 | h [element] : | semantics.rb:221:10:221:15 | call to s27 | | semantics.rb:221:14:221:14 | h [element] : | semantics.rb:221:10:221:15 | call to s27 | -| semantics.rb:225:9:225:18 | call to source : | semantics.rb:226:13:226:13 | a : | -| semantics.rb:225:9:225:18 | call to source : | semantics.rb:226:13:226:13 | a : | -| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:227:10:227:10 | x [element] : | -| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:227:10:227:10 | x [element] : | -| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:228:10:228:10 | x [element] : | -| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:228:10:228:10 | x [element] : | -| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:229:10:229:10 | x [element] : | -| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:229:10:229:10 | x [element] : | -| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:230:10:230:10 | x [element] : | -| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:230:10:230:10 | x [element] : | +| semantics.rb:225:5:225:5 | a : | semantics.rb:226:13:226:13 | a : | +| semantics.rb:225:5:225:5 | a : | semantics.rb:226:13:226:13 | a : | +| semantics.rb:225:9:225:18 | call to source : | semantics.rb:225:5:225:5 | a : | +| semantics.rb:225:9:225:18 | call to source : | semantics.rb:225:5:225:5 | a : | +| semantics.rb:226:5:226:5 | x [element] : | semantics.rb:227:10:227:10 | x [element] : | +| semantics.rb:226:5:226:5 | x [element] : | semantics.rb:227:10:227:10 | x [element] : | +| semantics.rb:226:5:226:5 | x [element] : | semantics.rb:228:10:228:10 | x [element] : | +| semantics.rb:226:5:226:5 | x [element] : | semantics.rb:228:10:228:10 | x [element] : | +| semantics.rb:226:5:226:5 | x [element] : | semantics.rb:229:10:229:10 | x [element] : | +| semantics.rb:226:5:226:5 | x [element] : | semantics.rb:229:10:229:10 | x [element] : | +| semantics.rb:226:5:226:5 | x [element] : | semantics.rb:230:10:230:10 | x [element] : | +| semantics.rb:226:5:226:5 | x [element] : | semantics.rb:230:10:230:10 | x [element] : | +| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:226:5:226:5 | x [element] : | +| semantics.rb:226:9:226:14 | call to s28 [element] : | semantics.rb:226:5:226:5 | x [element] : | | semantics.rb:226:13:226:13 | a : | semantics.rb:226:9:226:14 | call to s28 [element] : | | semantics.rb:226:13:226:13 | a : | semantics.rb:226:9:226:14 | call to s28 [element] : | | semantics.rb:227:10:227:10 | x [element] : | semantics.rb:227:10:227:13 | ...[...] | @@ -268,10 +333,14 @@ edges | semantics.rb:229:10:229:10 | x [element] : | semantics.rb:229:10:229:13 | ...[...] | | semantics.rb:230:10:230:10 | x [element] : | semantics.rb:230:10:230:13 | ...[...] | | semantics.rb:230:10:230:10 | x [element] : | semantics.rb:230:10:230:13 | ...[...] | -| semantics.rb:235:9:235:18 | call to source : | semantics.rb:240:5:240:5 | [post] h [element 1] : | -| semantics.rb:235:9:235:18 | call to source : | semantics.rb:240:5:240:5 | [post] h [element 1] : | -| semantics.rb:236:9:236:18 | call to source : | semantics.rb:241:5:241:5 | [post] h [element 2] : | -| semantics.rb:236:9:236:18 | call to source : | semantics.rb:241:5:241:5 | [post] h [element 2] : | +| semantics.rb:235:5:235:5 | b : | semantics.rb:240:5:240:5 | [post] h [element 1] : | +| semantics.rb:235:5:235:5 | b : | semantics.rb:240:5:240:5 | [post] h [element 1] : | +| semantics.rb:235:9:235:18 | call to source : | semantics.rb:235:5:235:5 | b : | +| semantics.rb:235:9:235:18 | call to source : | semantics.rb:235:5:235:5 | b : | +| semantics.rb:236:5:236:5 | c : | semantics.rb:241:5:241:5 | [post] h [element 2] : | +| semantics.rb:236:5:236:5 | c : | semantics.rb:241:5:241:5 | [post] h [element 2] : | +| semantics.rb:236:9:236:18 | call to source : | semantics.rb:236:5:236:5 | c : | +| semantics.rb:236:9:236:18 | call to source : | semantics.rb:236:5:236:5 | c : | | semantics.rb:240:5:240:5 | [post] h [element 1] : | semantics.rb:241:5:241:5 | h [element 1] : | | semantics.rb:240:5:240:5 | [post] h [element 1] : | semantics.rb:241:5:241:5 | h [element 1] : | | semantics.rb:241:5:241:5 | [post] h [element 1] : | semantics.rb:244:14:244:14 | h [element 1] : | @@ -284,16 +353,20 @@ edges | semantics.rb:244:14:244:14 | h [element 1] : | semantics.rb:244:10:244:15 | call to s29 | | semantics.rb:244:14:244:14 | h [element 2] : | semantics.rb:244:10:244:15 | call to s29 | | semantics.rb:244:14:244:14 | h [element 2] : | semantics.rb:244:10:244:15 | call to s29 | -| semantics.rb:248:9:248:18 | call to source : | semantics.rb:249:13:249:13 | a : | -| semantics.rb:248:9:248:18 | call to source : | semantics.rb:249:13:249:13 | a : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:250:10:250:10 | x [element] : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:250:10:250:10 | x [element] : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:251:10:251:10 | x [element] : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:251:10:251:10 | x [element] : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:252:10:252:10 | x [element] : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:252:10:252:10 | x [element] : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:253:10:253:10 | x [element] : | -| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:253:10:253:10 | x [element] : | +| semantics.rb:248:5:248:5 | a : | semantics.rb:249:13:249:13 | a : | +| semantics.rb:248:5:248:5 | a : | semantics.rb:249:13:249:13 | a : | +| semantics.rb:248:9:248:18 | call to source : | semantics.rb:248:5:248:5 | a : | +| semantics.rb:248:9:248:18 | call to source : | semantics.rb:248:5:248:5 | a : | +| semantics.rb:249:5:249:5 | x [element] : | semantics.rb:250:10:250:10 | x [element] : | +| semantics.rb:249:5:249:5 | x [element] : | semantics.rb:250:10:250:10 | x [element] : | +| semantics.rb:249:5:249:5 | x [element] : | semantics.rb:251:10:251:10 | x [element] : | +| semantics.rb:249:5:249:5 | x [element] : | semantics.rb:251:10:251:10 | x [element] : | +| semantics.rb:249:5:249:5 | x [element] : | semantics.rb:252:10:252:10 | x [element] : | +| semantics.rb:249:5:249:5 | x [element] : | semantics.rb:252:10:252:10 | x [element] : | +| semantics.rb:249:5:249:5 | x [element] : | semantics.rb:253:10:253:10 | x [element] : | +| semantics.rb:249:5:249:5 | x [element] : | semantics.rb:253:10:253:10 | x [element] : | +| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:249:5:249:5 | x [element] : | +| semantics.rb:249:9:249:14 | call to s30 [element] : | semantics.rb:249:5:249:5 | x [element] : | | semantics.rb:249:13:249:13 | a : | semantics.rb:249:9:249:14 | call to s30 [element] : | | semantics.rb:249:13:249:13 | a : | semantics.rb:249:9:249:14 | call to s30 [element] : | | semantics.rb:250:10:250:10 | x [element] : | semantics.rb:250:10:250:13 | ...[...] | @@ -392,30 +465,36 @@ edges | semantics.rb:285:14:285:14 | h [element true] : | semantics.rb:285:10:285:15 | call to s33 | | semantics.rb:285:14:285:14 | h [element] : | semantics.rb:285:10:285:15 | call to s33 | | semantics.rb:285:14:285:14 | h [element] : | semantics.rb:285:10:285:15 | call to s33 | -| semantics.rb:289:9:289:24 | call to s35 [element :foo] : | semantics.rb:290:10:290:10 | x [element :foo] : | -| semantics.rb:289:9:289:24 | call to s35 [element :foo] : | semantics.rb:290:10:290:10 | x [element :foo] : | -| semantics.rb:289:9:289:24 | call to s35 [element :foo] : | semantics.rb:292:10:292:10 | x [element :foo] : | -| semantics.rb:289:9:289:24 | call to s35 [element :foo] : | semantics.rb:292:10:292:10 | x [element :foo] : | +| semantics.rb:289:5:289:5 | x [element :foo] : | semantics.rb:290:10:290:10 | x [element :foo] : | +| semantics.rb:289:5:289:5 | x [element :foo] : | semantics.rb:290:10:290:10 | x [element :foo] : | +| semantics.rb:289:5:289:5 | x [element :foo] : | semantics.rb:292:10:292:10 | x [element :foo] : | +| semantics.rb:289:5:289:5 | x [element :foo] : | semantics.rb:292:10:292:10 | x [element :foo] : | +| semantics.rb:289:9:289:24 | call to s35 [element :foo] : | semantics.rb:289:5:289:5 | x [element :foo] : | +| semantics.rb:289:9:289:24 | call to s35 [element :foo] : | semantics.rb:289:5:289:5 | x [element :foo] : | | semantics.rb:289:13:289:23 | call to source : | semantics.rb:289:9:289:24 | call to s35 [element :foo] : | | semantics.rb:289:13:289:23 | call to source : | semantics.rb:289:9:289:24 | call to s35 [element :foo] : | | semantics.rb:290:10:290:10 | x [element :foo] : | semantics.rb:290:10:290:16 | ...[...] | | semantics.rb:290:10:290:10 | x [element :foo] : | semantics.rb:290:10:290:16 | ...[...] | | semantics.rb:292:10:292:10 | x [element :foo] : | semantics.rb:292:10:292:13 | ...[...] | | semantics.rb:292:10:292:10 | x [element :foo] : | semantics.rb:292:10:292:13 | ...[...] | -| semantics.rb:296:9:296:24 | call to s36 [element foo] : | semantics.rb:298:10:298:10 | x [element foo] : | -| semantics.rb:296:9:296:24 | call to s36 [element foo] : | semantics.rb:298:10:298:10 | x [element foo] : | -| semantics.rb:296:9:296:24 | call to s36 [element foo] : | semantics.rb:300:10:300:10 | x [element foo] : | -| semantics.rb:296:9:296:24 | call to s36 [element foo] : | semantics.rb:300:10:300:10 | x [element foo] : | +| semantics.rb:296:5:296:5 | x [element foo] : | semantics.rb:298:10:298:10 | x [element foo] : | +| semantics.rb:296:5:296:5 | x [element foo] : | semantics.rb:298:10:298:10 | x [element foo] : | +| semantics.rb:296:5:296:5 | x [element foo] : | semantics.rb:300:10:300:10 | x [element foo] : | +| semantics.rb:296:5:296:5 | x [element foo] : | semantics.rb:300:10:300:10 | x [element foo] : | +| semantics.rb:296:9:296:24 | call to s36 [element foo] : | semantics.rb:296:5:296:5 | x [element foo] : | +| semantics.rb:296:9:296:24 | call to s36 [element foo] : | semantics.rb:296:5:296:5 | x [element foo] : | | semantics.rb:296:13:296:23 | call to source : | semantics.rb:296:9:296:24 | call to s36 [element foo] : | | semantics.rb:296:13:296:23 | call to source : | semantics.rb:296:9:296:24 | call to s36 [element foo] : | | semantics.rb:298:10:298:10 | x [element foo] : | semantics.rb:298:10:298:17 | ...[...] | | semantics.rb:298:10:298:10 | x [element foo] : | semantics.rb:298:10:298:17 | ...[...] | | semantics.rb:300:10:300:10 | x [element foo] : | semantics.rb:300:10:300:13 | ...[...] | | semantics.rb:300:10:300:10 | x [element foo] : | semantics.rb:300:10:300:13 | ...[...] | -| semantics.rb:304:9:304:24 | call to s37 [element true] : | semantics.rb:306:10:306:10 | x [element true] : | -| semantics.rb:304:9:304:24 | call to s37 [element true] : | semantics.rb:306:10:306:10 | x [element true] : | -| semantics.rb:304:9:304:24 | call to s37 [element true] : | semantics.rb:308:10:308:10 | x [element true] : | -| semantics.rb:304:9:304:24 | call to s37 [element true] : | semantics.rb:308:10:308:10 | x [element true] : | +| semantics.rb:304:5:304:5 | x [element true] : | semantics.rb:306:10:306:10 | x [element true] : | +| semantics.rb:304:5:304:5 | x [element true] : | semantics.rb:306:10:306:10 | x [element true] : | +| semantics.rb:304:5:304:5 | x [element true] : | semantics.rb:308:10:308:10 | x [element true] : | +| semantics.rb:304:5:304:5 | x [element true] : | semantics.rb:308:10:308:10 | x [element true] : | +| semantics.rb:304:9:304:24 | call to s37 [element true] : | semantics.rb:304:5:304:5 | x [element true] : | +| semantics.rb:304:9:304:24 | call to s37 [element true] : | semantics.rb:304:5:304:5 | x [element true] : | | semantics.rb:304:13:304:23 | call to source : | semantics.rb:304:9:304:24 | call to s37 [element true] : | | semantics.rb:304:13:304:23 | call to source : | semantics.rb:304:9:304:24 | call to s37 [element true] : | | semantics.rb:306:10:306:10 | x [element true] : | semantics.rb:306:10:306:16 | ...[...] | @@ -428,10 +507,12 @@ edges | semantics.rb:312:16:312:26 | call to source : | semantics.rb:312:5:312:5 | [post] h [element foo] : | | semantics.rb:315:14:315:14 | h [element foo] : | semantics.rb:315:10:315:15 | call to s38 | | semantics.rb:315:14:315:14 | h [element foo] : | semantics.rb:315:10:315:15 | call to s38 | -| semantics.rb:319:9:319:24 | call to s39 [element :foo] : | semantics.rb:321:10:321:10 | x [element :foo] : | -| semantics.rb:319:9:319:24 | call to s39 [element :foo] : | semantics.rb:321:10:321:10 | x [element :foo] : | -| semantics.rb:319:9:319:24 | call to s39 [element :foo] : | semantics.rb:322:10:322:10 | x [element :foo] : | -| semantics.rb:319:9:319:24 | call to s39 [element :foo] : | semantics.rb:322:10:322:10 | x [element :foo] : | +| semantics.rb:319:5:319:5 | x [element :foo] : | semantics.rb:321:10:321:10 | x [element :foo] : | +| semantics.rb:319:5:319:5 | x [element :foo] : | semantics.rb:321:10:321:10 | x [element :foo] : | +| semantics.rb:319:5:319:5 | x [element :foo] : | semantics.rb:322:10:322:10 | x [element :foo] : | +| semantics.rb:319:5:319:5 | x [element :foo] : | semantics.rb:322:10:322:10 | x [element :foo] : | +| semantics.rb:319:9:319:24 | call to s39 [element :foo] : | semantics.rb:319:5:319:5 | x [element :foo] : | +| semantics.rb:319:9:319:24 | call to s39 [element :foo] : | semantics.rb:319:5:319:5 | x [element :foo] : | | semantics.rb:319:13:319:23 | call to source : | semantics.rb:319:9:319:24 | call to s39 [element :foo] : | | semantics.rb:319:13:319:23 | call to source : | semantics.rb:319:9:319:24 | call to s39 [element :foo] : | | semantics.rb:321:10:321:10 | x [element :foo] : | semantics.rb:321:10:321:16 | ...[...] | @@ -444,8 +525,10 @@ edges | semantics.rb:327:13:327:23 | call to source : | semantics.rb:327:5:327:5 | [post] x [@foo] : | | semantics.rb:329:14:329:14 | x [@foo] : | semantics.rb:329:10:329:15 | call to s40 | | semantics.rb:329:14:329:14 | x [@foo] : | semantics.rb:329:10:329:15 | call to s40 | -| semantics.rb:333:9:333:24 | call to s41 [@foo] : | semantics.rb:334:10:334:10 | x [@foo] : | -| semantics.rb:333:9:333:24 | call to s41 [@foo] : | semantics.rb:334:10:334:10 | x [@foo] : | +| semantics.rb:333:5:333:5 | x [@foo] : | semantics.rb:334:10:334:10 | x [@foo] : | +| semantics.rb:333:5:333:5 | x [@foo] : | semantics.rb:334:10:334:10 | x [@foo] : | +| semantics.rb:333:9:333:24 | call to s41 [@foo] : | semantics.rb:333:5:333:5 | x [@foo] : | +| semantics.rb:333:9:333:24 | call to s41 [@foo] : | semantics.rb:333:5:333:5 | x [@foo] : | | semantics.rb:333:13:333:23 | call to source : | semantics.rb:333:9:333:24 | call to s41 [@foo] : | | semantics.rb:333:13:333:23 | call to source : | semantics.rb:333:9:333:24 | call to s41 [@foo] : | | semantics.rb:334:10:334:10 | x [@foo] : | semantics.rb:334:10:334:14 | call to foo | @@ -458,16 +541,20 @@ edges | semantics.rb:340:5:340:5 | [post] h [element] : | semantics.rb:342:13:342:13 | h [element] : | | semantics.rb:340:12:340:22 | call to source : | semantics.rb:340:5:340:5 | [post] h [element] : | | semantics.rb:340:12:340:22 | call to source : | semantics.rb:340:5:340:5 | [post] h [element] : | -| semantics.rb:342:9:342:14 | call to s42 [element 0] : | semantics.rb:344:10:344:10 | x [element 0] : | -| semantics.rb:342:9:342:14 | call to s42 [element 0] : | semantics.rb:344:10:344:10 | x [element 0] : | -| semantics.rb:342:9:342:14 | call to s42 [element 0] : | semantics.rb:346:10:346:10 | x [element 0] : | -| semantics.rb:342:9:342:14 | call to s42 [element 0] : | semantics.rb:346:10:346:10 | x [element 0] : | -| semantics.rb:342:9:342:14 | call to s42 [element] : | semantics.rb:344:10:344:10 | x [element] : | -| semantics.rb:342:9:342:14 | call to s42 [element] : | semantics.rb:344:10:344:10 | x [element] : | -| semantics.rb:342:9:342:14 | call to s42 [element] : | semantics.rb:345:10:345:10 | x [element] : | -| semantics.rb:342:9:342:14 | call to s42 [element] : | semantics.rb:345:10:345:10 | x [element] : | -| semantics.rb:342:9:342:14 | call to s42 [element] : | semantics.rb:346:10:346:10 | x [element] : | -| semantics.rb:342:9:342:14 | call to s42 [element] : | semantics.rb:346:10:346:10 | x [element] : | +| semantics.rb:342:5:342:5 | x [element 0] : | semantics.rb:344:10:344:10 | x [element 0] : | +| semantics.rb:342:5:342:5 | x [element 0] : | semantics.rb:344:10:344:10 | x [element 0] : | +| semantics.rb:342:5:342:5 | x [element 0] : | semantics.rb:346:10:346:10 | x [element 0] : | +| semantics.rb:342:5:342:5 | x [element 0] : | semantics.rb:346:10:346:10 | x [element 0] : | +| semantics.rb:342:5:342:5 | x [element] : | semantics.rb:344:10:344:10 | x [element] : | +| semantics.rb:342:5:342:5 | x [element] : | semantics.rb:344:10:344:10 | x [element] : | +| semantics.rb:342:5:342:5 | x [element] : | semantics.rb:345:10:345:10 | x [element] : | +| semantics.rb:342:5:342:5 | x [element] : | semantics.rb:345:10:345:10 | x [element] : | +| semantics.rb:342:5:342:5 | x [element] : | semantics.rb:346:10:346:10 | x [element] : | +| semantics.rb:342:5:342:5 | x [element] : | semantics.rb:346:10:346:10 | x [element] : | +| semantics.rb:342:9:342:14 | call to s42 [element 0] : | semantics.rb:342:5:342:5 | x [element 0] : | +| semantics.rb:342:9:342:14 | call to s42 [element 0] : | semantics.rb:342:5:342:5 | x [element 0] : | +| semantics.rb:342:9:342:14 | call to s42 [element] : | semantics.rb:342:5:342:5 | x [element] : | +| semantics.rb:342:9:342:14 | call to s42 [element] : | semantics.rb:342:5:342:5 | x [element] : | | semantics.rb:342:13:342:13 | h [element 0] : | semantics.rb:342:9:342:14 | call to s42 [element 0] : | | semantics.rb:342:13:342:13 | h [element 0] : | semantics.rb:342:9:342:14 | call to s42 [element 0] : | | semantics.rb:342:13:342:13 | h [element] : | semantics.rb:342:9:342:14 | call to s42 [element] : | @@ -486,10 +573,12 @@ edges | semantics.rb:350:5:350:5 | [post] h [element 0] : | semantics.rb:353:13:353:13 | h [element 0] : | | semantics.rb:350:12:350:22 | call to source : | semantics.rb:350:5:350:5 | [post] h [element 0] : | | semantics.rb:350:12:350:22 | call to source : | semantics.rb:350:5:350:5 | [post] h [element 0] : | -| semantics.rb:353:9:353:14 | call to s43 [element 0] : | semantics.rb:355:10:355:10 | x [element 0] : | -| semantics.rb:353:9:353:14 | call to s43 [element 0] : | semantics.rb:355:10:355:10 | x [element 0] : | -| semantics.rb:353:9:353:14 | call to s43 [element 0] : | semantics.rb:357:10:357:10 | x [element 0] : | -| semantics.rb:353:9:353:14 | call to s43 [element 0] : | semantics.rb:357:10:357:10 | x [element 0] : | +| semantics.rb:353:5:353:5 | x [element 0] : | semantics.rb:355:10:355:10 | x [element 0] : | +| semantics.rb:353:5:353:5 | x [element 0] : | semantics.rb:355:10:355:10 | x [element 0] : | +| semantics.rb:353:5:353:5 | x [element 0] : | semantics.rb:357:10:357:10 | x [element 0] : | +| semantics.rb:353:5:353:5 | x [element 0] : | semantics.rb:357:10:357:10 | x [element 0] : | +| semantics.rb:353:9:353:14 | call to s43 [element 0] : | semantics.rb:353:5:353:5 | x [element 0] : | +| semantics.rb:353:9:353:14 | call to s43 [element 0] : | semantics.rb:353:5:353:5 | x [element 0] : | | semantics.rb:353:13:353:13 | h [element 0] : | semantics.rb:353:9:353:14 | call to s43 [element 0] : | | semantics.rb:353:13:353:13 | h [element 0] : | semantics.rb:353:9:353:14 | call to s43 [element 0] : | | semantics.rb:355:10:355:10 | x [element 0] : | semantics.rb:355:10:355:13 | ...[...] | @@ -616,10 +705,12 @@ edges | semantics.rb:395:10:395:10 | h [element 1] : | semantics.rb:395:10:395:13 | ...[...] | | semantics.rb:395:10:395:10 | h [element] : | semantics.rb:395:10:395:13 | ...[...] | | semantics.rb:395:10:395:10 | h [element] : | semantics.rb:395:10:395:13 | ...[...] | -| semantics.rb:397:9:397:14 | call to s46 [element 1] : | semantics.rb:400:10:400:10 | x [element 1] : | -| semantics.rb:397:9:397:14 | call to s46 [element 1] : | semantics.rb:400:10:400:10 | x [element 1] : | -| semantics.rb:397:9:397:14 | call to s46 [element 1] : | semantics.rb:401:10:401:10 | x [element 1] : | -| semantics.rb:397:9:397:14 | call to s46 [element 1] : | semantics.rb:401:10:401:10 | x [element 1] : | +| semantics.rb:397:5:397:5 | x [element 1] : | semantics.rb:400:10:400:10 | x [element 1] : | +| semantics.rb:397:5:397:5 | x [element 1] : | semantics.rb:400:10:400:10 | x [element 1] : | +| semantics.rb:397:5:397:5 | x [element 1] : | semantics.rb:401:10:401:10 | x [element 1] : | +| semantics.rb:397:5:397:5 | x [element 1] : | semantics.rb:401:10:401:10 | x [element 1] : | +| semantics.rb:397:9:397:14 | call to s46 [element 1] : | semantics.rb:397:5:397:5 | x [element 1] : | +| semantics.rb:397:9:397:14 | call to s46 [element 1] : | semantics.rb:397:5:397:5 | x [element 1] : | | semantics.rb:397:13:397:13 | h [element 1] : | semantics.rb:397:9:397:14 | call to s46 [element 1] : | | semantics.rb:397:13:397:13 | h [element 1] : | semantics.rb:397:9:397:14 | call to s46 [element 1] : | | semantics.rb:400:10:400:10 | x [element 1] : | semantics.rb:400:10:400:13 | ...[...] | @@ -654,8 +745,10 @@ edges | semantics.rb:410:10:410:10 | h [element :bar] : | semantics.rb:410:10:410:16 | ...[...] | | semantics.rb:410:10:410:10 | h [element] : | semantics.rb:410:10:410:16 | ...[...] | | semantics.rb:410:10:410:10 | h [element] : | semantics.rb:410:10:410:16 | ...[...] | -| semantics.rb:412:9:412:14 | call to s47 [element :bar] : | semantics.rb:415:10:415:10 | x [element :bar] : | -| semantics.rb:412:9:412:14 | call to s47 [element :bar] : | semantics.rb:415:10:415:10 | x [element :bar] : | +| semantics.rb:412:5:412:5 | x [element :bar] : | semantics.rb:415:10:415:10 | x [element :bar] : | +| semantics.rb:412:5:412:5 | x [element :bar] : | semantics.rb:415:10:415:10 | x [element :bar] : | +| semantics.rb:412:9:412:14 | call to s47 [element :bar] : | semantics.rb:412:5:412:5 | x [element :bar] : | +| semantics.rb:412:9:412:14 | call to s47 [element :bar] : | semantics.rb:412:5:412:5 | x [element :bar] : | | semantics.rb:412:13:412:13 | h [element :bar] : | semantics.rb:412:9:412:14 | call to s47 [element :bar] : | | semantics.rb:412:13:412:13 | h [element :bar] : | semantics.rb:412:9:412:14 | call to s47 [element :bar] : | | semantics.rb:415:10:415:10 | x [element :bar] : | semantics.rb:415:10:415:16 | ...[...] | @@ -688,8 +781,10 @@ edges | semantics.rb:424:10:424:10 | h [element :bar] : | semantics.rb:424:10:424:16 | ...[...] | | semantics.rb:424:10:424:10 | h [element] : | semantics.rb:424:10:424:16 | ...[...] | | semantics.rb:424:10:424:10 | h [element] : | semantics.rb:424:10:424:16 | ...[...] | -| semantics.rb:426:9:426:14 | call to s48 [element :bar] : | semantics.rb:429:10:429:10 | x [element :bar] : | -| semantics.rb:426:9:426:14 | call to s48 [element :bar] : | semantics.rb:429:10:429:10 | x [element :bar] : | +| semantics.rb:426:5:426:5 | x [element :bar] : | semantics.rb:429:10:429:10 | x [element :bar] : | +| semantics.rb:426:5:426:5 | x [element :bar] : | semantics.rb:429:10:429:10 | x [element :bar] : | +| semantics.rb:426:9:426:14 | call to s48 [element :bar] : | semantics.rb:426:5:426:5 | x [element :bar] : | +| semantics.rb:426:9:426:14 | call to s48 [element :bar] : | semantics.rb:426:5:426:5 | x [element :bar] : | | semantics.rb:426:13:426:13 | h [element :bar] : | semantics.rb:426:9:426:14 | call to s48 [element :bar] : | | semantics.rb:426:13:426:13 | h [element :bar] : | semantics.rb:426:9:426:14 | call to s48 [element :bar] : | | semantics.rb:429:10:429:10 | x [element :bar] : | semantics.rb:429:10:429:16 | ...[...] | @@ -724,12 +819,16 @@ edges | semantics.rb:438:10:438:10 | h [element :bar] : | semantics.rb:438:10:438:16 | ...[...] | | semantics.rb:438:10:438:10 | h [element] : | semantics.rb:438:10:438:16 | ...[...] | | semantics.rb:438:10:438:10 | h [element] : | semantics.rb:438:10:438:16 | ...[...] | -| semantics.rb:440:9:440:14 | call to s49 [element :bar] : | semantics.rb:443:10:443:10 | x [element :bar] : | -| semantics.rb:440:9:440:14 | call to s49 [element :bar] : | semantics.rb:443:10:443:10 | x [element :bar] : | -| semantics.rb:440:9:440:14 | call to s49 [element] : | semantics.rb:442:10:442:10 | x [element] : | -| semantics.rb:440:9:440:14 | call to s49 [element] : | semantics.rb:442:10:442:10 | x [element] : | -| semantics.rb:440:9:440:14 | call to s49 [element] : | semantics.rb:443:10:443:10 | x [element] : | -| semantics.rb:440:9:440:14 | call to s49 [element] : | semantics.rb:443:10:443:10 | x [element] : | +| semantics.rb:440:5:440:5 | x [element :bar] : | semantics.rb:443:10:443:10 | x [element :bar] : | +| semantics.rb:440:5:440:5 | x [element :bar] : | semantics.rb:443:10:443:10 | x [element :bar] : | +| semantics.rb:440:5:440:5 | x [element] : | semantics.rb:442:10:442:10 | x [element] : | +| semantics.rb:440:5:440:5 | x [element] : | semantics.rb:442:10:442:10 | x [element] : | +| semantics.rb:440:5:440:5 | x [element] : | semantics.rb:443:10:443:10 | x [element] : | +| semantics.rb:440:5:440:5 | x [element] : | semantics.rb:443:10:443:10 | x [element] : | +| semantics.rb:440:9:440:14 | call to s49 [element :bar] : | semantics.rb:440:5:440:5 | x [element :bar] : | +| semantics.rb:440:9:440:14 | call to s49 [element :bar] : | semantics.rb:440:5:440:5 | x [element :bar] : | +| semantics.rb:440:9:440:14 | call to s49 [element] : | semantics.rb:440:5:440:5 | x [element] : | +| semantics.rb:440:9:440:14 | call to s49 [element] : | semantics.rb:440:5:440:5 | x [element] : | | semantics.rb:440:13:440:13 | h [element :bar] : | semantics.rb:440:9:440:14 | call to s49 [element :bar] : | | semantics.rb:440:13:440:13 | h [element :bar] : | semantics.rb:440:9:440:14 | call to s49 [element :bar] : | | semantics.rb:440:13:440:13 | h [element] : | semantics.rb:440:9:440:14 | call to s49 [element] : | @@ -882,10 +981,12 @@ edges | semantics.rb:494:10:494:10 | h [element :bar] : | semantics.rb:494:10:494:16 | ...[...] | | semantics.rb:494:10:494:10 | h [element] : | semantics.rb:494:10:494:16 | ...[...] | | semantics.rb:494:10:494:10 | h [element] : | semantics.rb:494:10:494:16 | ...[...] | +| semantics.rb:496:5:496:5 | x [element :bar] : | semantics.rb:499:10:499:10 | x [element :bar] : | +| semantics.rb:496:5:496:5 | x [element :bar] : | semantics.rb:499:10:499:10 | x [element :bar] : | | semantics.rb:496:9:496:9 | h [element :bar] : | semantics.rb:496:9:496:15 | call to s53 [element :bar] : | | semantics.rb:496:9:496:9 | h [element :bar] : | semantics.rb:496:9:496:15 | call to s53 [element :bar] : | -| semantics.rb:496:9:496:15 | call to s53 [element :bar] : | semantics.rb:499:10:499:10 | x [element :bar] : | -| semantics.rb:496:9:496:15 | call to s53 [element :bar] : | semantics.rb:499:10:499:10 | x [element :bar] : | +| semantics.rb:496:9:496:15 | call to s53 [element :bar] : | semantics.rb:496:5:496:5 | x [element :bar] : | +| semantics.rb:496:9:496:15 | call to s53 [element :bar] : | semantics.rb:496:5:496:5 | x [element :bar] : | | semantics.rb:499:10:499:10 | x [element :bar] : | semantics.rb:499:10:499:16 | ...[...] | | semantics.rb:499:10:499:10 | x [element :bar] : | semantics.rb:499:10:499:16 | ...[...] | | semantics.rb:501:10:501:20 | call to source : | semantics.rb:501:10:501:26 | call to s53 | @@ -918,21 +1019,29 @@ edges | semantics.rb:510:10:510:10 | h [element :bar] : | semantics.rb:510:10:510:16 | ...[...] | | semantics.rb:510:10:510:10 | h [element] : | semantics.rb:510:10:510:16 | ...[...] | | semantics.rb:510:10:510:10 | h [element] : | semantics.rb:510:10:510:16 | ...[...] | +| semantics.rb:512:5:512:5 | x [element :bar] : | semantics.rb:515:10:515:10 | x [element :bar] : | +| semantics.rb:512:5:512:5 | x [element :bar] : | semantics.rb:515:10:515:10 | x [element :bar] : | | semantics.rb:512:9:512:9 | h [element :bar] : | semantics.rb:512:9:512:15 | call to s54 [element :bar] : | | semantics.rb:512:9:512:9 | h [element :bar] : | semantics.rb:512:9:512:15 | call to s54 [element :bar] : | -| semantics.rb:512:9:512:15 | call to s54 [element :bar] : | semantics.rb:515:10:515:10 | x [element :bar] : | -| semantics.rb:512:9:512:15 | call to s54 [element :bar] : | semantics.rb:515:10:515:10 | x [element :bar] : | +| semantics.rb:512:9:512:15 | call to s54 [element :bar] : | semantics.rb:512:5:512:5 | x [element :bar] : | +| semantics.rb:512:9:512:15 | call to s54 [element :bar] : | semantics.rb:512:5:512:5 | x [element :bar] : | | semantics.rb:515:10:515:10 | x [element :bar] : | semantics.rb:515:10:515:16 | ...[...] | | semantics.rb:515:10:515:10 | x [element :bar] : | semantics.rb:515:10:515:16 | ...[...] | nodes +| semantics.rb:2:5:2:5 | a : | semmle.label | a : | +| semantics.rb:2:5:2:5 | a : | semmle.label | a : | | semantics.rb:2:9:2:18 | call to source : | semmle.label | call to source : | | semantics.rb:2:9:2:18 | call to source : | semmle.label | call to source : | +| semantics.rb:3:5:3:5 | x : | semmle.label | x : | +| semantics.rb:3:5:3:5 | x : | semmle.label | x : | | semantics.rb:3:9:3:9 | a : | semmle.label | a : | | semantics.rb:3:9:3:9 | a : | semmle.label | a : | | semantics.rb:3:9:3:14 | call to s1 : | semmle.label | call to s1 : | | semantics.rb:3:9:3:14 | call to s1 : | semmle.label | call to s1 : | | semantics.rb:4:10:4:10 | x | semmle.label | x | | semantics.rb:4:10:4:10 | x | semmle.label | x | +| semantics.rb:8:5:8:5 | a : | semmle.label | a : | +| semantics.rb:8:5:8:5 | a : | semmle.label | a : | | semantics.rb:8:9:8:18 | call to source : | semmle.label | call to source : | | semantics.rb:8:9:8:18 | call to source : | semmle.label | call to source : | | semantics.rb:9:5:9:5 | [post] x : | semmle.label | [post] x : | @@ -941,6 +1050,8 @@ nodes | semantics.rb:9:10:9:10 | a : | semmle.label | a : | | semantics.rb:10:10:10:10 | x | semmle.label | x | | semantics.rb:10:10:10:10 | x | semmle.label | x | +| semantics.rb:14:5:14:5 | a : | semmle.label | a : | +| semantics.rb:14:5:14:5 | a : | semmle.label | a : | | semantics.rb:14:9:14:18 | call to source : | semmle.label | call to source : | | semantics.rb:14:9:14:18 | call to source : | semmle.label | call to source : | | semantics.rb:15:8:15:8 | a : | semmle.label | a : | @@ -957,6 +1068,8 @@ nodes | semantics.rb:23:10:23:33 | call to s4 | semmle.label | call to s4 | | semantics.rb:23:23:23:32 | call to source : | semmle.label | call to source : | | semantics.rb:23:23:23:32 | call to source : | semmle.label | call to source : | +| semantics.rb:28:5:28:5 | a : | semmle.label | a : | +| semantics.rb:28:5:28:5 | a : | semmle.label | a : | | semantics.rb:28:9:28:18 | call to source : | semmle.label | call to source : | | semantics.rb:28:9:28:18 | call to source : | semmle.label | call to source : | | semantics.rb:29:8:29:8 | a : | semmle.label | a : | @@ -969,6 +1082,8 @@ nodes | semantics.rb:31:10:31:10 | y | semmle.label | y | | semantics.rb:32:10:32:10 | z | semmle.label | z | | semantics.rb:32:10:32:10 | z | semmle.label | z | +| semantics.rb:40:5:40:5 | a : | semmle.label | a : | +| semantics.rb:40:5:40:5 | a : | semmle.label | a : | | semantics.rb:40:9:40:18 | call to source : | semmle.label | call to source : | | semantics.rb:40:9:40:18 | call to source : | semmle.label | call to source : | | semantics.rb:41:8:41:8 | a : | semmle.label | a : | @@ -997,6 +1112,8 @@ nodes | semantics.rb:54:24:54:24 | x : | semmle.label | x : | | semantics.rb:55:14:55:14 | x | semmle.label | x | | semantics.rb:55:14:55:14 | x | semmle.label | x | +| semantics.rb:60:5:60:5 | a : | semmle.label | a : | +| semantics.rb:60:5:60:5 | a : | semmle.label | a : | | semantics.rb:60:9:60:18 | call to source : | semmle.label | call to source : | | semantics.rb:60:9:60:18 | call to source : | semmle.label | call to source : | | semantics.rb:61:10:61:15 | call to s10 | semmle.label | call to s10 | @@ -1019,6 +1136,8 @@ nodes | semantics.rb:66:10:66:16 | call to s10 | semmle.label | call to s10 | | semantics.rb:66:14:66:15 | &... : | semmle.label | &... : | | semantics.rb:66:14:66:15 | &... : | semmle.label | &... : | +| semantics.rb:80:5:80:5 | a : | semmle.label | a : | +| semantics.rb:80:5:80:5 | a : | semmle.label | a : | | semantics.rb:80:9:80:18 | call to source : | semmle.label | call to source : | | semantics.rb:80:9:80:18 | call to source : | semmle.label | call to source : | | semantics.rb:81:5:81:5 | a : | semmle.label | a : | @@ -1035,6 +1154,8 @@ nodes | semantics.rb:83:10:83:10 | y | semmle.label | y | | semantics.rb:84:10:84:10 | z | semmle.label | z | | semantics.rb:84:10:84:10 | z | semmle.label | z | +| semantics.rb:89:5:89:5 | a : | semmle.label | a : | +| semantics.rb:89:5:89:5 | a : | semmle.label | a : | | semantics.rb:89:9:89:18 | call to source : | semmle.label | call to source : | | semantics.rb:89:9:89:18 | call to source : | semmle.label | call to source : | | semantics.rb:91:10:91:20 | call to s13 | semmle.label | call to s13 | @@ -1045,6 +1166,8 @@ nodes | semantics.rb:92:10:92:28 | call to s13 | semmle.label | call to s13 | | semantics.rb:92:27:92:27 | a : | semmle.label | a : | | semantics.rb:92:27:92:27 | a : | semmle.label | a : | +| semantics.rb:97:5:97:5 | a : | semmle.label | a : | +| semantics.rb:97:5:97:5 | a : | semmle.label | a : | | semantics.rb:97:9:97:18 | call to source : | semmle.label | call to source : | | semantics.rb:97:9:97:18 | call to source : | semmle.label | call to source : | | semantics.rb:98:5:98:5 | a : | semmle.label | a : | @@ -1063,15 +1186,22 @@ nodes | semantics.rb:102:10:102:10 | y | semmle.label | y | | semantics.rb:103:10:103:10 | z | semmle.label | z | | semantics.rb:103:10:103:10 | z | semmle.label | z | +| semantics.rb:107:5:107:5 | a : | semmle.label | a : | | semantics.rb:107:9:107:18 | call to source : | semmle.label | call to source : | | semantics.rb:109:10:109:17 | call to s15 | semmle.label | call to s15 | | semantics.rb:109:14:109:16 | ** ... : | semmle.label | ** ... : | | semantics.rb:110:10:110:31 | call to s15 | semmle.label | call to s15 | | semantics.rb:110:28:110:30 | ** ... : | semmle.label | ** ... : | +| semantics.rb:114:5:114:5 | a : | semmle.label | a : | +| semantics.rb:114:5:114:5 | a : | semmle.label | a : | | semantics.rb:114:9:114:18 | call to source : | semmle.label | call to source : | | semantics.rb:114:9:114:18 | call to source : | semmle.label | call to source : | +| semantics.rb:115:5:115:5 | b : | semmle.label | b : | +| semantics.rb:115:5:115:5 | b : | semmle.label | b : | | semantics.rb:115:9:115:18 | call to source : | semmle.label | call to source : | | semantics.rb:115:9:115:18 | call to source : | semmle.label | call to source : | +| semantics.rb:116:5:116:5 | h [element :a] : | semmle.label | h [element :a] : | +| semantics.rb:116:5:116:5 | h [element :a] : | semmle.label | h [element :a] : | | semantics.rb:116:14:116:14 | a : | semmle.label | a : | | semantics.rb:116:14:116:14 | a : | semmle.label | a : | | semantics.rb:117:10:117:17 | call to s16 | semmle.label | call to s16 | @@ -1092,6 +1222,8 @@ nodes | semantics.rb:121:20:121:22 | ** ... [element :a] : | semmle.label | ** ... [element :a] : | | semantics.rb:121:22:121:22 | h [element :a] : | semmle.label | h [element :a] : | | semantics.rb:121:22:121:22 | h [element :a] : | semmle.label | h [element :a] : | +| semantics.rb:125:5:125:5 | a : | semmle.label | a : | +| semantics.rb:125:5:125:5 | a : | semmle.label | a : | | semantics.rb:125:9:125:18 | call to source : | semmle.label | call to source : | | semantics.rb:125:9:125:18 | call to source : | semmle.label | call to source : | | semantics.rb:126:9:126:9 | a : | semmle.label | a : | @@ -1100,6 +1232,8 @@ nodes | semantics.rb:126:12:126:14 | [post] ** ... : | semmle.label | [post] ** ... : | | semantics.rb:127:10:127:10 | h | semmle.label | h | | semantics.rb:127:10:127:10 | h | semmle.label | h | +| semantics.rb:141:5:141:5 | b : | semmle.label | b : | +| semantics.rb:141:5:141:5 | b : | semmle.label | b : | | semantics.rb:141:9:141:18 | call to source : | semmle.label | call to source : | | semantics.rb:141:9:141:18 | call to source : | semmle.label | call to source : | | semantics.rb:145:5:145:5 | [post] h [element] : | semmle.label | [post] h [element] : | @@ -1108,8 +1242,12 @@ nodes | semantics.rb:147:10:147:15 | call to s19 | semmle.label | call to s19 | | semantics.rb:147:14:147:14 | h [element] : | semmle.label | h [element] : | | semantics.rb:147:14:147:14 | h [element] : | semmle.label | h [element] : | +| semantics.rb:151:5:151:5 | a : | semmle.label | a : | +| semantics.rb:151:5:151:5 | a : | semmle.label | a : | | semantics.rb:151:9:151:18 | call to source : | semmle.label | call to source : | | semantics.rb:151:9:151:18 | call to source : | semmle.label | call to source : | +| semantics.rb:152:5:152:5 | x [element] : | semmle.label | x [element] : | +| semantics.rb:152:5:152:5 | x [element] : | semmle.label | x [element] : | | semantics.rb:152:9:152:14 | call to s20 [element] : | semmle.label | call to s20 [element] : | | semantics.rb:152:9:152:14 | call to s20 [element] : | semmle.label | call to s20 [element] : | | semantics.rb:152:13:152:13 | a : | semmle.label | a : | @@ -1122,8 +1260,12 @@ nodes | semantics.rb:154:10:154:10 | x [element] : | semmle.label | x [element] : | | semantics.rb:154:10:154:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:154:10:154:13 | ...[...] | semmle.label | ...[...] | +| semantics.rb:158:5:158:5 | a : | semmle.label | a : | +| semantics.rb:158:5:158:5 | a : | semmle.label | a : | | semantics.rb:158:9:158:18 | call to source : | semmle.label | call to source : | | semantics.rb:158:9:158:18 | call to source : | semmle.label | call to source : | +| semantics.rb:159:5:159:5 | b : | semmle.label | b : | +| semantics.rb:159:5:159:5 | b : | semmle.label | b : | | semantics.rb:159:9:159:18 | call to source : | semmle.label | call to source : | | semantics.rb:159:9:159:18 | call to source : | semmle.label | call to source : | | semantics.rb:162:5:162:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | @@ -1136,8 +1278,12 @@ nodes | semantics.rb:165:14:165:14 | h [element 0] : | semmle.label | h [element 0] : | | semantics.rb:165:14:165:14 | h [element] : | semmle.label | h [element] : | | semantics.rb:165:14:165:14 | h [element] : | semmle.label | h [element] : | +| semantics.rb:169:5:169:5 | a : | semmle.label | a : | +| semantics.rb:169:5:169:5 | a : | semmle.label | a : | | semantics.rb:169:9:169:18 | call to source : | semmle.label | call to source : | | semantics.rb:169:9:169:18 | call to source : | semmle.label | call to source : | +| semantics.rb:170:5:170:5 | x [element] : | semmle.label | x [element] : | +| semantics.rb:170:5:170:5 | x [element] : | semmle.label | x [element] : | | semantics.rb:170:9:170:14 | call to s22 [element] : | semmle.label | call to s22 [element] : | | semantics.rb:170:9:170:14 | call to s22 [element] : | semmle.label | call to s22 [element] : | | semantics.rb:170:13:170:13 | a : | semmle.label | a : | @@ -1150,6 +1296,8 @@ nodes | semantics.rb:172:10:172:10 | x [element] : | semmle.label | x [element] : | | semantics.rb:172:10:172:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:172:10:172:13 | ...[...] | semmle.label | ...[...] | +| semantics.rb:176:5:176:5 | a : | semmle.label | a : | +| semantics.rb:176:5:176:5 | a : | semmle.label | a : | | semantics.rb:176:9:176:18 | call to source : | semmle.label | call to source : | | semantics.rb:176:9:176:18 | call to source : | semmle.label | call to source : | | semantics.rb:179:5:179:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | @@ -1162,8 +1310,12 @@ nodes | semantics.rb:181:10:181:15 | call to s23 | semmle.label | call to s23 | | semantics.rb:181:14:181:14 | h [element 0] : | semmle.label | h [element 0] : | | semantics.rb:181:14:181:14 | h [element 0] : | semmle.label | h [element 0] : | +| semantics.rb:185:5:185:5 | a : | semmle.label | a : | +| semantics.rb:185:5:185:5 | a : | semmle.label | a : | | semantics.rb:185:9:185:18 | call to source : | semmle.label | call to source : | | semantics.rb:185:9:185:18 | call to source : | semmle.label | call to source : | +| semantics.rb:186:5:186:5 | x [element 0] : | semmle.label | x [element 0] : | +| semantics.rb:186:5:186:5 | x [element 0] : | semmle.label | x [element 0] : | | semantics.rb:186:9:186:14 | call to s24 [element 0] : | semmle.label | call to s24 [element 0] : | | semantics.rb:186:9:186:14 | call to s24 [element 0] : | semmle.label | call to s24 [element 0] : | | semantics.rb:186:13:186:13 | a : | semmle.label | a : | @@ -1176,6 +1328,8 @@ nodes | semantics.rb:189:10:189:10 | x [element 0] : | semmle.label | x [element 0] : | | semantics.rb:189:10:189:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:189:10:189:13 | ...[...] | semmle.label | ...[...] | +| semantics.rb:193:5:193:5 | a : | semmle.label | a : | +| semantics.rb:193:5:193:5 | a : | semmle.label | a : | | semantics.rb:193:9:193:18 | call to source : | semmle.label | call to source : | | semantics.rb:193:9:193:18 | call to source : | semmle.label | call to source : | | semantics.rb:196:5:196:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | @@ -1188,8 +1342,12 @@ nodes | semantics.rb:198:10:198:15 | call to s25 | semmle.label | call to s25 | | semantics.rb:198:14:198:14 | h [element 0] : | semmle.label | h [element 0] : | | semantics.rb:198:14:198:14 | h [element 0] : | semmle.label | h [element 0] : | +| semantics.rb:202:5:202:5 | a : | semmle.label | a : | +| semantics.rb:202:5:202:5 | a : | semmle.label | a : | | semantics.rb:202:9:202:18 | call to source : | semmle.label | call to source : | | semantics.rb:202:9:202:18 | call to source : | semmle.label | call to source : | +| semantics.rb:203:5:203:5 | x [element 0] : | semmle.label | x [element 0] : | +| semantics.rb:203:5:203:5 | x [element 0] : | semmle.label | x [element 0] : | | semantics.rb:203:9:203:14 | call to s26 [element 0] : | semmle.label | call to s26 [element 0] : | | semantics.rb:203:9:203:14 | call to s26 [element 0] : | semmle.label | call to s26 [element 0] : | | semantics.rb:203:13:203:13 | a : | semmle.label | a : | @@ -1202,10 +1360,16 @@ nodes | semantics.rb:206:10:206:10 | x [element 0] : | semmle.label | x [element 0] : | | semantics.rb:206:10:206:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:206:10:206:13 | ...[...] | semmle.label | ...[...] | +| semantics.rb:211:5:211:5 | b : | semmle.label | b : | +| semantics.rb:211:5:211:5 | b : | semmle.label | b : | | semantics.rb:211:9:211:18 | call to source : | semmle.label | call to source : | | semantics.rb:211:9:211:18 | call to source : | semmle.label | call to source : | +| semantics.rb:212:5:212:5 | c : | semmle.label | c : | +| semantics.rb:212:5:212:5 | c : | semmle.label | c : | | semantics.rb:212:9:212:18 | call to source : | semmle.label | call to source : | | semantics.rb:212:9:212:18 | call to source : | semmle.label | call to source : | +| semantics.rb:213:5:213:5 | d : | semmle.label | d : | +| semantics.rb:213:5:213:5 | d : | semmle.label | d : | | semantics.rb:213:9:213:18 | call to source : | semmle.label | call to source : | | semantics.rb:213:9:213:18 | call to source : | semmle.label | call to source : | | semantics.rb:217:5:217:5 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | @@ -1226,8 +1390,12 @@ nodes | semantics.rb:221:14:221:14 | h [element 2] : | semmle.label | h [element 2] : | | semantics.rb:221:14:221:14 | h [element] : | semmle.label | h [element] : | | semantics.rb:221:14:221:14 | h [element] : | semmle.label | h [element] : | +| semantics.rb:225:5:225:5 | a : | semmle.label | a : | +| semantics.rb:225:5:225:5 | a : | semmle.label | a : | | semantics.rb:225:9:225:18 | call to source : | semmle.label | call to source : | | semantics.rb:225:9:225:18 | call to source : | semmle.label | call to source : | +| semantics.rb:226:5:226:5 | x [element] : | semmle.label | x [element] : | +| semantics.rb:226:5:226:5 | x [element] : | semmle.label | x [element] : | | semantics.rb:226:9:226:14 | call to s28 [element] : | semmle.label | call to s28 [element] : | | semantics.rb:226:9:226:14 | call to s28 [element] : | semmle.label | call to s28 [element] : | | semantics.rb:226:13:226:13 | a : | semmle.label | a : | @@ -1248,8 +1416,12 @@ nodes | semantics.rb:230:10:230:10 | x [element] : | semmle.label | x [element] : | | semantics.rb:230:10:230:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:230:10:230:13 | ...[...] | semmle.label | ...[...] | +| semantics.rb:235:5:235:5 | b : | semmle.label | b : | +| semantics.rb:235:5:235:5 | b : | semmle.label | b : | | semantics.rb:235:9:235:18 | call to source : | semmle.label | call to source : | | semantics.rb:235:9:235:18 | call to source : | semmle.label | call to source : | +| semantics.rb:236:5:236:5 | c : | semmle.label | c : | +| semantics.rb:236:5:236:5 | c : | semmle.label | c : | | semantics.rb:236:9:236:18 | call to source : | semmle.label | call to source : | | semantics.rb:236:9:236:18 | call to source : | semmle.label | call to source : | | semantics.rb:240:5:240:5 | [post] h [element 1] : | semmle.label | [post] h [element 1] : | @@ -1266,8 +1438,12 @@ nodes | semantics.rb:244:14:244:14 | h [element 1] : | semmle.label | h [element 1] : | | semantics.rb:244:14:244:14 | h [element 2] : | semmle.label | h [element 2] : | | semantics.rb:244:14:244:14 | h [element 2] : | semmle.label | h [element 2] : | +| semantics.rb:248:5:248:5 | a : | semmle.label | a : | +| semantics.rb:248:5:248:5 | a : | semmle.label | a : | | semantics.rb:248:9:248:18 | call to source : | semmle.label | call to source : | | semantics.rb:248:9:248:18 | call to source : | semmle.label | call to source : | +| semantics.rb:249:5:249:5 | x [element] : | semmle.label | x [element] : | +| semantics.rb:249:5:249:5 | x [element] : | semmle.label | x [element] : | | semantics.rb:249:9:249:14 | call to s30 [element] : | semmle.label | call to s30 [element] : | | semantics.rb:249:9:249:14 | call to s30 [element] : | semmle.label | call to s30 [element] : | | semantics.rb:249:13:249:13 | a : | semmle.label | a : | @@ -1382,6 +1558,8 @@ nodes | semantics.rb:285:14:285:14 | h [element true] : | semmle.label | h [element true] : | | semantics.rb:285:14:285:14 | h [element] : | semmle.label | h [element] : | | semantics.rb:285:14:285:14 | h [element] : | semmle.label | h [element] : | +| semantics.rb:289:5:289:5 | x [element :foo] : | semmle.label | x [element :foo] : | +| semantics.rb:289:5:289:5 | x [element :foo] : | semmle.label | x [element :foo] : | | semantics.rb:289:9:289:24 | call to s35 [element :foo] : | semmle.label | call to s35 [element :foo] : | | semantics.rb:289:9:289:24 | call to s35 [element :foo] : | semmle.label | call to s35 [element :foo] : | | semantics.rb:289:13:289:23 | call to source : | semmle.label | call to source : | @@ -1394,6 +1572,8 @@ nodes | semantics.rb:292:10:292:10 | x [element :foo] : | semmle.label | x [element :foo] : | | semantics.rb:292:10:292:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:292:10:292:13 | ...[...] | semmle.label | ...[...] | +| semantics.rb:296:5:296:5 | x [element foo] : | semmle.label | x [element foo] : | +| semantics.rb:296:5:296:5 | x [element foo] : | semmle.label | x [element foo] : | | semantics.rb:296:9:296:24 | call to s36 [element foo] : | semmle.label | call to s36 [element foo] : | | semantics.rb:296:9:296:24 | call to s36 [element foo] : | semmle.label | call to s36 [element foo] : | | semantics.rb:296:13:296:23 | call to source : | semmle.label | call to source : | @@ -1406,6 +1586,8 @@ nodes | semantics.rb:300:10:300:10 | x [element foo] : | semmle.label | x [element foo] : | | semantics.rb:300:10:300:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:300:10:300:13 | ...[...] | semmle.label | ...[...] | +| semantics.rb:304:5:304:5 | x [element true] : | semmle.label | x [element true] : | +| semantics.rb:304:5:304:5 | x [element true] : | semmle.label | x [element true] : | | semantics.rb:304:9:304:24 | call to s37 [element true] : | semmle.label | call to s37 [element true] : | | semantics.rb:304:9:304:24 | call to s37 [element true] : | semmle.label | call to s37 [element true] : | | semantics.rb:304:13:304:23 | call to source : | semmle.label | call to source : | @@ -1426,6 +1608,8 @@ nodes | semantics.rb:315:10:315:15 | call to s38 | semmle.label | call to s38 | | semantics.rb:315:14:315:14 | h [element foo] : | semmle.label | h [element foo] : | | semantics.rb:315:14:315:14 | h [element foo] : | semmle.label | h [element foo] : | +| semantics.rb:319:5:319:5 | x [element :foo] : | semmle.label | x [element :foo] : | +| semantics.rb:319:5:319:5 | x [element :foo] : | semmle.label | x [element :foo] : | | semantics.rb:319:9:319:24 | call to s39 [element :foo] : | semmle.label | call to s39 [element :foo] : | | semantics.rb:319:9:319:24 | call to s39 [element :foo] : | semmle.label | call to s39 [element :foo] : | | semantics.rb:319:13:319:23 | call to source : | semmle.label | call to source : | @@ -1446,6 +1630,8 @@ nodes | semantics.rb:329:10:329:15 | call to s40 | semmle.label | call to s40 | | semantics.rb:329:14:329:14 | x [@foo] : | semmle.label | x [@foo] : | | semantics.rb:329:14:329:14 | x [@foo] : | semmle.label | x [@foo] : | +| semantics.rb:333:5:333:5 | x [@foo] : | semmle.label | x [@foo] : | +| semantics.rb:333:5:333:5 | x [@foo] : | semmle.label | x [@foo] : | | semantics.rb:333:9:333:24 | call to s41 [@foo] : | semmle.label | call to s41 [@foo] : | | semantics.rb:333:9:333:24 | call to s41 [@foo] : | semmle.label | call to s41 [@foo] : | | semantics.rb:333:13:333:23 | call to source : | semmle.label | call to source : | @@ -1462,6 +1648,10 @@ nodes | semantics.rb:340:5:340:5 | [post] h [element] : | semmle.label | [post] h [element] : | | semantics.rb:340:12:340:22 | call to source : | semmle.label | call to source : | | semantics.rb:340:12:340:22 | call to source : | semmle.label | call to source : | +| semantics.rb:342:5:342:5 | x [element 0] : | semmle.label | x [element 0] : | +| semantics.rb:342:5:342:5 | x [element 0] : | semmle.label | x [element 0] : | +| semantics.rb:342:5:342:5 | x [element] : | semmle.label | x [element] : | +| semantics.rb:342:5:342:5 | x [element] : | semmle.label | x [element] : | | semantics.rb:342:9:342:14 | call to s42 [element 0] : | semmle.label | call to s42 [element 0] : | | semantics.rb:342:9:342:14 | call to s42 [element 0] : | semmle.label | call to s42 [element 0] : | | semantics.rb:342:9:342:14 | call to s42 [element] : | semmle.label | call to s42 [element] : | @@ -1490,6 +1680,8 @@ nodes | semantics.rb:350:5:350:5 | [post] h [element 0] : | semmle.label | [post] h [element 0] : | | semantics.rb:350:12:350:22 | call to source : | semmle.label | call to source : | | semantics.rb:350:12:350:22 | call to source : | semmle.label | call to source : | +| semantics.rb:353:5:353:5 | x [element 0] : | semmle.label | x [element 0] : | +| semantics.rb:353:5:353:5 | x [element 0] : | semmle.label | x [element 0] : | | semantics.rb:353:9:353:14 | call to s43 [element 0] : | semmle.label | call to s43 [element 0] : | | semantics.rb:353:9:353:14 | call to s43 [element 0] : | semmle.label | call to s43 [element 0] : | | semantics.rb:353:13:353:13 | h [element 0] : | semmle.label | h [element 0] : | @@ -1614,6 +1806,8 @@ nodes | semantics.rb:395:10:395:10 | h [element] : | semmle.label | h [element] : | | semantics.rb:395:10:395:13 | ...[...] | semmle.label | ...[...] | | semantics.rb:395:10:395:13 | ...[...] | semmle.label | ...[...] | +| semantics.rb:397:5:397:5 | x [element 1] : | semmle.label | x [element 1] : | +| semantics.rb:397:5:397:5 | x [element 1] : | semmle.label | x [element 1] : | | semantics.rb:397:9:397:14 | call to s46 [element 1] : | semmle.label | call to s46 [element 1] : | | semantics.rb:397:9:397:14 | call to s46 [element 1] : | semmle.label | call to s46 [element 1] : | | semantics.rb:397:13:397:13 | h [element 1] : | semmle.label | h [element 1] : | @@ -1654,6 +1848,8 @@ nodes | semantics.rb:410:10:410:10 | h [element] : | semmle.label | h [element] : | | semantics.rb:410:10:410:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:410:10:410:16 | ...[...] | semmle.label | ...[...] | +| semantics.rb:412:5:412:5 | x [element :bar] : | semmle.label | x [element :bar] : | +| semantics.rb:412:5:412:5 | x [element :bar] : | semmle.label | x [element :bar] : | | semantics.rb:412:9:412:14 | call to s47 [element :bar] : | semmle.label | call to s47 [element :bar] : | | semantics.rb:412:9:412:14 | call to s47 [element :bar] : | semmle.label | call to s47 [element :bar] : | | semantics.rb:412:13:412:13 | h [element :bar] : | semmle.label | h [element :bar] : | @@ -1690,6 +1886,8 @@ nodes | semantics.rb:424:10:424:10 | h [element] : | semmle.label | h [element] : | | semantics.rb:424:10:424:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:424:10:424:16 | ...[...] | semmle.label | ...[...] | +| semantics.rb:426:5:426:5 | x [element :bar] : | semmle.label | x [element :bar] : | +| semantics.rb:426:5:426:5 | x [element :bar] : | semmle.label | x [element :bar] : | | semantics.rb:426:9:426:14 | call to s48 [element :bar] : | semmle.label | call to s48 [element :bar] : | | semantics.rb:426:9:426:14 | call to s48 [element :bar] : | semmle.label | call to s48 [element :bar] : | | semantics.rb:426:13:426:13 | h [element :bar] : | semmle.label | h [element :bar] : | @@ -1726,6 +1924,10 @@ nodes | semantics.rb:438:10:438:10 | h [element] : | semmle.label | h [element] : | | semantics.rb:438:10:438:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:438:10:438:16 | ...[...] | semmle.label | ...[...] | +| semantics.rb:440:5:440:5 | x [element :bar] : | semmle.label | x [element :bar] : | +| semantics.rb:440:5:440:5 | x [element :bar] : | semmle.label | x [element :bar] : | +| semantics.rb:440:5:440:5 | x [element] : | semmle.label | x [element] : | +| semantics.rb:440:5:440:5 | x [element] : | semmle.label | x [element] : | | semantics.rb:440:9:440:14 | call to s49 [element :bar] : | semmle.label | call to s49 [element :bar] : | | semantics.rb:440:9:440:14 | call to s49 [element :bar] : | semmle.label | call to s49 [element :bar] : | | semantics.rb:440:9:440:14 | call to s49 [element] : | semmle.label | call to s49 [element] : | @@ -1890,6 +2092,8 @@ nodes | semantics.rb:494:10:494:10 | h [element] : | semmle.label | h [element] : | | semantics.rb:494:10:494:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:494:10:494:16 | ...[...] | semmle.label | ...[...] | +| semantics.rb:496:5:496:5 | x [element :bar] : | semmle.label | x [element :bar] : | +| semantics.rb:496:5:496:5 | x [element :bar] : | semmle.label | x [element :bar] : | | semantics.rb:496:9:496:9 | h [element :bar] : | semmle.label | h [element :bar] : | | semantics.rb:496:9:496:9 | h [element :bar] : | semmle.label | h [element :bar] : | | semantics.rb:496:9:496:15 | call to s53 [element :bar] : | semmle.label | call to s53 [element :bar] : | @@ -1930,6 +2134,8 @@ nodes | semantics.rb:510:10:510:10 | h [element] : | semmle.label | h [element] : | | semantics.rb:510:10:510:16 | ...[...] | semmle.label | ...[...] | | semantics.rb:510:10:510:16 | ...[...] | semmle.label | ...[...] | +| semantics.rb:512:5:512:5 | x [element :bar] : | semmle.label | x [element :bar] : | +| semantics.rb:512:5:512:5 | x [element :bar] : | semmle.label | x [element :bar] : | | semantics.rb:512:9:512:9 | h [element :bar] : | semmle.label | h [element :bar] : | | semantics.rb:512:9:512:9 | h [element :bar] : | semmle.label | h [element :bar] : | | semantics.rb:512:9:512:15 | call to s54 [element :bar] : | semmle.label | call to s54 [element :bar] : | diff --git a/ruby/ql/test/library-tests/dataflow/global/Flow.expected b/ruby/ql/test/library-tests/dataflow/global/Flow.expected index a6dd85ee0a1..ef1eb189de9 100644 --- a/ruby/ql/test/library-tests/dataflow/global/Flow.expected +++ b/ruby/ql/test/library-tests/dataflow/global/Flow.expected @@ -207,8 +207,10 @@ edges | instance_variables.rb:114:6:114:10 | foo13 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | | instance_variables.rb:114:6:114:10 | foo13 [@field] : | instance_variables.rb:114:6:114:20 | call to get_field | | instance_variables.rb:114:6:114:10 | foo13 [@field] : | instance_variables.rb:114:6:114:20 | call to get_field | -| instance_variables.rb:116:9:116:26 | call to new [@field] : | instance_variables.rb:117:6:117:10 | foo15 [@field] : | -| instance_variables.rb:116:9:116:26 | call to new [@field] : | instance_variables.rb:117:6:117:10 | foo15 [@field] : | +| instance_variables.rb:116:1:116:5 | foo15 [@field] : | instance_variables.rb:117:6:117:10 | foo15 [@field] : | +| instance_variables.rb:116:1:116:5 | foo15 [@field] : | instance_variables.rb:117:6:117:10 | foo15 [@field] : | +| instance_variables.rb:116:9:116:26 | call to new [@field] : | instance_variables.rb:116:1:116:5 | foo15 [@field] : | +| instance_variables.rb:116:9:116:26 | call to new [@field] : | instance_variables.rb:116:1:116:5 | foo15 [@field] : | | instance_variables.rb:116:17:116:25 | call to taint : | instance_variables.rb:22:20:22:24 | field : | | instance_variables.rb:116:17:116:25 | call to taint : | instance_variables.rb:22:20:22:24 | field : | | instance_variables.rb:116:17:116:25 | call to taint : | instance_variables.rb:116:9:116:26 | call to new [@field] : | @@ -227,8 +229,10 @@ edges | instance_variables.rb:120:6:120:10 | foo16 [@field] : | instance_variables.rb:13:5:15:7 | self in get_field [@field] : | | instance_variables.rb:120:6:120:10 | foo16 [@field] : | instance_variables.rb:120:6:120:20 | call to get_field | | instance_variables.rb:120:6:120:10 | foo16 [@field] : | instance_variables.rb:120:6:120:20 | call to get_field | -| instance_variables.rb:121:7:121:24 | call to new : | instance_variables.rb:122:6:122:8 | bar | -| instance_variables.rb:121:7:121:24 | call to new : | instance_variables.rb:122:6:122:8 | bar | +| instance_variables.rb:121:1:121:3 | bar : | instance_variables.rb:122:6:122:8 | bar | +| instance_variables.rb:121:1:121:3 | bar : | instance_variables.rb:122:6:122:8 | bar | +| instance_variables.rb:121:7:121:24 | call to new : | instance_variables.rb:121:1:121:3 | bar : | +| instance_variables.rb:121:7:121:24 | call to new : | instance_variables.rb:121:1:121:3 | bar : | nodes | captured_variables.rb:1:24:1:24 | x : | semmle.label | x : | | captured_variables.rb:1:24:1:24 | x : | semmle.label | x : | @@ -424,6 +428,8 @@ nodes | instance_variables.rb:114:6:114:10 | foo13 [@field] : | semmle.label | foo13 [@field] : | | instance_variables.rb:114:6:114:20 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:114:6:114:20 | call to get_field | semmle.label | call to get_field | +| instance_variables.rb:116:1:116:5 | foo15 [@field] : | semmle.label | foo15 [@field] : | +| instance_variables.rb:116:1:116:5 | foo15 [@field] : | semmle.label | foo15 [@field] : | | instance_variables.rb:116:9:116:26 | call to new [@field] : | semmle.label | call to new [@field] : | | instance_variables.rb:116:9:116:26 | call to new [@field] : | semmle.label | call to new [@field] : | | instance_variables.rb:116:17:116:25 | call to taint : | semmle.label | call to taint : | @@ -442,6 +448,8 @@ nodes | instance_variables.rb:120:6:120:10 | foo16 [@field] : | semmle.label | foo16 [@field] : | | instance_variables.rb:120:6:120:20 | call to get_field | semmle.label | call to get_field | | instance_variables.rb:120:6:120:20 | call to get_field | semmle.label | call to get_field | +| instance_variables.rb:121:1:121:3 | bar : | semmle.label | bar : | +| instance_variables.rb:121:1:121:3 | bar : | semmle.label | bar : | | instance_variables.rb:121:7:121:24 | call to new : | semmle.label | call to new : | | instance_variables.rb:121:7:121:24 | call to new : | semmle.label | call to new : | | instance_variables.rb:122:6:122:8 | bar | semmle.label | bar | diff --git a/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected b/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected index 2dc14a20525..57c6d4c0627 100644 --- a/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/hash-flow/hash-flow.expected @@ -1,10 +1,15 @@ failures edges -| hash_flow.rb:11:15:11:24 | call to taint : | hash_flow.rb:22:10:22:13 | hash [element :a] : | -| hash_flow.rb:13:12:13:21 | call to taint : | hash_flow.rb:24:10:24:13 | hash [element :c] : | -| hash_flow.rb:15:14:15:23 | call to taint : | hash_flow.rb:26:10:26:13 | hash [element e] : | -| hash_flow.rb:17:16:17:25 | call to taint : | hash_flow.rb:28:10:28:13 | hash [element g] : | -| hash_flow.rb:19:14:19:23 | call to taint : | hash_flow.rb:30:10:30:13 | hash [element 0] : | +| hash_flow.rb:10:5:10:8 | hash [element 0] : | hash_flow.rb:30:10:30:13 | hash [element 0] : | +| hash_flow.rb:10:5:10:8 | hash [element :a] : | hash_flow.rb:22:10:22:13 | hash [element :a] : | +| hash_flow.rb:10:5:10:8 | hash [element :c] : | hash_flow.rb:24:10:24:13 | hash [element :c] : | +| hash_flow.rb:10:5:10:8 | hash [element e] : | hash_flow.rb:26:10:26:13 | hash [element e] : | +| hash_flow.rb:10:5:10:8 | hash [element g] : | hash_flow.rb:28:10:28:13 | hash [element g] : | +| hash_flow.rb:11:15:11:24 | call to taint : | hash_flow.rb:10:5:10:8 | hash [element :a] : | +| hash_flow.rb:13:12:13:21 | call to taint : | hash_flow.rb:10:5:10:8 | hash [element :c] : | +| hash_flow.rb:15:14:15:23 | call to taint : | hash_flow.rb:10:5:10:8 | hash [element e] : | +| hash_flow.rb:17:16:17:25 | call to taint : | hash_flow.rb:10:5:10:8 | hash [element g] : | +| hash_flow.rb:19:14:19:23 | call to taint : | hash_flow.rb:10:5:10:8 | hash [element 0] : | | hash_flow.rb:22:10:22:13 | hash [element :a] : | hash_flow.rb:22:10:22:17 | ...[...] | | hash_flow.rb:24:10:24:13 | hash [element :c] : | hash_flow.rb:24:10:24:17 | ...[...] | | hash_flow.rb:26:10:26:13 | hash [element e] : | hash_flow.rb:26:10:26:18 | ...[...] | @@ -37,161 +42,214 @@ edges | hash_flow.rb:44:10:44:13 | hash [element 0] : | hash_flow.rb:44:10:44:16 | ...[...] | | hash_flow.rb:46:10:46:13 | hash [element :a] : | hash_flow.rb:46:10:46:17 | ...[...] | | hash_flow.rb:48:10:48:13 | hash [element a] : | hash_flow.rb:48:10:48:18 | ...[...] | -| hash_flow.rb:55:13:55:37 | ...[...] [element :a] : | hash_flow.rb:56:10:56:14 | hash1 [element :a] : | +| hash_flow.rb:55:5:55:9 | hash1 [element :a] : | hash_flow.rb:56:10:56:14 | hash1 [element :a] : | +| hash_flow.rb:55:13:55:37 | ...[...] [element :a] : | hash_flow.rb:55:5:55:9 | hash1 [element :a] : | | hash_flow.rb:55:21:55:30 | call to taint : | hash_flow.rb:55:13:55:37 | ...[...] [element :a] : | | hash_flow.rb:56:10:56:14 | hash1 [element :a] : | hash_flow.rb:56:10:56:18 | ...[...] | -| hash_flow.rb:59:13:59:22 | call to taint : | hash_flow.rb:60:18:60:18 | x [element :a] : | -| hash_flow.rb:60:13:60:19 | ...[...] [element :a] : | hash_flow.rb:61:10:61:14 | hash2 [element :a] : | +| hash_flow.rb:59:5:59:5 | x [element :a] : | hash_flow.rb:60:18:60:18 | x [element :a] : | +| hash_flow.rb:59:13:59:22 | call to taint : | hash_flow.rb:59:5:59:5 | x [element :a] : | +| hash_flow.rb:60:5:60:9 | hash2 [element :a] : | hash_flow.rb:61:10:61:14 | hash2 [element :a] : | +| hash_flow.rb:60:13:60:19 | ...[...] [element :a] : | hash_flow.rb:60:5:60:9 | hash2 [element :a] : | | hash_flow.rb:60:18:60:18 | x [element :a] : | hash_flow.rb:60:13:60:19 | ...[...] [element :a] : | | hash_flow.rb:61:10:61:14 | hash2 [element :a] : | hash_flow.rb:61:10:61:18 | ...[...] | -| hash_flow.rb:64:13:64:45 | ...[...] [element] : | hash_flow.rb:65:10:65:14 | hash3 [element] : | -| hash_flow.rb:64:13:64:45 | ...[...] [element] : | hash_flow.rb:66:10:66:14 | hash3 [element] : | +| hash_flow.rb:64:5:64:9 | hash3 [element] : | hash_flow.rb:65:10:65:14 | hash3 [element] : | +| hash_flow.rb:64:5:64:9 | hash3 [element] : | hash_flow.rb:66:10:66:14 | hash3 [element] : | +| hash_flow.rb:64:13:64:45 | ...[...] [element] : | hash_flow.rb:64:5:64:9 | hash3 [element] : | | hash_flow.rb:64:24:64:33 | call to taint : | hash_flow.rb:64:13:64:45 | ...[...] [element] : | | hash_flow.rb:65:10:65:14 | hash3 [element] : | hash_flow.rb:65:10:65:18 | ...[...] | | hash_flow.rb:66:10:66:14 | hash3 [element] : | hash_flow.rb:66:10:66:18 | ...[...] | -| hash_flow.rb:68:13:68:39 | ...[...] [element :a] : | hash_flow.rb:69:10:69:14 | hash4 [element :a] : | +| hash_flow.rb:68:5:68:9 | hash4 [element :a] : | hash_flow.rb:69:10:69:14 | hash4 [element :a] : | +| hash_flow.rb:68:13:68:39 | ...[...] [element :a] : | hash_flow.rb:68:5:68:9 | hash4 [element :a] : | | hash_flow.rb:68:22:68:31 | call to taint : | hash_flow.rb:68:13:68:39 | ...[...] [element :a] : | | hash_flow.rb:69:10:69:14 | hash4 [element :a] : | hash_flow.rb:69:10:69:18 | ...[...] | -| hash_flow.rb:72:13:72:45 | ...[...] [element a] : | hash_flow.rb:73:10:73:14 | hash5 [element a] : | +| hash_flow.rb:72:5:72:9 | hash5 [element a] : | hash_flow.rb:73:10:73:14 | hash5 [element a] : | +| hash_flow.rb:72:13:72:45 | ...[...] [element a] : | hash_flow.rb:72:5:72:9 | hash5 [element a] : | | hash_flow.rb:72:25:72:34 | call to taint : | hash_flow.rb:72:13:72:45 | ...[...] [element a] : | | hash_flow.rb:73:10:73:14 | hash5 [element a] : | hash_flow.rb:73:10:73:19 | ...[...] | -| hash_flow.rb:76:13:76:47 | ...[...] [element a] : | hash_flow.rb:77:10:77:14 | hash6 [element a] : | +| hash_flow.rb:76:5:76:9 | hash6 [element a] : | hash_flow.rb:77:10:77:14 | hash6 [element a] : | +| hash_flow.rb:76:13:76:47 | ...[...] [element a] : | hash_flow.rb:76:5:76:9 | hash6 [element a] : | | hash_flow.rb:76:26:76:35 | call to taint : | hash_flow.rb:76:13:76:47 | ...[...] [element a] : | | hash_flow.rb:77:10:77:14 | hash6 [element a] : | hash_flow.rb:77:10:77:19 | ...[...] | -| hash_flow.rb:84:13:84:42 | call to [] [element :a] : | hash_flow.rb:85:10:85:14 | hash1 [element :a] : | +| hash_flow.rb:84:5:84:9 | hash1 [element :a] : | hash_flow.rb:85:10:85:14 | hash1 [element :a] : | +| hash_flow.rb:84:13:84:42 | call to [] [element :a] : | hash_flow.rb:84:5:84:9 | hash1 [element :a] : | | hash_flow.rb:84:26:84:35 | call to taint : | hash_flow.rb:84:13:84:42 | call to [] [element :a] : | | hash_flow.rb:85:10:85:14 | hash1 [element :a] : | hash_flow.rb:85:10:85:18 | ...[...] | -| hash_flow.rb:93:15:93:24 | call to taint : | hash_flow.rb:96:30:96:33 | hash [element :a] : | -| hash_flow.rb:96:13:96:34 | call to try_convert [element :a] : | hash_flow.rb:97:10:97:14 | hash2 [element :a] : | +| hash_flow.rb:92:5:92:8 | hash [element :a] : | hash_flow.rb:96:30:96:33 | hash [element :a] : | +| hash_flow.rb:93:15:93:24 | call to taint : | hash_flow.rb:92:5:92:8 | hash [element :a] : | +| hash_flow.rb:96:5:96:9 | hash2 [element :a] : | hash_flow.rb:97:10:97:14 | hash2 [element :a] : | +| hash_flow.rb:96:13:96:34 | call to try_convert [element :a] : | hash_flow.rb:96:5:96:9 | hash2 [element :a] : | | hash_flow.rb:96:30:96:33 | hash [element :a] : | hash_flow.rb:96:13:96:34 | call to try_convert [element :a] : | | hash_flow.rb:97:10:97:14 | hash2 [element :a] : | hash_flow.rb:97:10:97:18 | ...[...] | -| hash_flow.rb:105:21:105:30 | call to taint : | hash_flow.rb:106:10:106:10 | b | +| hash_flow.rb:105:5:105:5 | b : | hash_flow.rb:106:10:106:10 | b | +| hash_flow.rb:105:21:105:30 | __synth__0 : | hash_flow.rb:105:5:105:5 | b : | +| hash_flow.rb:105:21:105:30 | call to taint : | hash_flow.rb:105:21:105:30 | __synth__0 : | +| hash_flow.rb:113:5:113:5 | b : | hash_flow.rb:115:10:115:10 | b | | hash_flow.rb:113:9:113:12 | [post] hash [element :a] : | hash_flow.rb:114:10:114:13 | hash [element :a] : | -| hash_flow.rb:113:9:113:34 | call to store : | hash_flow.rb:115:10:115:10 | b | +| hash_flow.rb:113:9:113:34 | call to store : | hash_flow.rb:113:5:113:5 | b : | | hash_flow.rb:113:24:113:33 | call to taint : | hash_flow.rb:113:9:113:12 | [post] hash [element :a] : | | hash_flow.rb:113:24:113:33 | call to taint : | hash_flow.rb:113:9:113:34 | call to store : | | hash_flow.rb:114:10:114:13 | hash [element :a] : | hash_flow.rb:114:10:114:17 | ...[...] | +| hash_flow.rb:118:5:118:5 | c : | hash_flow.rb:121:10:121:10 | c | | hash_flow.rb:118:9:118:12 | [post] hash [element] : | hash_flow.rb:119:10:119:13 | hash [element] : | | hash_flow.rb:118:9:118:12 | [post] hash [element] : | hash_flow.rb:120:10:120:13 | hash [element] : | -| hash_flow.rb:118:9:118:33 | call to store : | hash_flow.rb:121:10:121:10 | c | +| hash_flow.rb:118:9:118:33 | call to store : | hash_flow.rb:118:5:118:5 | c : | | hash_flow.rb:118:23:118:32 | call to taint : | hash_flow.rb:118:9:118:12 | [post] hash [element] : | | hash_flow.rb:118:23:118:32 | call to taint : | hash_flow.rb:118:9:118:33 | call to store : | | hash_flow.rb:119:10:119:13 | hash [element] : | hash_flow.rb:119:10:119:17 | ...[...] | | hash_flow.rb:120:10:120:13 | hash [element] : | hash_flow.rb:120:10:120:17 | ...[...] | -| hash_flow.rb:128:15:128:24 | call to taint : | hash_flow.rb:131:5:131:8 | hash [element :a] : | -| hash_flow.rb:128:15:128:24 | call to taint : | hash_flow.rb:134:5:134:8 | hash [element :a] : | +| hash_flow.rb:127:5:127:8 | hash [element :a] : | hash_flow.rb:131:5:131:8 | hash [element :a] : | +| hash_flow.rb:127:5:127:8 | hash [element :a] : | hash_flow.rb:134:5:134:8 | hash [element :a] : | +| hash_flow.rb:128:15:128:24 | call to taint : | hash_flow.rb:127:5:127:8 | hash [element :a] : | | hash_flow.rb:131:5:131:8 | hash [element :a] : | hash_flow.rb:131:18:131:29 | key_or_value : | | hash_flow.rb:131:18:131:29 | key_or_value : | hash_flow.rb:132:14:132:25 | key_or_value | | hash_flow.rb:134:5:134:8 | hash [element :a] : | hash_flow.rb:134:22:134:26 | value : | | hash_flow.rb:134:22:134:26 | value : | hash_flow.rb:136:14:136:18 | value | -| hash_flow.rb:144:15:144:25 | call to taint : | hash_flow.rb:147:9:147:12 | hash [element :a] : | -| hash_flow.rb:144:15:144:25 | call to taint : | hash_flow.rb:151:9:151:12 | hash [element :a] : | +| hash_flow.rb:143:5:143:8 | hash [element :a] : | hash_flow.rb:147:9:147:12 | hash [element :a] : | +| hash_flow.rb:143:5:143:8 | hash [element :a] : | hash_flow.rb:151:9:151:12 | hash [element :a] : | +| hash_flow.rb:144:15:144:25 | call to taint : | hash_flow.rb:143:5:143:8 | hash [element :a] : | +| hash_flow.rb:147:5:147:5 | b [element 1] : | hash_flow.rb:149:10:149:10 | b [element 1] : | +| hash_flow.rb:147:5:147:5 | b [element 1] : | hash_flow.rb:150:10:150:10 | b [element 1] : | | hash_flow.rb:147:9:147:12 | hash [element :a] : | hash_flow.rb:147:9:147:22 | call to assoc [element 1] : | -| hash_flow.rb:147:9:147:22 | call to assoc [element 1] : | hash_flow.rb:149:10:149:10 | b [element 1] : | -| hash_flow.rb:147:9:147:22 | call to assoc [element 1] : | hash_flow.rb:150:10:150:10 | b [element 1] : | +| hash_flow.rb:147:9:147:22 | call to assoc [element 1] : | hash_flow.rb:147:5:147:5 | b [element 1] : | | hash_flow.rb:149:10:149:10 | b [element 1] : | hash_flow.rb:149:10:149:13 | ...[...] | | hash_flow.rb:150:10:150:10 | b [element 1] : | hash_flow.rb:150:10:150:13 | ...[...] | +| hash_flow.rb:151:5:151:5 | c [element 1] : | hash_flow.rb:152:10:152:10 | c [element 1] : | | hash_flow.rb:151:9:151:12 | hash [element :a] : | hash_flow.rb:151:9:151:21 | call to assoc [element 1] : | -| hash_flow.rb:151:9:151:21 | call to assoc [element 1] : | hash_flow.rb:152:10:152:10 | c [element 1] : | +| hash_flow.rb:151:9:151:21 | call to assoc [element 1] : | hash_flow.rb:151:5:151:5 | c [element 1] : | | hash_flow.rb:152:10:152:10 | c [element 1] : | hash_flow.rb:152:10:152:13 | ...[...] | -| hash_flow.rb:170:15:170:25 | call to taint : | hash_flow.rb:173:9:173:12 | hash [element :a] : | +| hash_flow.rb:169:5:169:8 | hash [element :a] : | hash_flow.rb:173:9:173:12 | hash [element :a] : | +| hash_flow.rb:170:15:170:25 | call to taint : | hash_flow.rb:169:5:169:8 | hash [element :a] : | +| hash_flow.rb:173:5:173:5 | a [element :a] : | hash_flow.rb:174:10:174:10 | a [element :a] : | | hash_flow.rb:173:9:173:12 | hash [element :a] : | hash_flow.rb:173:9:173:20 | call to compact [element :a] : | -| hash_flow.rb:173:9:173:20 | call to compact [element :a] : | hash_flow.rb:174:10:174:10 | a [element :a] : | +| hash_flow.rb:173:9:173:20 | call to compact [element :a] : | hash_flow.rb:173:5:173:5 | a [element :a] : | | hash_flow.rb:174:10:174:10 | a [element :a] : | hash_flow.rb:174:10:174:14 | ...[...] | -| hash_flow.rb:182:15:182:25 | call to taint : | hash_flow.rb:185:9:185:12 | hash [element :a] : | +| hash_flow.rb:181:5:181:8 | hash [element :a] : | hash_flow.rb:185:9:185:12 | hash [element :a] : | +| hash_flow.rb:182:15:182:25 | call to taint : | hash_flow.rb:181:5:181:8 | hash [element :a] : | +| hash_flow.rb:185:5:185:5 | a : | hash_flow.rb:186:10:186:10 | a | | hash_flow.rb:185:9:185:12 | hash [element :a] : | hash_flow.rb:185:9:185:23 | call to delete : | -| hash_flow.rb:185:9:185:23 | call to delete : | hash_flow.rb:186:10:186:10 | a | -| hash_flow.rb:194:15:194:25 | call to taint : | hash_flow.rb:197:9:197:12 | hash [element :a] : | +| hash_flow.rb:185:9:185:23 | call to delete : | hash_flow.rb:185:5:185:5 | a : | +| hash_flow.rb:193:5:193:8 | hash [element :a] : | hash_flow.rb:197:9:197:12 | hash [element :a] : | +| hash_flow.rb:194:15:194:25 | call to taint : | hash_flow.rb:193:5:193:8 | hash [element :a] : | +| hash_flow.rb:197:5:197:5 | a [element :a] : | hash_flow.rb:201:10:201:10 | a [element :a] : | | hash_flow.rb:197:9:197:12 | [post] hash [element :a] : | hash_flow.rb:202:10:202:13 | hash [element :a] : | | hash_flow.rb:197:9:197:12 | hash [element :a] : | hash_flow.rb:197:9:197:12 | [post] hash [element :a] : | | hash_flow.rb:197:9:197:12 | hash [element :a] : | hash_flow.rb:197:9:200:7 | call to delete_if [element :a] : | | hash_flow.rb:197:9:197:12 | hash [element :a] : | hash_flow.rb:197:33:197:37 | value : | -| hash_flow.rb:197:9:200:7 | call to delete_if [element :a] : | hash_flow.rb:201:10:201:10 | a [element :a] : | +| hash_flow.rb:197:9:200:7 | call to delete_if [element :a] : | hash_flow.rb:197:5:197:5 | a [element :a] : | | hash_flow.rb:197:33:197:37 | value : | hash_flow.rb:199:14:199:18 | value | | hash_flow.rb:201:10:201:10 | a [element :a] : | hash_flow.rb:201:10:201:14 | ...[...] | | hash_flow.rb:202:10:202:13 | hash [element :a] : | hash_flow.rb:202:10:202:17 | ...[...] | -| hash_flow.rb:210:15:210:25 | call to taint : | hash_flow.rb:217:10:217:13 | hash [element :a] : | -| hash_flow.rb:213:19:213:29 | call to taint : | hash_flow.rb:219:10:219:13 | hash [element :c, element :d] : | +| hash_flow.rb:209:5:209:8 | hash [element :a] : | hash_flow.rb:217:10:217:13 | hash [element :a] : | +| hash_flow.rb:209:5:209:8 | hash [element :c, element :d] : | hash_flow.rb:219:10:219:13 | hash [element :c, element :d] : | +| hash_flow.rb:210:15:210:25 | call to taint : | hash_flow.rb:209:5:209:8 | hash [element :a] : | +| hash_flow.rb:213:19:213:29 | call to taint : | hash_flow.rb:209:5:209:8 | hash [element :c, element :d] : | | hash_flow.rb:217:10:217:13 | hash [element :a] : | hash_flow.rb:217:10:217:21 | call to dig | | hash_flow.rb:219:10:219:13 | hash [element :c, element :d] : | hash_flow.rb:219:10:219:24 | call to dig | -| hash_flow.rb:227:15:227:25 | call to taint : | hash_flow.rb:230:9:230:12 | hash [element :a] : | +| hash_flow.rb:226:5:226:8 | hash [element :a] : | hash_flow.rb:230:9:230:12 | hash [element :a] : | +| hash_flow.rb:227:15:227:25 | call to taint : | hash_flow.rb:226:5:226:8 | hash [element :a] : | +| hash_flow.rb:230:5:230:5 | x [element :a] : | hash_flow.rb:234:10:234:10 | x [element :a] : | | hash_flow.rb:230:9:230:12 | hash [element :a] : | hash_flow.rb:230:9:233:7 | call to each [element :a] : | | hash_flow.rb:230:9:230:12 | hash [element :a] : | hash_flow.rb:230:28:230:32 | value : | -| hash_flow.rb:230:9:233:7 | call to each [element :a] : | hash_flow.rb:234:10:234:10 | x [element :a] : | +| hash_flow.rb:230:9:233:7 | call to each [element :a] : | hash_flow.rb:230:5:230:5 | x [element :a] : | | hash_flow.rb:230:28:230:32 | value : | hash_flow.rb:232:14:232:18 | value | | hash_flow.rb:234:10:234:10 | x [element :a] : | hash_flow.rb:234:10:234:14 | ...[...] | -| hash_flow.rb:242:15:242:25 | call to taint : | hash_flow.rb:245:9:245:12 | hash [element :a] : | +| hash_flow.rb:241:5:241:8 | hash [element :a] : | hash_flow.rb:245:9:245:12 | hash [element :a] : | +| hash_flow.rb:242:15:242:25 | call to taint : | hash_flow.rb:241:5:241:8 | hash [element :a] : | +| hash_flow.rb:245:5:245:5 | x [element :a] : | hash_flow.rb:248:10:248:10 | x [element :a] : | | hash_flow.rb:245:9:245:12 | hash [element :a] : | hash_flow.rb:245:9:247:7 | call to each_key [element :a] : | -| hash_flow.rb:245:9:247:7 | call to each_key [element :a] : | hash_flow.rb:248:10:248:10 | x [element :a] : | +| hash_flow.rb:245:9:247:7 | call to each_key [element :a] : | hash_flow.rb:245:5:245:5 | x [element :a] : | | hash_flow.rb:248:10:248:10 | x [element :a] : | hash_flow.rb:248:10:248:14 | ...[...] | -| hash_flow.rb:256:15:256:25 | call to taint : | hash_flow.rb:259:9:259:12 | hash [element :a] : | +| hash_flow.rb:255:5:255:8 | hash [element :a] : | hash_flow.rb:259:9:259:12 | hash [element :a] : | +| hash_flow.rb:256:15:256:25 | call to taint : | hash_flow.rb:255:5:255:8 | hash [element :a] : | +| hash_flow.rb:259:5:259:5 | x [element :a] : | hash_flow.rb:263:10:263:10 | x [element :a] : | | hash_flow.rb:259:9:259:12 | hash [element :a] : | hash_flow.rb:259:9:262:7 | call to each_pair [element :a] : | | hash_flow.rb:259:9:259:12 | hash [element :a] : | hash_flow.rb:259:33:259:37 | value : | -| hash_flow.rb:259:9:262:7 | call to each_pair [element :a] : | hash_flow.rb:263:10:263:10 | x [element :a] : | +| hash_flow.rb:259:9:262:7 | call to each_pair [element :a] : | hash_flow.rb:259:5:259:5 | x [element :a] : | | hash_flow.rb:259:33:259:37 | value : | hash_flow.rb:261:14:261:18 | value | | hash_flow.rb:263:10:263:10 | x [element :a] : | hash_flow.rb:263:10:263:14 | ...[...] | -| hash_flow.rb:271:15:271:25 | call to taint : | hash_flow.rb:274:9:274:12 | hash [element :a] : | +| hash_flow.rb:270:5:270:8 | hash [element :a] : | hash_flow.rb:274:9:274:12 | hash [element :a] : | +| hash_flow.rb:271:15:271:25 | call to taint : | hash_flow.rb:270:5:270:8 | hash [element :a] : | +| hash_flow.rb:274:5:274:5 | x [element :a] : | hash_flow.rb:277:10:277:10 | x [element :a] : | | hash_flow.rb:274:9:274:12 | hash [element :a] : | hash_flow.rb:274:9:276:7 | call to each_value [element :a] : | | hash_flow.rb:274:9:274:12 | hash [element :a] : | hash_flow.rb:274:29:274:33 | value : | -| hash_flow.rb:274:9:276:7 | call to each_value [element :a] : | hash_flow.rb:277:10:277:10 | x [element :a] : | +| hash_flow.rb:274:9:276:7 | call to each_value [element :a] : | hash_flow.rb:274:5:274:5 | x [element :a] : | | hash_flow.rb:274:29:274:33 | value : | hash_flow.rb:275:14:275:18 | value | | hash_flow.rb:277:10:277:10 | x [element :a] : | hash_flow.rb:277:10:277:14 | ...[...] | -| hash_flow.rb:287:15:287:25 | call to taint : | hash_flow.rb:290:9:290:12 | hash [element :c] : | +| hash_flow.rb:284:5:284:8 | hash [element :c] : | hash_flow.rb:290:9:290:12 | hash [element :c] : | +| hash_flow.rb:287:15:287:25 | call to taint : | hash_flow.rb:284:5:284:8 | hash [element :c] : | +| hash_flow.rb:290:5:290:5 | x [element :c] : | hash_flow.rb:293:10:293:10 | x [element :c] : | | hash_flow.rb:290:9:290:12 | hash [element :c] : | hash_flow.rb:290:9:290:28 | call to except [element :c] : | -| hash_flow.rb:290:9:290:28 | call to except [element :c] : | hash_flow.rb:293:10:293:10 | x [element :c] : | +| hash_flow.rb:290:9:290:28 | call to except [element :c] : | hash_flow.rb:290:5:290:5 | x [element :c] : | | hash_flow.rb:293:10:293:10 | x [element :c] : | hash_flow.rb:293:10:293:14 | ...[...] | -| hash_flow.rb:301:15:301:25 | call to taint : | hash_flow.rb:305:9:305:12 | hash [element :a] : | -| hash_flow.rb:301:15:301:25 | call to taint : | hash_flow.rb:309:9:309:12 | hash [element :a] : | -| hash_flow.rb:301:15:301:25 | call to taint : | hash_flow.rb:311:9:311:12 | hash [element :a] : | -| hash_flow.rb:301:15:301:25 | call to taint : | hash_flow.rb:315:9:315:12 | hash [element :a] : | -| hash_flow.rb:303:15:303:25 | call to taint : | hash_flow.rb:305:9:305:12 | hash [element :c] : | -| hash_flow.rb:303:15:303:25 | call to taint : | hash_flow.rb:315:9:315:12 | hash [element :c] : | +| hash_flow.rb:300:5:300:8 | hash [element :a] : | hash_flow.rb:305:9:305:12 | hash [element :a] : | +| hash_flow.rb:300:5:300:8 | hash [element :a] : | hash_flow.rb:309:9:309:12 | hash [element :a] : | +| hash_flow.rb:300:5:300:8 | hash [element :a] : | hash_flow.rb:311:9:311:12 | hash [element :a] : | +| hash_flow.rb:300:5:300:8 | hash [element :a] : | hash_flow.rb:315:9:315:12 | hash [element :a] : | +| hash_flow.rb:300:5:300:8 | hash [element :c] : | hash_flow.rb:305:9:305:12 | hash [element :c] : | +| hash_flow.rb:300:5:300:8 | hash [element :c] : | hash_flow.rb:315:9:315:12 | hash [element :c] : | +| hash_flow.rb:301:15:301:25 | call to taint : | hash_flow.rb:300:5:300:8 | hash [element :a] : | +| hash_flow.rb:303:15:303:25 | call to taint : | hash_flow.rb:300:5:300:8 | hash [element :c] : | +| hash_flow.rb:305:5:305:5 | b : | hash_flow.rb:308:10:308:10 | b | | hash_flow.rb:305:9:305:12 | hash [element :a] : | hash_flow.rb:305:9:307:7 | call to fetch : | | hash_flow.rb:305:9:305:12 | hash [element :c] : | hash_flow.rb:305:9:307:7 | call to fetch : | -| hash_flow.rb:305:9:307:7 | call to fetch : | hash_flow.rb:308:10:308:10 | b | +| hash_flow.rb:305:9:307:7 | call to fetch : | hash_flow.rb:305:5:305:5 | b : | | hash_flow.rb:305:20:305:30 | call to taint : | hash_flow.rb:305:37:305:37 | x : | | hash_flow.rb:305:37:305:37 | x : | hash_flow.rb:306:14:306:14 | x | +| hash_flow.rb:309:5:309:5 | b : | hash_flow.rb:310:10:310:10 | b | | hash_flow.rb:309:9:309:12 | hash [element :a] : | hash_flow.rb:309:9:309:22 | call to fetch : | -| hash_flow.rb:309:9:309:22 | call to fetch : | hash_flow.rb:310:10:310:10 | b | +| hash_flow.rb:309:9:309:22 | call to fetch : | hash_flow.rb:309:5:309:5 | b : | +| hash_flow.rb:311:5:311:5 | b : | hash_flow.rb:312:10:312:10 | b | | hash_flow.rb:311:9:311:12 | hash [element :a] : | hash_flow.rb:311:9:311:35 | call to fetch : | -| hash_flow.rb:311:9:311:35 | call to fetch : | hash_flow.rb:312:10:312:10 | b | +| hash_flow.rb:311:9:311:35 | call to fetch : | hash_flow.rb:311:5:311:5 | b : | | hash_flow.rb:311:24:311:34 | call to taint : | hash_flow.rb:311:9:311:35 | call to fetch : | -| hash_flow.rb:313:9:313:35 | call to fetch : | hash_flow.rb:314:10:314:10 | b | +| hash_flow.rb:313:5:313:5 | b : | hash_flow.rb:314:10:314:10 | b | +| hash_flow.rb:313:9:313:35 | call to fetch : | hash_flow.rb:313:5:313:5 | b : | | hash_flow.rb:313:24:313:34 | call to taint : | hash_flow.rb:313:9:313:35 | call to fetch : | +| hash_flow.rb:315:5:315:5 | b : | hash_flow.rb:316:10:316:10 | b | | hash_flow.rb:315:9:315:12 | hash [element :a] : | hash_flow.rb:315:9:315:34 | call to fetch : | | hash_flow.rb:315:9:315:12 | hash [element :c] : | hash_flow.rb:315:9:315:34 | call to fetch : | -| hash_flow.rb:315:9:315:34 | call to fetch : | hash_flow.rb:316:10:316:10 | b | +| hash_flow.rb:315:9:315:34 | call to fetch : | hash_flow.rb:315:5:315:5 | b : | | hash_flow.rb:315:23:315:33 | call to taint : | hash_flow.rb:315:9:315:34 | call to fetch : | -| hash_flow.rb:323:15:323:25 | call to taint : | hash_flow.rb:327:9:327:12 | hash [element :a] : | -| hash_flow.rb:323:15:323:25 | call to taint : | hash_flow.rb:332:9:332:12 | hash [element :a] : | -| hash_flow.rb:323:15:323:25 | call to taint : | hash_flow.rb:334:9:334:12 | hash [element :a] : | -| hash_flow.rb:325:15:325:25 | call to taint : | hash_flow.rb:327:9:327:12 | hash [element :c] : | -| hash_flow.rb:325:15:325:25 | call to taint : | hash_flow.rb:334:9:334:12 | hash [element :c] : | +| hash_flow.rb:322:5:322:8 | hash [element :a] : | hash_flow.rb:327:9:327:12 | hash [element :a] : | +| hash_flow.rb:322:5:322:8 | hash [element :a] : | hash_flow.rb:332:9:332:12 | hash [element :a] : | +| hash_flow.rb:322:5:322:8 | hash [element :a] : | hash_flow.rb:334:9:334:12 | hash [element :a] : | +| hash_flow.rb:322:5:322:8 | hash [element :c] : | hash_flow.rb:327:9:327:12 | hash [element :c] : | +| hash_flow.rb:322:5:322:8 | hash [element :c] : | hash_flow.rb:334:9:334:12 | hash [element :c] : | +| hash_flow.rb:323:15:323:25 | call to taint : | hash_flow.rb:322:5:322:8 | hash [element :a] : | +| hash_flow.rb:325:15:325:25 | call to taint : | hash_flow.rb:322:5:322:8 | hash [element :c] : | +| hash_flow.rb:327:5:327:5 | b [element] : | hash_flow.rb:331:10:331:10 | b [element] : | | hash_flow.rb:327:9:327:12 | hash [element :a] : | hash_flow.rb:327:9:330:7 | call to fetch_values [element] : | | hash_flow.rb:327:9:327:12 | hash [element :c] : | hash_flow.rb:327:9:330:7 | call to fetch_values [element] : | -| hash_flow.rb:327:9:330:7 | call to fetch_values [element] : | hash_flow.rb:331:10:331:10 | b [element] : | +| hash_flow.rb:327:9:330:7 | call to fetch_values [element] : | hash_flow.rb:327:5:327:5 | b [element] : | | hash_flow.rb:327:27:327:37 | call to taint : | hash_flow.rb:327:44:327:44 | x : | | hash_flow.rb:327:44:327:44 | x : | hash_flow.rb:328:14:328:14 | x | | hash_flow.rb:329:9:329:19 | call to taint : | hash_flow.rb:327:9:330:7 | call to fetch_values [element] : | | hash_flow.rb:331:10:331:10 | b [element] : | hash_flow.rb:331:10:331:13 | ...[...] | +| hash_flow.rb:332:5:332:5 | b [element] : | hash_flow.rb:333:10:333:10 | b [element] : | | hash_flow.rb:332:9:332:12 | hash [element :a] : | hash_flow.rb:332:9:332:29 | call to fetch_values [element] : | -| hash_flow.rb:332:9:332:29 | call to fetch_values [element] : | hash_flow.rb:333:10:333:10 | b [element] : | +| hash_flow.rb:332:9:332:29 | call to fetch_values [element] : | hash_flow.rb:332:5:332:5 | b [element] : | | hash_flow.rb:333:10:333:10 | b [element] : | hash_flow.rb:333:10:333:13 | ...[...] | +| hash_flow.rb:334:5:334:5 | b [element] : | hash_flow.rb:335:10:335:10 | b [element] : | | hash_flow.rb:334:9:334:12 | hash [element :a] : | hash_flow.rb:334:9:334:31 | call to fetch_values [element] : | | hash_flow.rb:334:9:334:12 | hash [element :c] : | hash_flow.rb:334:9:334:31 | call to fetch_values [element] : | -| hash_flow.rb:334:9:334:31 | call to fetch_values [element] : | hash_flow.rb:335:10:335:10 | b [element] : | +| hash_flow.rb:334:9:334:31 | call to fetch_values [element] : | hash_flow.rb:334:5:334:5 | b [element] : | | hash_flow.rb:335:10:335:10 | b [element] : | hash_flow.rb:335:10:335:13 | ...[...] | -| hash_flow.rb:342:15:342:25 | call to taint : | hash_flow.rb:346:9:346:12 | hash [element :a] : | -| hash_flow.rb:344:15:344:25 | call to taint : | hash_flow.rb:346:9:346:12 | hash [element :c] : | +| hash_flow.rb:341:5:341:8 | hash [element :a] : | hash_flow.rb:346:9:346:12 | hash [element :a] : | +| hash_flow.rb:341:5:341:8 | hash [element :c] : | hash_flow.rb:346:9:346:12 | hash [element :c] : | +| hash_flow.rb:342:15:342:25 | call to taint : | hash_flow.rb:341:5:341:8 | hash [element :a] : | +| hash_flow.rb:344:15:344:25 | call to taint : | hash_flow.rb:341:5:341:8 | hash [element :c] : | +| hash_flow.rb:346:5:346:5 | b [element :a] : | hash_flow.rb:351:11:351:11 | b [element :a] : | | hash_flow.rb:346:9:346:12 | hash [element :a] : | hash_flow.rb:346:9:350:7 | call to filter [element :a] : | | hash_flow.rb:346:9:346:12 | hash [element :a] : | hash_flow.rb:346:30:346:34 | value : | | hash_flow.rb:346:9:346:12 | hash [element :c] : | hash_flow.rb:346:30:346:34 | value : | -| hash_flow.rb:346:9:350:7 | call to filter [element :a] : | hash_flow.rb:351:11:351:11 | b [element :a] : | +| hash_flow.rb:346:9:350:7 | call to filter [element :a] : | hash_flow.rb:346:5:346:5 | b [element :a] : | | hash_flow.rb:346:30:346:34 | value : | hash_flow.rb:348:14:348:18 | value | | hash_flow.rb:351:11:351:11 | b [element :a] : | hash_flow.rb:351:11:351:15 | ...[...] : | | hash_flow.rb:351:11:351:15 | ...[...] : | hash_flow.rb:351:10:351:16 | ( ... ) | -| hash_flow.rb:358:15:358:25 | call to taint : | hash_flow.rb:362:5:362:8 | hash [element :a] : | -| hash_flow.rb:360:15:360:25 | call to taint : | hash_flow.rb:362:5:362:8 | hash [element :c] : | +| hash_flow.rb:357:5:357:8 | hash [element :a] : | hash_flow.rb:362:5:362:8 | hash [element :a] : | +| hash_flow.rb:357:5:357:8 | hash [element :c] : | hash_flow.rb:362:5:362:8 | hash [element :c] : | +| hash_flow.rb:358:15:358:25 | call to taint : | hash_flow.rb:357:5:357:8 | hash [element :a] : | +| hash_flow.rb:360:15:360:25 | call to taint : | hash_flow.rb:357:5:357:8 | hash [element :c] : | | hash_flow.rb:362:5:362:8 | [post] hash [element :a] : | hash_flow.rb:367:11:367:14 | hash [element :a] : | | hash_flow.rb:362:5:362:8 | hash [element :a] : | hash_flow.rb:362:5:362:8 | [post] hash [element :a] : | | hash_flow.rb:362:5:362:8 | hash [element :a] : | hash_flow.rb:362:27:362:31 | value : | @@ -199,40 +257,54 @@ edges | hash_flow.rb:362:27:362:31 | value : | hash_flow.rb:364:14:364:18 | value | | hash_flow.rb:367:11:367:14 | hash [element :a] : | hash_flow.rb:367:11:367:18 | ...[...] : | | hash_flow.rb:367:11:367:18 | ...[...] : | hash_flow.rb:367:10:367:19 | ( ... ) | -| hash_flow.rb:374:15:374:25 | call to taint : | hash_flow.rb:378:9:378:12 | hash [element :a] : | -| hash_flow.rb:376:15:376:25 | call to taint : | hash_flow.rb:378:9:378:12 | hash [element :c] : | +| hash_flow.rb:373:5:373:8 | hash [element :a] : | hash_flow.rb:378:9:378:12 | hash [element :a] : | +| hash_flow.rb:373:5:373:8 | hash [element :c] : | hash_flow.rb:378:9:378:12 | hash [element :c] : | +| hash_flow.rb:374:15:374:25 | call to taint : | hash_flow.rb:373:5:373:8 | hash [element :a] : | +| hash_flow.rb:376:15:376:25 | call to taint : | hash_flow.rb:373:5:373:8 | hash [element :c] : | +| hash_flow.rb:378:5:378:5 | b [element] : | hash_flow.rb:379:11:379:11 | b [element] : | | hash_flow.rb:378:9:378:12 | hash [element :a] : | hash_flow.rb:378:9:378:20 | call to flatten [element] : | | hash_flow.rb:378:9:378:12 | hash [element :c] : | hash_flow.rb:378:9:378:20 | call to flatten [element] : | -| hash_flow.rb:378:9:378:20 | call to flatten [element] : | hash_flow.rb:379:11:379:11 | b [element] : | +| hash_flow.rb:378:9:378:20 | call to flatten [element] : | hash_flow.rb:378:5:378:5 | b [element] : | | hash_flow.rb:379:11:379:11 | b [element] : | hash_flow.rb:379:11:379:14 | ...[...] : | | hash_flow.rb:379:11:379:14 | ...[...] : | hash_flow.rb:379:10:379:15 | ( ... ) | -| hash_flow.rb:386:15:386:25 | call to taint : | hash_flow.rb:390:9:390:12 | hash [element :a] : | -| hash_flow.rb:388:15:388:25 | call to taint : | hash_flow.rb:390:9:390:12 | hash [element :c] : | +| hash_flow.rb:385:5:385:8 | hash [element :a] : | hash_flow.rb:390:9:390:12 | hash [element :a] : | +| hash_flow.rb:385:5:385:8 | hash [element :c] : | hash_flow.rb:390:9:390:12 | hash [element :c] : | +| hash_flow.rb:386:15:386:25 | call to taint : | hash_flow.rb:385:5:385:8 | hash [element :a] : | +| hash_flow.rb:388:15:388:25 | call to taint : | hash_flow.rb:385:5:385:8 | hash [element :c] : | +| hash_flow.rb:390:5:390:5 | b [element :a] : | hash_flow.rb:396:11:396:11 | b [element :a] : | | hash_flow.rb:390:9:390:12 | [post] hash [element :a] : | hash_flow.rb:395:11:395:14 | hash [element :a] : | | hash_flow.rb:390:9:390:12 | hash [element :a] : | hash_flow.rb:390:9:390:12 | [post] hash [element :a] : | | hash_flow.rb:390:9:390:12 | hash [element :a] : | hash_flow.rb:390:9:394:7 | call to keep_if [element :a] : | | hash_flow.rb:390:9:390:12 | hash [element :a] : | hash_flow.rb:390:31:390:35 | value : | | hash_flow.rb:390:9:390:12 | hash [element :c] : | hash_flow.rb:390:31:390:35 | value : | -| hash_flow.rb:390:9:394:7 | call to keep_if [element :a] : | hash_flow.rb:396:11:396:11 | b [element :a] : | +| hash_flow.rb:390:9:394:7 | call to keep_if [element :a] : | hash_flow.rb:390:5:390:5 | b [element :a] : | | hash_flow.rb:390:31:390:35 | value : | hash_flow.rb:392:14:392:18 | value | | hash_flow.rb:395:11:395:14 | hash [element :a] : | hash_flow.rb:395:11:395:18 | ...[...] : | | hash_flow.rb:395:11:395:18 | ...[...] : | hash_flow.rb:395:10:395:19 | ( ... ) | | hash_flow.rb:396:11:396:11 | b [element :a] : | hash_flow.rb:396:11:396:15 | ...[...] : | | hash_flow.rb:396:11:396:15 | ...[...] : | hash_flow.rb:396:10:396:16 | ( ... ) | -| hash_flow.rb:403:15:403:25 | call to taint : | hash_flow.rb:412:12:412:16 | hash1 [element :a] : | -| hash_flow.rb:405:15:405:25 | call to taint : | hash_flow.rb:412:12:412:16 | hash1 [element :c] : | -| hash_flow.rb:408:15:408:25 | call to taint : | hash_flow.rb:412:24:412:28 | hash2 [element :d] : | -| hash_flow.rb:410:15:410:25 | call to taint : | hash_flow.rb:412:24:412:28 | hash2 [element :f] : | +| hash_flow.rb:402:5:402:9 | hash1 [element :a] : | hash_flow.rb:412:12:412:16 | hash1 [element :a] : | +| hash_flow.rb:402:5:402:9 | hash1 [element :c] : | hash_flow.rb:412:12:412:16 | hash1 [element :c] : | +| hash_flow.rb:403:15:403:25 | call to taint : | hash_flow.rb:402:5:402:9 | hash1 [element :a] : | +| hash_flow.rb:405:15:405:25 | call to taint : | hash_flow.rb:402:5:402:9 | hash1 [element :c] : | +| hash_flow.rb:407:5:407:9 | hash2 [element :d] : | hash_flow.rb:412:24:412:28 | hash2 [element :d] : | +| hash_flow.rb:407:5:407:9 | hash2 [element :f] : | hash_flow.rb:412:24:412:28 | hash2 [element :f] : | +| hash_flow.rb:408:15:408:25 | call to taint : | hash_flow.rb:407:5:407:9 | hash2 [element :d] : | +| hash_flow.rb:410:15:410:25 | call to taint : | hash_flow.rb:407:5:407:9 | hash2 [element :f] : | +| hash_flow.rb:412:5:412:8 | hash [element :a] : | hash_flow.rb:417:11:417:14 | hash [element :a] : | +| hash_flow.rb:412:5:412:8 | hash [element :c] : | hash_flow.rb:419:11:419:14 | hash [element :c] : | +| hash_flow.rb:412:5:412:8 | hash [element :d] : | hash_flow.rb:420:11:420:14 | hash [element :d] : | +| hash_flow.rb:412:5:412:8 | hash [element :f] : | hash_flow.rb:422:11:422:14 | hash [element :f] : | | hash_flow.rb:412:12:412:16 | hash1 [element :a] : | hash_flow.rb:412:12:416:7 | call to merge [element :a] : | | hash_flow.rb:412:12:412:16 | hash1 [element :a] : | hash_flow.rb:412:40:412:48 | old_value : | | hash_flow.rb:412:12:412:16 | hash1 [element :a] : | hash_flow.rb:412:51:412:59 | new_value : | | hash_flow.rb:412:12:412:16 | hash1 [element :c] : | hash_flow.rb:412:12:416:7 | call to merge [element :c] : | | hash_flow.rb:412:12:412:16 | hash1 [element :c] : | hash_flow.rb:412:40:412:48 | old_value : | | hash_flow.rb:412:12:412:16 | hash1 [element :c] : | hash_flow.rb:412:51:412:59 | new_value : | -| hash_flow.rb:412:12:416:7 | call to merge [element :a] : | hash_flow.rb:417:11:417:14 | hash [element :a] : | -| hash_flow.rb:412:12:416:7 | call to merge [element :c] : | hash_flow.rb:419:11:419:14 | hash [element :c] : | -| hash_flow.rb:412:12:416:7 | call to merge [element :d] : | hash_flow.rb:420:11:420:14 | hash [element :d] : | -| hash_flow.rb:412:12:416:7 | call to merge [element :f] : | hash_flow.rb:422:11:422:14 | hash [element :f] : | +| hash_flow.rb:412:12:416:7 | call to merge [element :a] : | hash_flow.rb:412:5:412:8 | hash [element :a] : | +| hash_flow.rb:412:12:416:7 | call to merge [element :c] : | hash_flow.rb:412:5:412:8 | hash [element :c] : | +| hash_flow.rb:412:12:416:7 | call to merge [element :d] : | hash_flow.rb:412:5:412:8 | hash [element :d] : | +| hash_flow.rb:412:12:416:7 | call to merge [element :f] : | hash_flow.rb:412:5:412:8 | hash [element :f] : | | hash_flow.rb:412:24:412:28 | hash2 [element :d] : | hash_flow.rb:412:12:416:7 | call to merge [element :d] : | | hash_flow.rb:412:24:412:28 | hash2 [element :d] : | hash_flow.rb:412:40:412:48 | old_value : | | hash_flow.rb:412:24:412:28 | hash2 [element :d] : | hash_flow.rb:412:51:412:59 | new_value : | @@ -249,10 +321,18 @@ edges | hash_flow.rb:420:11:420:18 | ...[...] : | hash_flow.rb:420:10:420:19 | ( ... ) | | hash_flow.rb:422:11:422:14 | hash [element :f] : | hash_flow.rb:422:11:422:18 | ...[...] : | | hash_flow.rb:422:11:422:18 | ...[...] : | hash_flow.rb:422:10:422:19 | ( ... ) | -| hash_flow.rb:429:15:429:25 | call to taint : | hash_flow.rb:438:12:438:16 | hash1 [element :a] : | -| hash_flow.rb:431:15:431:25 | call to taint : | hash_flow.rb:438:12:438:16 | hash1 [element :c] : | -| hash_flow.rb:434:15:434:25 | call to taint : | hash_flow.rb:438:25:438:29 | hash2 [element :d] : | -| hash_flow.rb:436:15:436:25 | call to taint : | hash_flow.rb:438:25:438:29 | hash2 [element :f] : | +| hash_flow.rb:428:5:428:9 | hash1 [element :a] : | hash_flow.rb:438:12:438:16 | hash1 [element :a] : | +| hash_flow.rb:428:5:428:9 | hash1 [element :c] : | hash_flow.rb:438:12:438:16 | hash1 [element :c] : | +| hash_flow.rb:429:15:429:25 | call to taint : | hash_flow.rb:428:5:428:9 | hash1 [element :a] : | +| hash_flow.rb:431:15:431:25 | call to taint : | hash_flow.rb:428:5:428:9 | hash1 [element :c] : | +| hash_flow.rb:433:5:433:9 | hash2 [element :d] : | hash_flow.rb:438:25:438:29 | hash2 [element :d] : | +| hash_flow.rb:433:5:433:9 | hash2 [element :f] : | hash_flow.rb:438:25:438:29 | hash2 [element :f] : | +| hash_flow.rb:434:15:434:25 | call to taint : | hash_flow.rb:433:5:433:9 | hash2 [element :d] : | +| hash_flow.rb:436:15:436:25 | call to taint : | hash_flow.rb:433:5:433:9 | hash2 [element :f] : | +| hash_flow.rb:438:5:438:8 | hash [element :a] : | hash_flow.rb:443:11:443:14 | hash [element :a] : | +| hash_flow.rb:438:5:438:8 | hash [element :c] : | hash_flow.rb:445:11:445:14 | hash [element :c] : | +| hash_flow.rb:438:5:438:8 | hash [element :d] : | hash_flow.rb:446:11:446:14 | hash [element :d] : | +| hash_flow.rb:438:5:438:8 | hash [element :f] : | hash_flow.rb:448:11:448:14 | hash [element :f] : | | hash_flow.rb:438:12:438:16 | [post] hash1 [element :a] : | hash_flow.rb:450:11:450:15 | hash1 [element :a] : | | hash_flow.rb:438:12:438:16 | [post] hash1 [element :c] : | hash_flow.rb:452:11:452:15 | hash1 [element :c] : | | hash_flow.rb:438:12:438:16 | [post] hash1 [element :d] : | hash_flow.rb:453:11:453:15 | hash1 [element :d] : | @@ -265,10 +345,10 @@ edges | hash_flow.rb:438:12:438:16 | hash1 [element :c] : | hash_flow.rb:438:12:442:7 | call to merge! [element :c] : | | hash_flow.rb:438:12:438:16 | hash1 [element :c] : | hash_flow.rb:438:41:438:49 | old_value : | | hash_flow.rb:438:12:438:16 | hash1 [element :c] : | hash_flow.rb:438:52:438:60 | new_value : | -| hash_flow.rb:438:12:442:7 | call to merge! [element :a] : | hash_flow.rb:443:11:443:14 | hash [element :a] : | -| hash_flow.rb:438:12:442:7 | call to merge! [element :c] : | hash_flow.rb:445:11:445:14 | hash [element :c] : | -| hash_flow.rb:438:12:442:7 | call to merge! [element :d] : | hash_flow.rb:446:11:446:14 | hash [element :d] : | -| hash_flow.rb:438:12:442:7 | call to merge! [element :f] : | hash_flow.rb:448:11:448:14 | hash [element :f] : | +| hash_flow.rb:438:12:442:7 | call to merge! [element :a] : | hash_flow.rb:438:5:438:8 | hash [element :a] : | +| hash_flow.rb:438:12:442:7 | call to merge! [element :c] : | hash_flow.rb:438:5:438:8 | hash [element :c] : | +| hash_flow.rb:438:12:442:7 | call to merge! [element :d] : | hash_flow.rb:438:5:438:8 | hash [element :d] : | +| hash_flow.rb:438:12:442:7 | call to merge! [element :f] : | hash_flow.rb:438:5:438:8 | hash [element :f] : | | hash_flow.rb:438:25:438:29 | hash2 [element :d] : | hash_flow.rb:438:12:438:16 | [post] hash1 [element :d] : | | hash_flow.rb:438:25:438:29 | hash2 [element :d] : | hash_flow.rb:438:12:442:7 | call to merge! [element :d] : | | hash_flow.rb:438:25:438:29 | hash2 [element :d] : | hash_flow.rb:438:41:438:49 | old_value : | @@ -295,27 +375,35 @@ edges | hash_flow.rb:453:11:453:19 | ...[...] : | hash_flow.rb:453:10:453:20 | ( ... ) | | hash_flow.rb:455:11:455:15 | hash1 [element :f] : | hash_flow.rb:455:11:455:19 | ...[...] : | | hash_flow.rb:455:11:455:19 | ...[...] : | hash_flow.rb:455:10:455:20 | ( ... ) | -| hash_flow.rb:462:15:462:25 | call to taint : | hash_flow.rb:465:9:465:12 | hash [element :a] : | +| hash_flow.rb:461:5:461:8 | hash [element :a] : | hash_flow.rb:465:9:465:12 | hash [element :a] : | +| hash_flow.rb:462:15:462:25 | call to taint : | hash_flow.rb:461:5:461:8 | hash [element :a] : | +| hash_flow.rb:465:5:465:5 | b [element 1] : | hash_flow.rb:467:10:467:10 | b [element 1] : | | hash_flow.rb:465:9:465:12 | hash [element :a] : | hash_flow.rb:465:9:465:22 | call to rassoc [element 1] : | -| hash_flow.rb:465:9:465:22 | call to rassoc [element 1] : | hash_flow.rb:467:10:467:10 | b [element 1] : | +| hash_flow.rb:465:9:465:22 | call to rassoc [element 1] : | hash_flow.rb:465:5:465:5 | b [element 1] : | | hash_flow.rb:467:10:467:10 | b [element 1] : | hash_flow.rb:467:10:467:13 | ...[...] | -| hash_flow.rb:474:15:474:25 | call to taint : | hash_flow.rb:477:9:477:12 | hash [element :a] : | +| hash_flow.rb:473:5:473:8 | hash [element :a] : | hash_flow.rb:477:9:477:12 | hash [element :a] : | +| hash_flow.rb:474:15:474:25 | call to taint : | hash_flow.rb:473:5:473:8 | hash [element :a] : | +| hash_flow.rb:477:5:477:5 | b [element :a] : | hash_flow.rb:482:10:482:10 | b [element :a] : | | hash_flow.rb:477:9:477:12 | hash [element :a] : | hash_flow.rb:477:9:481:7 | call to reject [element :a] : | | hash_flow.rb:477:9:477:12 | hash [element :a] : | hash_flow.rb:477:29:477:33 | value : | -| hash_flow.rb:477:9:481:7 | call to reject [element :a] : | hash_flow.rb:482:10:482:10 | b [element :a] : | +| hash_flow.rb:477:9:481:7 | call to reject [element :a] : | hash_flow.rb:477:5:477:5 | b [element :a] : | | hash_flow.rb:477:29:477:33 | value : | hash_flow.rb:479:14:479:18 | value | | hash_flow.rb:482:10:482:10 | b [element :a] : | hash_flow.rb:482:10:482:14 | ...[...] | -| hash_flow.rb:489:15:489:25 | call to taint : | hash_flow.rb:492:9:492:12 | hash [element :a] : | +| hash_flow.rb:488:5:488:8 | hash [element :a] : | hash_flow.rb:492:9:492:12 | hash [element :a] : | +| hash_flow.rb:489:15:489:25 | call to taint : | hash_flow.rb:488:5:488:8 | hash [element :a] : | +| hash_flow.rb:492:5:492:5 | b [element :a] : | hash_flow.rb:497:10:497:10 | b [element :a] : | | hash_flow.rb:492:9:492:12 | [post] hash [element :a] : | hash_flow.rb:498:10:498:13 | hash [element :a] : | | hash_flow.rb:492:9:492:12 | hash [element :a] : | hash_flow.rb:492:9:492:12 | [post] hash [element :a] : | | hash_flow.rb:492:9:492:12 | hash [element :a] : | hash_flow.rb:492:9:496:7 | call to reject! [element :a] : | | hash_flow.rb:492:9:492:12 | hash [element :a] : | hash_flow.rb:492:30:492:34 | value : | -| hash_flow.rb:492:9:496:7 | call to reject! [element :a] : | hash_flow.rb:497:10:497:10 | b [element :a] : | +| hash_flow.rb:492:9:496:7 | call to reject! [element :a] : | hash_flow.rb:492:5:492:5 | b [element :a] : | | hash_flow.rb:492:30:492:34 | value : | hash_flow.rb:494:14:494:18 | value | | hash_flow.rb:497:10:497:10 | b [element :a] : | hash_flow.rb:497:10:497:14 | ...[...] | | hash_flow.rb:498:10:498:13 | hash [element :a] : | hash_flow.rb:498:10:498:17 | ...[...] | -| hash_flow.rb:505:15:505:25 | call to taint : | hash_flow.rb:512:19:512:22 | hash [element :a] : | -| hash_flow.rb:507:15:507:25 | call to taint : | hash_flow.rb:512:19:512:22 | hash [element :c] : | +| hash_flow.rb:504:5:504:8 | hash [element :a] : | hash_flow.rb:512:19:512:22 | hash [element :a] : | +| hash_flow.rb:504:5:504:8 | hash [element :c] : | hash_flow.rb:512:19:512:22 | hash [element :c] : | +| hash_flow.rb:505:15:505:25 | call to taint : | hash_flow.rb:504:5:504:8 | hash [element :a] : | +| hash_flow.rb:507:15:507:25 | call to taint : | hash_flow.rb:504:5:504:8 | hash [element :c] : | | hash_flow.rb:512:5:512:9 | [post] hash2 [element :a] : | hash_flow.rb:513:11:513:15 | hash2 [element :a] : | | hash_flow.rb:512:5:512:9 | [post] hash2 [element :c] : | hash_flow.rb:515:11:515:15 | hash2 [element :c] : | | hash_flow.rb:512:19:512:22 | hash [element :a] : | hash_flow.rb:512:5:512:9 | [post] hash2 [element :a] : | @@ -324,17 +412,22 @@ edges | hash_flow.rb:513:11:513:19 | ...[...] : | hash_flow.rb:513:10:513:20 | ( ... ) | | hash_flow.rb:515:11:515:15 | hash2 [element :c] : | hash_flow.rb:515:11:515:19 | ...[...] : | | hash_flow.rb:515:11:515:19 | ...[...] : | hash_flow.rb:515:10:515:20 | ( ... ) | -| hash_flow.rb:520:15:520:25 | call to taint : | hash_flow.rb:524:9:524:12 | hash [element :a] : | -| hash_flow.rb:522:15:522:25 | call to taint : | hash_flow.rb:524:9:524:12 | hash [element :c] : | +| hash_flow.rb:519:5:519:8 | hash [element :a] : | hash_flow.rb:524:9:524:12 | hash [element :a] : | +| hash_flow.rb:519:5:519:8 | hash [element :c] : | hash_flow.rb:524:9:524:12 | hash [element :c] : | +| hash_flow.rb:520:15:520:25 | call to taint : | hash_flow.rb:519:5:519:8 | hash [element :a] : | +| hash_flow.rb:522:15:522:25 | call to taint : | hash_flow.rb:519:5:519:8 | hash [element :c] : | +| hash_flow.rb:524:5:524:5 | b [element :a] : | hash_flow.rb:529:11:529:11 | b [element :a] : | | hash_flow.rb:524:9:524:12 | hash [element :a] : | hash_flow.rb:524:9:528:7 | call to select [element :a] : | | hash_flow.rb:524:9:524:12 | hash [element :a] : | hash_flow.rb:524:30:524:34 | value : | | hash_flow.rb:524:9:524:12 | hash [element :c] : | hash_flow.rb:524:30:524:34 | value : | -| hash_flow.rb:524:9:528:7 | call to select [element :a] : | hash_flow.rb:529:11:529:11 | b [element :a] : | +| hash_flow.rb:524:9:528:7 | call to select [element :a] : | hash_flow.rb:524:5:524:5 | b [element :a] : | | hash_flow.rb:524:30:524:34 | value : | hash_flow.rb:526:14:526:18 | value | | hash_flow.rb:529:11:529:11 | b [element :a] : | hash_flow.rb:529:11:529:15 | ...[...] : | | hash_flow.rb:529:11:529:15 | ...[...] : | hash_flow.rb:529:10:529:16 | ( ... ) | -| hash_flow.rb:536:15:536:25 | call to taint : | hash_flow.rb:540:5:540:8 | hash [element :a] : | -| hash_flow.rb:538:15:538:25 | call to taint : | hash_flow.rb:540:5:540:8 | hash [element :c] : | +| hash_flow.rb:535:5:535:8 | hash [element :a] : | hash_flow.rb:540:5:540:8 | hash [element :a] : | +| hash_flow.rb:535:5:535:8 | hash [element :c] : | hash_flow.rb:540:5:540:8 | hash [element :c] : | +| hash_flow.rb:536:15:536:25 | call to taint : | hash_flow.rb:535:5:535:8 | hash [element :a] : | +| hash_flow.rb:538:15:538:25 | call to taint : | hash_flow.rb:535:5:535:8 | hash [element :c] : | | hash_flow.rb:540:5:540:8 | [post] hash [element :a] : | hash_flow.rb:545:11:545:14 | hash [element :a] : | | hash_flow.rb:540:5:540:8 | hash [element :a] : | hash_flow.rb:540:5:540:8 | [post] hash [element :a] : | | hash_flow.rb:540:5:540:8 | hash [element :a] : | hash_flow.rb:540:27:540:31 | value : | @@ -342,74 +435,95 @@ edges | hash_flow.rb:540:27:540:31 | value : | hash_flow.rb:542:14:542:18 | value | | hash_flow.rb:545:11:545:14 | hash [element :a] : | hash_flow.rb:545:11:545:18 | ...[...] : | | hash_flow.rb:545:11:545:18 | ...[...] : | hash_flow.rb:545:10:545:19 | ( ... ) | -| hash_flow.rb:552:15:552:25 | call to taint : | hash_flow.rb:556:9:556:12 | hash [element :a] : | -| hash_flow.rb:554:15:554:25 | call to taint : | hash_flow.rb:556:9:556:12 | hash [element :c] : | +| hash_flow.rb:551:5:551:8 | hash [element :a] : | hash_flow.rb:556:9:556:12 | hash [element :a] : | +| hash_flow.rb:551:5:551:8 | hash [element :c] : | hash_flow.rb:556:9:556:12 | hash [element :c] : | +| hash_flow.rb:552:15:552:25 | call to taint : | hash_flow.rb:551:5:551:8 | hash [element :a] : | +| hash_flow.rb:554:15:554:25 | call to taint : | hash_flow.rb:551:5:551:8 | hash [element :c] : | +| hash_flow.rb:556:5:556:5 | b [element 1] : | hash_flow.rb:559:11:559:11 | b [element 1] : | | hash_flow.rb:556:9:556:12 | [post] hash [element :a] : | hash_flow.rb:557:11:557:14 | hash [element :a] : | | hash_flow.rb:556:9:556:12 | hash [element :a] : | hash_flow.rb:556:9:556:12 | [post] hash [element :a] : | | hash_flow.rb:556:9:556:12 | hash [element :a] : | hash_flow.rb:556:9:556:18 | call to shift [element 1] : | | hash_flow.rb:556:9:556:12 | hash [element :c] : | hash_flow.rb:556:9:556:18 | call to shift [element 1] : | -| hash_flow.rb:556:9:556:18 | call to shift [element 1] : | hash_flow.rb:559:11:559:11 | b [element 1] : | +| hash_flow.rb:556:9:556:18 | call to shift [element 1] : | hash_flow.rb:556:5:556:5 | b [element 1] : | | hash_flow.rb:557:11:557:14 | hash [element :a] : | hash_flow.rb:557:11:557:18 | ...[...] : | | hash_flow.rb:557:11:557:18 | ...[...] : | hash_flow.rb:557:10:557:19 | ( ... ) | | hash_flow.rb:559:11:559:11 | b [element 1] : | hash_flow.rb:559:11:559:14 | ...[...] : | | hash_flow.rb:559:11:559:14 | ...[...] : | hash_flow.rb:559:10:559:15 | ( ... ) | -| hash_flow.rb:566:15:566:25 | call to taint : | hash_flow.rb:570:9:570:12 | hash [element :a] : | -| hash_flow.rb:566:15:566:25 | call to taint : | hash_flow.rb:575:9:575:12 | hash [element :a] : | -| hash_flow.rb:568:15:568:25 | call to taint : | hash_flow.rb:575:9:575:12 | hash [element :c] : | +| hash_flow.rb:565:5:565:8 | hash [element :a] : | hash_flow.rb:570:9:570:12 | hash [element :a] : | +| hash_flow.rb:565:5:565:8 | hash [element :a] : | hash_flow.rb:575:9:575:12 | hash [element :a] : | +| hash_flow.rb:565:5:565:8 | hash [element :c] : | hash_flow.rb:575:9:575:12 | hash [element :c] : | +| hash_flow.rb:566:15:566:25 | call to taint : | hash_flow.rb:565:5:565:8 | hash [element :a] : | +| hash_flow.rb:568:15:568:25 | call to taint : | hash_flow.rb:565:5:565:8 | hash [element :c] : | +| hash_flow.rb:570:5:570:5 | b [element :a] : | hash_flow.rb:571:11:571:11 | b [element :a] : | | hash_flow.rb:570:9:570:12 | hash [element :a] : | hash_flow.rb:570:9:570:26 | call to slice [element :a] : | -| hash_flow.rb:570:9:570:26 | call to slice [element :a] : | hash_flow.rb:571:11:571:11 | b [element :a] : | +| hash_flow.rb:570:9:570:26 | call to slice [element :a] : | hash_flow.rb:570:5:570:5 | b [element :a] : | | hash_flow.rb:571:11:571:11 | b [element :a] : | hash_flow.rb:571:11:571:15 | ...[...] : | | hash_flow.rb:571:11:571:15 | ...[...] : | hash_flow.rb:571:10:571:16 | ( ... ) | +| hash_flow.rb:575:5:575:5 | c [element :a] : | hash_flow.rb:576:11:576:11 | c [element :a] : | +| hash_flow.rb:575:5:575:5 | c [element :c] : | hash_flow.rb:578:11:578:11 | c [element :c] : | | hash_flow.rb:575:9:575:12 | hash [element :a] : | hash_flow.rb:575:9:575:25 | call to slice [element :a] : | | hash_flow.rb:575:9:575:12 | hash [element :c] : | hash_flow.rb:575:9:575:25 | call to slice [element :c] : | -| hash_flow.rb:575:9:575:25 | call to slice [element :a] : | hash_flow.rb:576:11:576:11 | c [element :a] : | -| hash_flow.rb:575:9:575:25 | call to slice [element :c] : | hash_flow.rb:578:11:578:11 | c [element :c] : | +| hash_flow.rb:575:9:575:25 | call to slice [element :a] : | hash_flow.rb:575:5:575:5 | c [element :a] : | +| hash_flow.rb:575:9:575:25 | call to slice [element :c] : | hash_flow.rb:575:5:575:5 | c [element :c] : | | hash_flow.rb:576:11:576:11 | c [element :a] : | hash_flow.rb:576:11:576:15 | ...[...] : | | hash_flow.rb:576:11:576:15 | ...[...] : | hash_flow.rb:576:10:576:16 | ( ... ) | | hash_flow.rb:578:11:578:11 | c [element :c] : | hash_flow.rb:578:11:578:15 | ...[...] : | | hash_flow.rb:578:11:578:15 | ...[...] : | hash_flow.rb:578:10:578:16 | ( ... ) | -| hash_flow.rb:585:15:585:25 | call to taint : | hash_flow.rb:589:9:589:12 | hash [element :a] : | -| hash_flow.rb:587:15:587:25 | call to taint : | hash_flow.rb:589:9:589:12 | hash [element :c] : | +| hash_flow.rb:584:5:584:8 | hash [element :a] : | hash_flow.rb:589:9:589:12 | hash [element :a] : | +| hash_flow.rb:584:5:584:8 | hash [element :c] : | hash_flow.rb:589:9:589:12 | hash [element :c] : | +| hash_flow.rb:585:15:585:25 | call to taint : | hash_flow.rb:584:5:584:8 | hash [element :a] : | +| hash_flow.rb:587:15:587:25 | call to taint : | hash_flow.rb:584:5:584:8 | hash [element :c] : | +| hash_flow.rb:589:5:589:5 | a [element, element 1] : | hash_flow.rb:591:11:591:11 | a [element, element 1] : | | hash_flow.rb:589:9:589:12 | hash [element :a] : | hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] : | | hash_flow.rb:589:9:589:12 | hash [element :c] : | hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] : | -| hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] : | hash_flow.rb:591:11:591:11 | a [element, element 1] : | +| hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] : | hash_flow.rb:589:5:589:5 | a [element, element 1] : | | hash_flow.rb:591:11:591:11 | a [element, element 1] : | hash_flow.rb:591:11:591:14 | ...[...] [element 1] : | | hash_flow.rb:591:11:591:14 | ...[...] [element 1] : | hash_flow.rb:591:11:591:17 | ...[...] : | | hash_flow.rb:591:11:591:17 | ...[...] : | hash_flow.rb:591:10:591:18 | ( ... ) | -| hash_flow.rb:598:15:598:25 | call to taint : | hash_flow.rb:602:9:602:12 | hash [element :a] : | -| hash_flow.rb:598:15:598:25 | call to taint : | hash_flow.rb:607:9:607:12 | hash [element :a] : | -| hash_flow.rb:600:15:600:25 | call to taint : | hash_flow.rb:602:9:602:12 | hash [element :c] : | -| hash_flow.rb:600:15:600:25 | call to taint : | hash_flow.rb:607:9:607:12 | hash [element :c] : | +| hash_flow.rb:597:5:597:8 | hash [element :a] : | hash_flow.rb:602:9:602:12 | hash [element :a] : | +| hash_flow.rb:597:5:597:8 | hash [element :a] : | hash_flow.rb:607:9:607:12 | hash [element :a] : | +| hash_flow.rb:597:5:597:8 | hash [element :c] : | hash_flow.rb:602:9:602:12 | hash [element :c] : | +| hash_flow.rb:597:5:597:8 | hash [element :c] : | hash_flow.rb:607:9:607:12 | hash [element :c] : | +| hash_flow.rb:598:15:598:25 | call to taint : | hash_flow.rb:597:5:597:8 | hash [element :a] : | +| hash_flow.rb:600:15:600:25 | call to taint : | hash_flow.rb:597:5:597:8 | hash [element :c] : | +| hash_flow.rb:602:5:602:5 | a [element :a] : | hash_flow.rb:603:11:603:11 | a [element :a] : | +| hash_flow.rb:602:5:602:5 | a [element :c] : | hash_flow.rb:605:11:605:11 | a [element :c] : | | hash_flow.rb:602:9:602:12 | hash [element :a] : | hash_flow.rb:602:9:602:17 | call to to_h [element :a] : | | hash_flow.rb:602:9:602:12 | hash [element :c] : | hash_flow.rb:602:9:602:17 | call to to_h [element :c] : | -| hash_flow.rb:602:9:602:17 | call to to_h [element :a] : | hash_flow.rb:603:11:603:11 | a [element :a] : | -| hash_flow.rb:602:9:602:17 | call to to_h [element :c] : | hash_flow.rb:605:11:605:11 | a [element :c] : | +| hash_flow.rb:602:9:602:17 | call to to_h [element :a] : | hash_flow.rb:602:5:602:5 | a [element :a] : | +| hash_flow.rb:602:9:602:17 | call to to_h [element :c] : | hash_flow.rb:602:5:602:5 | a [element :c] : | | hash_flow.rb:603:11:603:11 | a [element :a] : | hash_flow.rb:603:11:603:15 | ...[...] : | | hash_flow.rb:603:11:603:15 | ...[...] : | hash_flow.rb:603:10:603:16 | ( ... ) | | hash_flow.rb:605:11:605:11 | a [element :c] : | hash_flow.rb:605:11:605:15 | ...[...] : | | hash_flow.rb:605:11:605:15 | ...[...] : | hash_flow.rb:605:10:605:16 | ( ... ) | +| hash_flow.rb:607:5:607:5 | b [element] : | hash_flow.rb:612:11:612:11 | b [element] : | | hash_flow.rb:607:9:607:12 | hash [element :a] : | hash_flow.rb:607:28:607:32 | value : | | hash_flow.rb:607:9:607:12 | hash [element :c] : | hash_flow.rb:607:28:607:32 | value : | -| hash_flow.rb:607:9:611:7 | call to to_h [element] : | hash_flow.rb:612:11:612:11 | b [element] : | +| hash_flow.rb:607:9:611:7 | call to to_h [element] : | hash_flow.rb:607:5:607:5 | b [element] : | | hash_flow.rb:607:28:607:32 | value : | hash_flow.rb:609:14:609:18 | value | | hash_flow.rb:610:14:610:24 | call to taint : | hash_flow.rb:607:9:611:7 | call to to_h [element] : | | hash_flow.rb:612:11:612:11 | b [element] : | hash_flow.rb:612:11:612:15 | ...[...] : | | hash_flow.rb:612:11:612:15 | ...[...] : | hash_flow.rb:612:10:612:16 | ( ... ) | -| hash_flow.rb:619:15:619:25 | call to taint : | hash_flow.rb:623:9:623:12 | hash [element :a] : | -| hash_flow.rb:621:15:621:25 | call to taint : | hash_flow.rb:623:9:623:12 | hash [element :c] : | +| hash_flow.rb:618:5:618:8 | hash [element :a] : | hash_flow.rb:623:9:623:12 | hash [element :a] : | +| hash_flow.rb:618:5:618:8 | hash [element :c] : | hash_flow.rb:623:9:623:12 | hash [element :c] : | +| hash_flow.rb:619:15:619:25 | call to taint : | hash_flow.rb:618:5:618:8 | hash [element :a] : | +| hash_flow.rb:621:15:621:25 | call to taint : | hash_flow.rb:618:5:618:8 | hash [element :c] : | +| hash_flow.rb:623:5:623:5 | a [element] : | hash_flow.rb:624:11:624:11 | a [element] : | +| hash_flow.rb:623:5:623:5 | a [element] : | hash_flow.rb:625:11:625:11 | a [element] : | +| hash_flow.rb:623:5:623:5 | a [element] : | hash_flow.rb:626:11:626:11 | a [element] : | | hash_flow.rb:623:9:623:12 | hash [element :a] : | hash_flow.rb:623:9:623:45 | call to transform_keys [element] : | | hash_flow.rb:623:9:623:12 | hash [element :c] : | hash_flow.rb:623:9:623:45 | call to transform_keys [element] : | -| hash_flow.rb:623:9:623:45 | call to transform_keys [element] : | hash_flow.rb:624:11:624:11 | a [element] : | -| hash_flow.rb:623:9:623:45 | call to transform_keys [element] : | hash_flow.rb:625:11:625:11 | a [element] : | -| hash_flow.rb:623:9:623:45 | call to transform_keys [element] : | hash_flow.rb:626:11:626:11 | a [element] : | +| hash_flow.rb:623:9:623:45 | call to transform_keys [element] : | hash_flow.rb:623:5:623:5 | a [element] : | | hash_flow.rb:624:11:624:11 | a [element] : | hash_flow.rb:624:11:624:16 | ...[...] : | | hash_flow.rb:624:11:624:16 | ...[...] : | hash_flow.rb:624:10:624:17 | ( ... ) | | hash_flow.rb:625:11:625:11 | a [element] : | hash_flow.rb:625:11:625:16 | ...[...] : | | hash_flow.rb:625:11:625:16 | ...[...] : | hash_flow.rb:625:10:625:17 | ( ... ) | | hash_flow.rb:626:11:626:11 | a [element] : | hash_flow.rb:626:11:626:16 | ...[...] : | | hash_flow.rb:626:11:626:16 | ...[...] : | hash_flow.rb:626:10:626:17 | ( ... ) | -| hash_flow.rb:633:15:633:25 | call to taint : | hash_flow.rb:639:5:639:8 | hash [element :a] : | -| hash_flow.rb:635:15:635:25 | call to taint : | hash_flow.rb:639:5:639:8 | hash [element :c] : | +| hash_flow.rb:632:5:632:8 | hash [element :a] : | hash_flow.rb:639:5:639:8 | hash [element :a] : | +| hash_flow.rb:632:5:632:8 | hash [element :c] : | hash_flow.rb:639:5:639:8 | hash [element :c] : | +| hash_flow.rb:633:15:633:25 | call to taint : | hash_flow.rb:632:5:632:8 | hash [element :a] : | +| hash_flow.rb:635:15:635:25 | call to taint : | hash_flow.rb:632:5:632:8 | hash [element :c] : | | hash_flow.rb:637:5:637:8 | [post] hash [element] : | hash_flow.rb:639:5:639:8 | hash [element] : | | hash_flow.rb:637:5:637:8 | [post] hash [element] : | hash_flow.rb:640:11:640:14 | hash [element] : | | hash_flow.rb:637:5:637:8 | [post] hash [element] : | hash_flow.rb:641:11:641:14 | hash [element] : | @@ -427,20 +541,25 @@ edges | hash_flow.rb:641:11:641:19 | ...[...] : | hash_flow.rb:641:10:641:20 | ( ... ) | | hash_flow.rb:642:11:642:14 | hash [element] : | hash_flow.rb:642:11:642:19 | ...[...] : | | hash_flow.rb:642:11:642:19 | ...[...] : | hash_flow.rb:642:10:642:20 | ( ... ) | -| hash_flow.rb:649:15:649:25 | call to taint : | hash_flow.rb:653:9:653:12 | hash [element :a] : | -| hash_flow.rb:649:15:649:25 | call to taint : | hash_flow.rb:657:11:657:14 | hash [element :a] : | -| hash_flow.rb:651:15:651:25 | call to taint : | hash_flow.rb:653:9:653:12 | hash [element :c] : | +| hash_flow.rb:648:5:648:8 | hash [element :a] : | hash_flow.rb:653:9:653:12 | hash [element :a] : | +| hash_flow.rb:648:5:648:8 | hash [element :a] : | hash_flow.rb:657:11:657:14 | hash [element :a] : | +| hash_flow.rb:648:5:648:8 | hash [element :c] : | hash_flow.rb:653:9:653:12 | hash [element :c] : | +| hash_flow.rb:649:15:649:25 | call to taint : | hash_flow.rb:648:5:648:8 | hash [element :a] : | +| hash_flow.rb:651:15:651:25 | call to taint : | hash_flow.rb:648:5:648:8 | hash [element :c] : | +| hash_flow.rb:653:5:653:5 | b [element] : | hash_flow.rb:658:11:658:11 | b [element] : | | hash_flow.rb:653:9:653:12 | hash [element :a] : | hash_flow.rb:653:35:653:39 | value : | | hash_flow.rb:653:9:653:12 | hash [element :c] : | hash_flow.rb:653:35:653:39 | value : | -| hash_flow.rb:653:9:656:7 | call to transform_values [element] : | hash_flow.rb:658:11:658:11 | b [element] : | +| hash_flow.rb:653:9:656:7 | call to transform_values [element] : | hash_flow.rb:653:5:653:5 | b [element] : | | hash_flow.rb:653:35:653:39 | value : | hash_flow.rb:654:14:654:18 | value | | hash_flow.rb:655:9:655:19 | call to taint : | hash_flow.rb:653:9:656:7 | call to transform_values [element] : | | hash_flow.rb:657:11:657:14 | hash [element :a] : | hash_flow.rb:657:11:657:18 | ...[...] : | | hash_flow.rb:657:11:657:18 | ...[...] : | hash_flow.rb:657:10:657:19 | ( ... ) | | hash_flow.rb:658:11:658:11 | b [element] : | hash_flow.rb:658:11:658:15 | ...[...] : | | hash_flow.rb:658:11:658:15 | ...[...] : | hash_flow.rb:658:10:658:16 | ( ... ) | -| hash_flow.rb:665:15:665:25 | call to taint : | hash_flow.rb:669:5:669:8 | hash [element :a] : | -| hash_flow.rb:667:15:667:25 | call to taint : | hash_flow.rb:669:5:669:8 | hash [element :c] : | +| hash_flow.rb:664:5:664:8 | hash [element :a] : | hash_flow.rb:669:5:669:8 | hash [element :a] : | +| hash_flow.rb:664:5:664:8 | hash [element :c] : | hash_flow.rb:669:5:669:8 | hash [element :c] : | +| hash_flow.rb:665:15:665:25 | call to taint : | hash_flow.rb:664:5:664:8 | hash [element :a] : | +| hash_flow.rb:667:15:667:25 | call to taint : | hash_flow.rb:664:5:664:8 | hash [element :c] : | | hash_flow.rb:669:5:669:8 | [post] hash [element] : | hash_flow.rb:673:11:673:14 | hash [element] : | | hash_flow.rb:669:5:669:8 | hash [element :a] : | hash_flow.rb:669:32:669:36 | value : | | hash_flow.rb:669:5:669:8 | hash [element :c] : | hash_flow.rb:669:32:669:36 | value : | @@ -448,10 +567,18 @@ edges | hash_flow.rb:671:9:671:19 | call to taint : | hash_flow.rb:669:5:669:8 | [post] hash [element] : | | hash_flow.rb:673:11:673:14 | hash [element] : | hash_flow.rb:673:11:673:18 | ...[...] : | | hash_flow.rb:673:11:673:18 | ...[...] : | hash_flow.rb:673:10:673:19 | ( ... ) | -| hash_flow.rb:680:15:680:25 | call to taint : | hash_flow.rb:689:12:689:16 | hash1 [element :a] : | -| hash_flow.rb:682:15:682:25 | call to taint : | hash_flow.rb:689:12:689:16 | hash1 [element :c] : | -| hash_flow.rb:685:15:685:25 | call to taint : | hash_flow.rb:689:25:689:29 | hash2 [element :d] : | -| hash_flow.rb:687:15:687:25 | call to taint : | hash_flow.rb:689:25:689:29 | hash2 [element :f] : | +| hash_flow.rb:679:5:679:9 | hash1 [element :a] : | hash_flow.rb:689:12:689:16 | hash1 [element :a] : | +| hash_flow.rb:679:5:679:9 | hash1 [element :c] : | hash_flow.rb:689:12:689:16 | hash1 [element :c] : | +| hash_flow.rb:680:15:680:25 | call to taint : | hash_flow.rb:679:5:679:9 | hash1 [element :a] : | +| hash_flow.rb:682:15:682:25 | call to taint : | hash_flow.rb:679:5:679:9 | hash1 [element :c] : | +| hash_flow.rb:684:5:684:9 | hash2 [element :d] : | hash_flow.rb:689:25:689:29 | hash2 [element :d] : | +| hash_flow.rb:684:5:684:9 | hash2 [element :f] : | hash_flow.rb:689:25:689:29 | hash2 [element :f] : | +| hash_flow.rb:685:15:685:25 | call to taint : | hash_flow.rb:684:5:684:9 | hash2 [element :d] : | +| hash_flow.rb:687:15:687:25 | call to taint : | hash_flow.rb:684:5:684:9 | hash2 [element :f] : | +| hash_flow.rb:689:5:689:8 | hash [element :a] : | hash_flow.rb:694:11:694:14 | hash [element :a] : | +| hash_flow.rb:689:5:689:8 | hash [element :c] : | hash_flow.rb:696:11:696:14 | hash [element :c] : | +| hash_flow.rb:689:5:689:8 | hash [element :d] : | hash_flow.rb:697:11:697:14 | hash [element :d] : | +| hash_flow.rb:689:5:689:8 | hash [element :f] : | hash_flow.rb:699:11:699:14 | hash [element :f] : | | hash_flow.rb:689:12:689:16 | [post] hash1 [element :a] : | hash_flow.rb:701:11:701:15 | hash1 [element :a] : | | hash_flow.rb:689:12:689:16 | [post] hash1 [element :c] : | hash_flow.rb:703:11:703:15 | hash1 [element :c] : | | hash_flow.rb:689:12:689:16 | [post] hash1 [element :d] : | hash_flow.rb:704:11:704:15 | hash1 [element :d] : | @@ -464,10 +591,10 @@ edges | hash_flow.rb:689:12:689:16 | hash1 [element :c] : | hash_flow.rb:689:12:693:7 | call to update [element :c] : | | hash_flow.rb:689:12:689:16 | hash1 [element :c] : | hash_flow.rb:689:41:689:49 | old_value : | | hash_flow.rb:689:12:689:16 | hash1 [element :c] : | hash_flow.rb:689:52:689:60 | new_value : | -| hash_flow.rb:689:12:693:7 | call to update [element :a] : | hash_flow.rb:694:11:694:14 | hash [element :a] : | -| hash_flow.rb:689:12:693:7 | call to update [element :c] : | hash_flow.rb:696:11:696:14 | hash [element :c] : | -| hash_flow.rb:689:12:693:7 | call to update [element :d] : | hash_flow.rb:697:11:697:14 | hash [element :d] : | -| hash_flow.rb:689:12:693:7 | call to update [element :f] : | hash_flow.rb:699:11:699:14 | hash [element :f] : | +| hash_flow.rb:689:12:693:7 | call to update [element :a] : | hash_flow.rb:689:5:689:8 | hash [element :a] : | +| hash_flow.rb:689:12:693:7 | call to update [element :c] : | hash_flow.rb:689:5:689:8 | hash [element :c] : | +| hash_flow.rb:689:12:693:7 | call to update [element :d] : | hash_flow.rb:689:5:689:8 | hash [element :d] : | +| hash_flow.rb:689:12:693:7 | call to update [element :f] : | hash_flow.rb:689:5:689:8 | hash [element :f] : | | hash_flow.rb:689:25:689:29 | hash2 [element :d] : | hash_flow.rb:689:12:689:16 | [post] hash1 [element :d] : | | hash_flow.rb:689:25:689:29 | hash2 [element :d] : | hash_flow.rb:689:12:693:7 | call to update [element :d] : | | hash_flow.rb:689:25:689:29 | hash2 [element :d] : | hash_flow.rb:689:41:689:49 | old_value : | @@ -494,34 +621,50 @@ edges | hash_flow.rb:704:11:704:19 | ...[...] : | hash_flow.rb:704:10:704:20 | ( ... ) | | hash_flow.rb:706:11:706:15 | hash1 [element :f] : | hash_flow.rb:706:11:706:19 | ...[...] : | | hash_flow.rb:706:11:706:19 | ...[...] : | hash_flow.rb:706:10:706:20 | ( ... ) | -| hash_flow.rb:713:15:713:25 | call to taint : | hash_flow.rb:717:9:717:12 | hash [element :a] : | -| hash_flow.rb:715:15:715:25 | call to taint : | hash_flow.rb:717:9:717:12 | hash [element :c] : | +| hash_flow.rb:712:5:712:8 | hash [element :a] : | hash_flow.rb:717:9:717:12 | hash [element :a] : | +| hash_flow.rb:712:5:712:8 | hash [element :c] : | hash_flow.rb:717:9:717:12 | hash [element :c] : | +| hash_flow.rb:713:15:713:25 | call to taint : | hash_flow.rb:712:5:712:8 | hash [element :a] : | +| hash_flow.rb:715:15:715:25 | call to taint : | hash_flow.rb:712:5:712:8 | hash [element :c] : | +| hash_flow.rb:717:5:717:5 | a [element] : | hash_flow.rb:718:11:718:11 | a [element] : | | hash_flow.rb:717:9:717:12 | hash [element :a] : | hash_flow.rb:717:9:717:19 | call to values [element] : | | hash_flow.rb:717:9:717:12 | hash [element :c] : | hash_flow.rb:717:9:717:19 | call to values [element] : | -| hash_flow.rb:717:9:717:19 | call to values [element] : | hash_flow.rb:718:11:718:11 | a [element] : | +| hash_flow.rb:717:9:717:19 | call to values [element] : | hash_flow.rb:717:5:717:5 | a [element] : | | hash_flow.rb:718:11:718:11 | a [element] : | hash_flow.rb:718:11:718:14 | ...[...] : | | hash_flow.rb:718:11:718:14 | ...[...] : | hash_flow.rb:718:10:718:15 | ( ... ) | -| hash_flow.rb:725:15:725:25 | call to taint : | hash_flow.rb:729:9:729:12 | hash [element :a] : | -| hash_flow.rb:725:15:725:25 | call to taint : | hash_flow.rb:731:9:731:12 | hash [element :a] : | -| hash_flow.rb:727:15:727:25 | call to taint : | hash_flow.rb:731:9:731:12 | hash [element :c] : | +| hash_flow.rb:724:5:724:8 | hash [element :a] : | hash_flow.rb:729:9:729:12 | hash [element :a] : | +| hash_flow.rb:724:5:724:8 | hash [element :a] : | hash_flow.rb:731:9:731:12 | hash [element :a] : | +| hash_flow.rb:724:5:724:8 | hash [element :c] : | hash_flow.rb:731:9:731:12 | hash [element :c] : | +| hash_flow.rb:725:15:725:25 | call to taint : | hash_flow.rb:724:5:724:8 | hash [element :a] : | +| hash_flow.rb:727:15:727:25 | call to taint : | hash_flow.rb:724:5:724:8 | hash [element :c] : | +| hash_flow.rb:729:5:729:5 | b [element 0] : | hash_flow.rb:730:10:730:10 | b [element 0] : | | hash_flow.rb:729:9:729:12 | hash [element :a] : | hash_flow.rb:729:9:729:26 | call to values_at [element 0] : | -| hash_flow.rb:729:9:729:26 | call to values_at [element 0] : | hash_flow.rb:730:10:730:10 | b [element 0] : | +| hash_flow.rb:729:9:729:26 | call to values_at [element 0] : | hash_flow.rb:729:5:729:5 | b [element 0] : | | hash_flow.rb:730:10:730:10 | b [element 0] : | hash_flow.rb:730:10:730:13 | ...[...] | +| hash_flow.rb:731:5:731:5 | b [element] : | hash_flow.rb:732:10:732:10 | b [element] : | | hash_flow.rb:731:9:731:12 | hash [element :a] : | hash_flow.rb:731:9:731:31 | call to fetch_values [element] : | | hash_flow.rb:731:9:731:12 | hash [element :c] : | hash_flow.rb:731:9:731:31 | call to fetch_values [element] : | -| hash_flow.rb:731:9:731:31 | call to fetch_values [element] : | hash_flow.rb:732:10:732:10 | b [element] : | +| hash_flow.rb:731:9:731:31 | call to fetch_values [element] : | hash_flow.rb:731:5:731:5 | b [element] : | | hash_flow.rb:732:10:732:10 | b [element] : | hash_flow.rb:732:10:732:13 | ...[...] | -| hash_flow.rb:739:15:739:25 | call to taint : | hash_flow.rb:748:16:748:20 | hash1 [element :a] : | -| hash_flow.rb:741:15:741:25 | call to taint : | hash_flow.rb:748:16:748:20 | hash1 [element :c] : | -| hash_flow.rb:744:15:744:25 | call to taint : | hash_flow.rb:748:44:748:48 | hash2 [element :d] : | -| hash_flow.rb:746:15:746:25 | call to taint : | hash_flow.rb:748:44:748:48 | hash2 [element :f] : | -| hash_flow.rb:748:14:748:20 | ** ... [element :a] : | hash_flow.rb:749:10:749:13 | hash [element :a] : | -| hash_flow.rb:748:14:748:20 | ** ... [element :c] : | hash_flow.rb:751:10:751:13 | hash [element :c] : | +| hash_flow.rb:738:5:738:9 | hash1 [element :a] : | hash_flow.rb:748:16:748:20 | hash1 [element :a] : | +| hash_flow.rb:738:5:738:9 | hash1 [element :c] : | hash_flow.rb:748:16:748:20 | hash1 [element :c] : | +| hash_flow.rb:739:15:739:25 | call to taint : | hash_flow.rb:738:5:738:9 | hash1 [element :a] : | +| hash_flow.rb:741:15:741:25 | call to taint : | hash_flow.rb:738:5:738:9 | hash1 [element :c] : | +| hash_flow.rb:743:5:743:9 | hash2 [element :d] : | hash_flow.rb:748:44:748:48 | hash2 [element :d] : | +| hash_flow.rb:743:5:743:9 | hash2 [element :f] : | hash_flow.rb:748:44:748:48 | hash2 [element :f] : | +| hash_flow.rb:744:15:744:25 | call to taint : | hash_flow.rb:743:5:743:9 | hash2 [element :d] : | +| hash_flow.rb:746:15:746:25 | call to taint : | hash_flow.rb:743:5:743:9 | hash2 [element :f] : | +| hash_flow.rb:748:5:748:8 | hash [element :a] : | hash_flow.rb:749:10:749:13 | hash [element :a] : | +| hash_flow.rb:748:5:748:8 | hash [element :c] : | hash_flow.rb:751:10:751:13 | hash [element :c] : | +| hash_flow.rb:748:5:748:8 | hash [element :d] : | hash_flow.rb:752:10:752:13 | hash [element :d] : | +| hash_flow.rb:748:5:748:8 | hash [element :f] : | hash_flow.rb:754:10:754:13 | hash [element :f] : | +| hash_flow.rb:748:5:748:8 | hash [element :g] : | hash_flow.rb:755:10:755:13 | hash [element :g] : | +| hash_flow.rb:748:14:748:20 | ** ... [element :a] : | hash_flow.rb:748:5:748:8 | hash [element :a] : | +| hash_flow.rb:748:14:748:20 | ** ... [element :c] : | hash_flow.rb:748:5:748:8 | hash [element :c] : | | hash_flow.rb:748:16:748:20 | hash1 [element :a] : | hash_flow.rb:748:14:748:20 | ** ... [element :a] : | | hash_flow.rb:748:16:748:20 | hash1 [element :c] : | hash_flow.rb:748:14:748:20 | ** ... [element :c] : | -| hash_flow.rb:748:29:748:39 | call to taint : | hash_flow.rb:755:10:755:13 | hash [element :g] : | -| hash_flow.rb:748:42:748:48 | ** ... [element :d] : | hash_flow.rb:752:10:752:13 | hash [element :d] : | -| hash_flow.rb:748:42:748:48 | ** ... [element :f] : | hash_flow.rb:754:10:754:13 | hash [element :f] : | +| hash_flow.rb:748:29:748:39 | call to taint : | hash_flow.rb:748:5:748:8 | hash [element :g] : | +| hash_flow.rb:748:42:748:48 | ** ... [element :d] : | hash_flow.rb:748:5:748:8 | hash [element :d] : | +| hash_flow.rb:748:42:748:48 | ** ... [element :f] : | hash_flow.rb:748:5:748:8 | hash [element :f] : | | hash_flow.rb:748:44:748:48 | hash2 [element :d] : | hash_flow.rb:748:42:748:48 | ** ... [element :d] : | | hash_flow.rb:748:44:748:48 | hash2 [element :f] : | hash_flow.rb:748:42:748:48 | ** ... [element :f] : | | hash_flow.rb:749:10:749:13 | hash [element :a] : | hash_flow.rb:749:10:749:17 | ...[...] | @@ -529,33 +672,45 @@ edges | hash_flow.rb:752:10:752:13 | hash [element :d] : | hash_flow.rb:752:10:752:17 | ...[...] | | hash_flow.rb:754:10:754:13 | hash [element :f] : | hash_flow.rb:754:10:754:17 | ...[...] | | hash_flow.rb:755:10:755:13 | hash [element :g] : | hash_flow.rb:755:10:755:17 | ...[...] | -| hash_flow.rb:763:15:763:25 | call to taint : | hash_flow.rb:769:10:769:13 | hash [element :a] : | -| hash_flow.rb:765:15:765:25 | call to taint : | hash_flow.rb:771:10:771:13 | hash [element :c] : | -| hash_flow.rb:765:15:765:25 | call to taint : | hash_flow.rb:774:9:774:12 | hash [element :c] : | -| hash_flow.rb:766:15:766:25 | call to taint : | hash_flow.rb:772:10:772:13 | hash [element :d] : | +| hash_flow.rb:762:5:762:8 | hash [element :a] : | hash_flow.rb:769:10:769:13 | hash [element :a] : | +| hash_flow.rb:762:5:762:8 | hash [element :c] : | hash_flow.rb:771:10:771:13 | hash [element :c] : | +| hash_flow.rb:762:5:762:8 | hash [element :c] : | hash_flow.rb:774:9:774:12 | hash [element :c] : | +| hash_flow.rb:762:5:762:8 | hash [element :d] : | hash_flow.rb:772:10:772:13 | hash [element :d] : | +| hash_flow.rb:763:15:763:25 | call to taint : | hash_flow.rb:762:5:762:8 | hash [element :a] : | +| hash_flow.rb:765:15:765:25 | call to taint : | hash_flow.rb:762:5:762:8 | hash [element :c] : | +| hash_flow.rb:766:15:766:25 | call to taint : | hash_flow.rb:762:5:762:8 | hash [element :d] : | | hash_flow.rb:769:10:769:13 | hash [element :a] : | hash_flow.rb:769:10:769:17 | ...[...] | | hash_flow.rb:771:10:771:13 | hash [element :c] : | hash_flow.rb:771:10:771:17 | ...[...] | | hash_flow.rb:772:10:772:13 | hash [element :d] : | hash_flow.rb:772:10:772:17 | ...[...] | +| hash_flow.rb:774:5:774:5 | x [element :c] : | hash_flow.rb:778:10:778:10 | x [element :c] : | | hash_flow.rb:774:9:774:12 | [post] hash [element :c] : | hash_flow.rb:783:10:783:13 | hash [element :c] : | | hash_flow.rb:774:9:774:12 | hash [element :c] : | hash_flow.rb:774:9:774:12 | [post] hash [element :c] : | | hash_flow.rb:774:9:774:12 | hash [element :c] : | hash_flow.rb:774:9:774:31 | call to except! [element :c] : | -| hash_flow.rb:774:9:774:31 | call to except! [element :c] : | hash_flow.rb:778:10:778:10 | x [element :c] : | +| hash_flow.rb:774:9:774:31 | call to except! [element :c] : | hash_flow.rb:774:5:774:5 | x [element :c] : | | hash_flow.rb:778:10:778:10 | x [element :c] : | hash_flow.rb:778:10:778:14 | ...[...] | | hash_flow.rb:783:10:783:13 | hash [element :c] : | hash_flow.rb:783:10:783:17 | ...[...] | -| hash_flow.rb:791:15:791:25 | call to taint : | hash_flow.rb:800:12:800:16 | hash1 [element :a] : | -| hash_flow.rb:793:15:793:25 | call to taint : | hash_flow.rb:800:12:800:16 | hash1 [element :c] : | -| hash_flow.rb:796:15:796:25 | call to taint : | hash_flow.rb:800:29:800:33 | hash2 [element :d] : | -| hash_flow.rb:798:15:798:25 | call to taint : | hash_flow.rb:800:29:800:33 | hash2 [element :f] : | +| hash_flow.rb:790:5:790:9 | hash1 [element :a] : | hash_flow.rb:800:12:800:16 | hash1 [element :a] : | +| hash_flow.rb:790:5:790:9 | hash1 [element :c] : | hash_flow.rb:800:12:800:16 | hash1 [element :c] : | +| hash_flow.rb:791:15:791:25 | call to taint : | hash_flow.rb:790:5:790:9 | hash1 [element :a] : | +| hash_flow.rb:793:15:793:25 | call to taint : | hash_flow.rb:790:5:790:9 | hash1 [element :c] : | +| hash_flow.rb:795:5:795:9 | hash2 [element :d] : | hash_flow.rb:800:29:800:33 | hash2 [element :d] : | +| hash_flow.rb:795:5:795:9 | hash2 [element :f] : | hash_flow.rb:800:29:800:33 | hash2 [element :f] : | +| hash_flow.rb:796:15:796:25 | call to taint : | hash_flow.rb:795:5:795:9 | hash2 [element :d] : | +| hash_flow.rb:798:15:798:25 | call to taint : | hash_flow.rb:795:5:795:9 | hash2 [element :f] : | +| hash_flow.rb:800:5:800:8 | hash [element :a] : | hash_flow.rb:805:11:805:14 | hash [element :a] : | +| hash_flow.rb:800:5:800:8 | hash [element :c] : | hash_flow.rb:807:11:807:14 | hash [element :c] : | +| hash_flow.rb:800:5:800:8 | hash [element :d] : | hash_flow.rb:808:11:808:14 | hash [element :d] : | +| hash_flow.rb:800:5:800:8 | hash [element :f] : | hash_flow.rb:810:11:810:14 | hash [element :f] : | | hash_flow.rb:800:12:800:16 | hash1 [element :a] : | hash_flow.rb:800:12:804:7 | call to deep_merge [element :a] : | | hash_flow.rb:800:12:800:16 | hash1 [element :a] : | hash_flow.rb:800:45:800:53 | old_value : | | hash_flow.rb:800:12:800:16 | hash1 [element :a] : | hash_flow.rb:800:56:800:64 | new_value : | | hash_flow.rb:800:12:800:16 | hash1 [element :c] : | hash_flow.rb:800:12:804:7 | call to deep_merge [element :c] : | | hash_flow.rb:800:12:800:16 | hash1 [element :c] : | hash_flow.rb:800:45:800:53 | old_value : | | hash_flow.rb:800:12:800:16 | hash1 [element :c] : | hash_flow.rb:800:56:800:64 | new_value : | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :a] : | hash_flow.rb:805:11:805:14 | hash [element :a] : | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :c] : | hash_flow.rb:807:11:807:14 | hash [element :c] : | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :d] : | hash_flow.rb:808:11:808:14 | hash [element :d] : | -| hash_flow.rb:800:12:804:7 | call to deep_merge [element :f] : | hash_flow.rb:810:11:810:14 | hash [element :f] : | +| hash_flow.rb:800:12:804:7 | call to deep_merge [element :a] : | hash_flow.rb:800:5:800:8 | hash [element :a] : | +| hash_flow.rb:800:12:804:7 | call to deep_merge [element :c] : | hash_flow.rb:800:5:800:8 | hash [element :c] : | +| hash_flow.rb:800:12:804:7 | call to deep_merge [element :d] : | hash_flow.rb:800:5:800:8 | hash [element :d] : | +| hash_flow.rb:800:12:804:7 | call to deep_merge [element :f] : | hash_flow.rb:800:5:800:8 | hash [element :f] : | | hash_flow.rb:800:29:800:33 | hash2 [element :d] : | hash_flow.rb:800:12:804:7 | call to deep_merge [element :d] : | | hash_flow.rb:800:29:800:33 | hash2 [element :d] : | hash_flow.rb:800:45:800:53 | old_value : | | hash_flow.rb:800:29:800:33 | hash2 [element :d] : | hash_flow.rb:800:56:800:64 | new_value : | @@ -572,10 +727,18 @@ edges | hash_flow.rb:808:11:808:18 | ...[...] : | hash_flow.rb:808:10:808:19 | ( ... ) | | hash_flow.rb:810:11:810:14 | hash [element :f] : | hash_flow.rb:810:11:810:18 | ...[...] : | | hash_flow.rb:810:11:810:18 | ...[...] : | hash_flow.rb:810:10:810:19 | ( ... ) | -| hash_flow.rb:817:15:817:25 | call to taint : | hash_flow.rb:826:12:826:16 | hash1 [element :a] : | -| hash_flow.rb:819:15:819:25 | call to taint : | hash_flow.rb:826:12:826:16 | hash1 [element :c] : | -| hash_flow.rb:822:15:822:25 | call to taint : | hash_flow.rb:826:30:826:34 | hash2 [element :d] : | -| hash_flow.rb:824:15:824:25 | call to taint : | hash_flow.rb:826:30:826:34 | hash2 [element :f] : | +| hash_flow.rb:816:5:816:9 | hash1 [element :a] : | hash_flow.rb:826:12:826:16 | hash1 [element :a] : | +| hash_flow.rb:816:5:816:9 | hash1 [element :c] : | hash_flow.rb:826:12:826:16 | hash1 [element :c] : | +| hash_flow.rb:817:15:817:25 | call to taint : | hash_flow.rb:816:5:816:9 | hash1 [element :a] : | +| hash_flow.rb:819:15:819:25 | call to taint : | hash_flow.rb:816:5:816:9 | hash1 [element :c] : | +| hash_flow.rb:821:5:821:9 | hash2 [element :d] : | hash_flow.rb:826:30:826:34 | hash2 [element :d] : | +| hash_flow.rb:821:5:821:9 | hash2 [element :f] : | hash_flow.rb:826:30:826:34 | hash2 [element :f] : | +| hash_flow.rb:822:15:822:25 | call to taint : | hash_flow.rb:821:5:821:9 | hash2 [element :d] : | +| hash_flow.rb:824:15:824:25 | call to taint : | hash_flow.rb:821:5:821:9 | hash2 [element :f] : | +| hash_flow.rb:826:5:826:8 | hash [element :a] : | hash_flow.rb:831:11:831:14 | hash [element :a] : | +| hash_flow.rb:826:5:826:8 | hash [element :c] : | hash_flow.rb:833:11:833:14 | hash [element :c] : | +| hash_flow.rb:826:5:826:8 | hash [element :d] : | hash_flow.rb:834:11:834:14 | hash [element :d] : | +| hash_flow.rb:826:5:826:8 | hash [element :f] : | hash_flow.rb:836:11:836:14 | hash [element :f] : | | hash_flow.rb:826:12:826:16 | [post] hash1 [element :a] : | hash_flow.rb:838:11:838:15 | hash1 [element :a] : | | hash_flow.rb:826:12:826:16 | [post] hash1 [element :c] : | hash_flow.rb:840:11:840:15 | hash1 [element :c] : | | hash_flow.rb:826:12:826:16 | [post] hash1 [element :d] : | hash_flow.rb:841:11:841:15 | hash1 [element :d] : | @@ -588,10 +751,10 @@ edges | hash_flow.rb:826:12:826:16 | hash1 [element :c] : | hash_flow.rb:826:12:830:7 | call to deep_merge! [element :c] : | | hash_flow.rb:826:12:826:16 | hash1 [element :c] : | hash_flow.rb:826:46:826:54 | old_value : | | hash_flow.rb:826:12:826:16 | hash1 [element :c] : | hash_flow.rb:826:57:826:65 | new_value : | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :a] : | hash_flow.rb:831:11:831:14 | hash [element :a] : | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :c] : | hash_flow.rb:833:11:833:14 | hash [element :c] : | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :d] : | hash_flow.rb:834:11:834:14 | hash [element :d] : | -| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :f] : | hash_flow.rb:836:11:836:14 | hash [element :f] : | +| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :a] : | hash_flow.rb:826:5:826:8 | hash [element :a] : | +| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :c] : | hash_flow.rb:826:5:826:8 | hash [element :c] : | +| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :d] : | hash_flow.rb:826:5:826:8 | hash [element :d] : | +| hash_flow.rb:826:12:830:7 | call to deep_merge! [element :f] : | hash_flow.rb:826:5:826:8 | hash [element :f] : | | hash_flow.rb:826:30:826:34 | hash2 [element :d] : | hash_flow.rb:826:12:826:16 | [post] hash1 [element :d] : | | hash_flow.rb:826:30:826:34 | hash2 [element :d] : | hash_flow.rb:826:12:830:7 | call to deep_merge! [element :d] : | | hash_flow.rb:826:30:826:34 | hash2 [element :d] : | hash_flow.rb:826:46:826:54 | old_value : | @@ -618,20 +781,28 @@ edges | hash_flow.rb:841:11:841:19 | ...[...] : | hash_flow.rb:841:10:841:20 | ( ... ) | | hash_flow.rb:843:11:843:15 | hash1 [element :f] : | hash_flow.rb:843:11:843:19 | ...[...] : | | hash_flow.rb:843:11:843:19 | ...[...] : | hash_flow.rb:843:10:843:20 | ( ... ) | -| hash_flow.rb:850:12:850:22 | call to taint : | hash_flow.rb:860:13:860:17 | hash1 [element :a] : | -| hash_flow.rb:850:12:850:22 | call to taint : | hash_flow.rb:869:13:869:17 | hash1 [element :a] : | -| hash_flow.rb:852:12:852:22 | call to taint : | hash_flow.rb:860:13:860:17 | hash1 [element :c] : | -| hash_flow.rb:852:12:852:22 | call to taint : | hash_flow.rb:869:13:869:17 | hash1 [element :c] : | -| hash_flow.rb:855:12:855:22 | call to taint : | hash_flow.rb:860:33:860:37 | hash2 [element :d] : | -| hash_flow.rb:855:12:855:22 | call to taint : | hash_flow.rb:869:33:869:37 | hash2 [element :d] : | -| hash_flow.rb:857:12:857:22 | call to taint : | hash_flow.rb:860:33:860:37 | hash2 [element :f] : | -| hash_flow.rb:857:12:857:22 | call to taint : | hash_flow.rb:869:33:869:37 | hash2 [element :f] : | +| hash_flow.rb:849:5:849:9 | hash1 [element :a] : | hash_flow.rb:860:13:860:17 | hash1 [element :a] : | +| hash_flow.rb:849:5:849:9 | hash1 [element :a] : | hash_flow.rb:869:13:869:17 | hash1 [element :a] : | +| hash_flow.rb:849:5:849:9 | hash1 [element :c] : | hash_flow.rb:860:13:860:17 | hash1 [element :c] : | +| hash_flow.rb:849:5:849:9 | hash1 [element :c] : | hash_flow.rb:869:13:869:17 | hash1 [element :c] : | +| hash_flow.rb:850:12:850:22 | call to taint : | hash_flow.rb:849:5:849:9 | hash1 [element :a] : | +| hash_flow.rb:852:12:852:22 | call to taint : | hash_flow.rb:849:5:849:9 | hash1 [element :c] : | +| hash_flow.rb:854:5:854:9 | hash2 [element :d] : | hash_flow.rb:860:33:860:37 | hash2 [element :d] : | +| hash_flow.rb:854:5:854:9 | hash2 [element :d] : | hash_flow.rb:869:33:869:37 | hash2 [element :d] : | +| hash_flow.rb:854:5:854:9 | hash2 [element :f] : | hash_flow.rb:860:33:860:37 | hash2 [element :f] : | +| hash_flow.rb:854:5:854:9 | hash2 [element :f] : | hash_flow.rb:869:33:869:37 | hash2 [element :f] : | +| hash_flow.rb:855:12:855:22 | call to taint : | hash_flow.rb:854:5:854:9 | hash2 [element :d] : | +| hash_flow.rb:857:12:857:22 | call to taint : | hash_flow.rb:854:5:854:9 | hash2 [element :f] : | +| hash_flow.rb:860:5:860:9 | hash3 [element :a] : | hash_flow.rb:861:11:861:15 | hash3 [element :a] : | +| hash_flow.rb:860:5:860:9 | hash3 [element :c] : | hash_flow.rb:863:11:863:15 | hash3 [element :c] : | +| hash_flow.rb:860:5:860:9 | hash3 [element :d] : | hash_flow.rb:864:11:864:15 | hash3 [element :d] : | +| hash_flow.rb:860:5:860:9 | hash3 [element :f] : | hash_flow.rb:866:11:866:15 | hash3 [element :f] : | | hash_flow.rb:860:13:860:17 | hash1 [element :a] : | hash_flow.rb:860:13:860:38 | call to reverse_merge [element :a] : | | hash_flow.rb:860:13:860:17 | hash1 [element :c] : | hash_flow.rb:860:13:860:38 | call to reverse_merge [element :c] : | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :a] : | hash_flow.rb:861:11:861:15 | hash3 [element :a] : | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :c] : | hash_flow.rb:863:11:863:15 | hash3 [element :c] : | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :d] : | hash_flow.rb:864:11:864:15 | hash3 [element :d] : | -| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :f] : | hash_flow.rb:866:11:866:15 | hash3 [element :f] : | +| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :a] : | hash_flow.rb:860:5:860:9 | hash3 [element :a] : | +| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :c] : | hash_flow.rb:860:5:860:9 | hash3 [element :c] : | +| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :d] : | hash_flow.rb:860:5:860:9 | hash3 [element :d] : | +| hash_flow.rb:860:13:860:38 | call to reverse_merge [element :f] : | hash_flow.rb:860:5:860:9 | hash3 [element :f] : | | hash_flow.rb:860:33:860:37 | hash2 [element :d] : | hash_flow.rb:860:13:860:38 | call to reverse_merge [element :d] : | | hash_flow.rb:860:33:860:37 | hash2 [element :f] : | hash_flow.rb:860:13:860:38 | call to reverse_merge [element :f] : | | hash_flow.rb:861:11:861:15 | hash3 [element :a] : | hash_flow.rb:861:11:861:19 | ...[...] : | @@ -642,12 +813,16 @@ edges | hash_flow.rb:864:11:864:19 | ...[...] : | hash_flow.rb:864:10:864:20 | ( ... ) | | hash_flow.rb:866:11:866:15 | hash3 [element :f] : | hash_flow.rb:866:11:866:19 | ...[...] : | | hash_flow.rb:866:11:866:19 | ...[...] : | hash_flow.rb:866:10:866:20 | ( ... ) | +| hash_flow.rb:869:5:869:9 | hash4 [element :a] : | hash_flow.rb:870:11:870:15 | hash4 [element :a] : | +| hash_flow.rb:869:5:869:9 | hash4 [element :c] : | hash_flow.rb:872:11:872:15 | hash4 [element :c] : | +| hash_flow.rb:869:5:869:9 | hash4 [element :d] : | hash_flow.rb:873:11:873:15 | hash4 [element :d] : | +| hash_flow.rb:869:5:869:9 | hash4 [element :f] : | hash_flow.rb:875:11:875:15 | hash4 [element :f] : | | hash_flow.rb:869:13:869:17 | hash1 [element :a] : | hash_flow.rb:869:13:869:38 | call to with_defaults [element :a] : | | hash_flow.rb:869:13:869:17 | hash1 [element :c] : | hash_flow.rb:869:13:869:38 | call to with_defaults [element :c] : | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :a] : | hash_flow.rb:870:11:870:15 | hash4 [element :a] : | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :c] : | hash_flow.rb:872:11:872:15 | hash4 [element :c] : | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :d] : | hash_flow.rb:873:11:873:15 | hash4 [element :d] : | -| hash_flow.rb:869:13:869:38 | call to with_defaults [element :f] : | hash_flow.rb:875:11:875:15 | hash4 [element :f] : | +| hash_flow.rb:869:13:869:38 | call to with_defaults [element :a] : | hash_flow.rb:869:5:869:9 | hash4 [element :a] : | +| hash_flow.rb:869:13:869:38 | call to with_defaults [element :c] : | hash_flow.rb:869:5:869:9 | hash4 [element :c] : | +| hash_flow.rb:869:13:869:38 | call to with_defaults [element :d] : | hash_flow.rb:869:5:869:9 | hash4 [element :d] : | +| hash_flow.rb:869:13:869:38 | call to with_defaults [element :f] : | hash_flow.rb:869:5:869:9 | hash4 [element :f] : | | hash_flow.rb:869:33:869:37 | hash2 [element :d] : | hash_flow.rb:869:13:869:38 | call to with_defaults [element :d] : | | hash_flow.rb:869:33:869:37 | hash2 [element :f] : | hash_flow.rb:869:13:869:38 | call to with_defaults [element :f] : | | hash_flow.rb:870:11:870:15 | hash4 [element :a] : | hash_flow.rb:870:11:870:19 | ...[...] : | @@ -658,10 +833,18 @@ edges | hash_flow.rb:873:11:873:19 | ...[...] : | hash_flow.rb:873:10:873:20 | ( ... ) | | hash_flow.rb:875:11:875:15 | hash4 [element :f] : | hash_flow.rb:875:11:875:19 | ...[...] : | | hash_flow.rb:875:11:875:19 | ...[...] : | hash_flow.rb:875:10:875:20 | ( ... ) | -| hash_flow.rb:882:12:882:22 | call to taint : | hash_flow.rb:892:12:892:16 | hash1 [element :a] : | -| hash_flow.rb:884:12:884:22 | call to taint : | hash_flow.rb:892:12:892:16 | hash1 [element :c] : | -| hash_flow.rb:887:12:887:22 | call to taint : | hash_flow.rb:892:33:892:37 | hash2 [element :d] : | -| hash_flow.rb:889:12:889:22 | call to taint : | hash_flow.rb:892:33:892:37 | hash2 [element :f] : | +| hash_flow.rb:881:5:881:9 | hash1 [element :a] : | hash_flow.rb:892:12:892:16 | hash1 [element :a] : | +| hash_flow.rb:881:5:881:9 | hash1 [element :c] : | hash_flow.rb:892:12:892:16 | hash1 [element :c] : | +| hash_flow.rb:882:12:882:22 | call to taint : | hash_flow.rb:881:5:881:9 | hash1 [element :a] : | +| hash_flow.rb:884:12:884:22 | call to taint : | hash_flow.rb:881:5:881:9 | hash1 [element :c] : | +| hash_flow.rb:886:5:886:9 | hash2 [element :d] : | hash_flow.rb:892:33:892:37 | hash2 [element :d] : | +| hash_flow.rb:886:5:886:9 | hash2 [element :f] : | hash_flow.rb:892:33:892:37 | hash2 [element :f] : | +| hash_flow.rb:887:12:887:22 | call to taint : | hash_flow.rb:886:5:886:9 | hash2 [element :d] : | +| hash_flow.rb:889:12:889:22 | call to taint : | hash_flow.rb:886:5:886:9 | hash2 [element :f] : | +| hash_flow.rb:892:5:892:8 | hash [element :a] : | hash_flow.rb:893:11:893:14 | hash [element :a] : | +| hash_flow.rb:892:5:892:8 | hash [element :c] : | hash_flow.rb:895:11:895:14 | hash [element :c] : | +| hash_flow.rb:892:5:892:8 | hash [element :d] : | hash_flow.rb:896:11:896:14 | hash [element :d] : | +| hash_flow.rb:892:5:892:8 | hash [element :f] : | hash_flow.rb:898:11:898:14 | hash [element :f] : | | hash_flow.rb:892:12:892:16 | [post] hash1 [element :a] : | hash_flow.rb:900:11:900:15 | hash1 [element :a] : | | hash_flow.rb:892:12:892:16 | [post] hash1 [element :c] : | hash_flow.rb:902:11:902:15 | hash1 [element :c] : | | hash_flow.rb:892:12:892:16 | [post] hash1 [element :d] : | hash_flow.rb:903:11:903:15 | hash1 [element :d] : | @@ -670,10 +853,10 @@ edges | hash_flow.rb:892:12:892:16 | hash1 [element :a] : | hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :a] : | | hash_flow.rb:892:12:892:16 | hash1 [element :c] : | hash_flow.rb:892:12:892:16 | [post] hash1 [element :c] : | | hash_flow.rb:892:12:892:16 | hash1 [element :c] : | hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :c] : | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :a] : | hash_flow.rb:893:11:893:14 | hash [element :a] : | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :c] : | hash_flow.rb:895:11:895:14 | hash [element :c] : | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :d] : | hash_flow.rb:896:11:896:14 | hash [element :d] : | -| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :f] : | hash_flow.rb:898:11:898:14 | hash [element :f] : | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :a] : | hash_flow.rb:892:5:892:8 | hash [element :a] : | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :c] : | hash_flow.rb:892:5:892:8 | hash [element :c] : | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :d] : | hash_flow.rb:892:5:892:8 | hash [element :d] : | +| hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :f] : | hash_flow.rb:892:5:892:8 | hash [element :f] : | | hash_flow.rb:892:33:892:37 | hash2 [element :d] : | hash_flow.rb:892:12:892:16 | [post] hash1 [element :d] : | | hash_flow.rb:892:33:892:37 | hash2 [element :d] : | hash_flow.rb:892:12:892:38 | call to reverse_merge! [element :d] : | | hash_flow.rb:892:33:892:37 | hash2 [element :f] : | hash_flow.rb:892:12:892:16 | [post] hash1 [element :f] : | @@ -694,10 +877,18 @@ edges | hash_flow.rb:903:11:903:19 | ...[...] : | hash_flow.rb:903:10:903:20 | ( ... ) | | hash_flow.rb:905:11:905:15 | hash1 [element :f] : | hash_flow.rb:905:11:905:19 | ...[...] : | | hash_flow.rb:905:11:905:19 | ...[...] : | hash_flow.rb:905:10:905:20 | ( ... ) | -| hash_flow.rb:912:12:912:22 | call to taint : | hash_flow.rb:922:12:922:16 | hash1 [element :a] : | -| hash_flow.rb:914:12:914:22 | call to taint : | hash_flow.rb:922:12:922:16 | hash1 [element :c] : | -| hash_flow.rb:917:12:917:22 | call to taint : | hash_flow.rb:922:33:922:37 | hash2 [element :d] : | -| hash_flow.rb:919:12:919:22 | call to taint : | hash_flow.rb:922:33:922:37 | hash2 [element :f] : | +| hash_flow.rb:911:5:911:9 | hash1 [element :a] : | hash_flow.rb:922:12:922:16 | hash1 [element :a] : | +| hash_flow.rb:911:5:911:9 | hash1 [element :c] : | hash_flow.rb:922:12:922:16 | hash1 [element :c] : | +| hash_flow.rb:912:12:912:22 | call to taint : | hash_flow.rb:911:5:911:9 | hash1 [element :a] : | +| hash_flow.rb:914:12:914:22 | call to taint : | hash_flow.rb:911:5:911:9 | hash1 [element :c] : | +| hash_flow.rb:916:5:916:9 | hash2 [element :d] : | hash_flow.rb:922:33:922:37 | hash2 [element :d] : | +| hash_flow.rb:916:5:916:9 | hash2 [element :f] : | hash_flow.rb:922:33:922:37 | hash2 [element :f] : | +| hash_flow.rb:917:12:917:22 | call to taint : | hash_flow.rb:916:5:916:9 | hash2 [element :d] : | +| hash_flow.rb:919:12:919:22 | call to taint : | hash_flow.rb:916:5:916:9 | hash2 [element :f] : | +| hash_flow.rb:922:5:922:8 | hash [element :a] : | hash_flow.rb:923:11:923:14 | hash [element :a] : | +| hash_flow.rb:922:5:922:8 | hash [element :c] : | hash_flow.rb:925:11:925:14 | hash [element :c] : | +| hash_flow.rb:922:5:922:8 | hash [element :d] : | hash_flow.rb:926:11:926:14 | hash [element :d] : | +| hash_flow.rb:922:5:922:8 | hash [element :f] : | hash_flow.rb:928:11:928:14 | hash [element :f] : | | hash_flow.rb:922:12:922:16 | [post] hash1 [element :a] : | hash_flow.rb:930:11:930:15 | hash1 [element :a] : | | hash_flow.rb:922:12:922:16 | [post] hash1 [element :c] : | hash_flow.rb:932:11:932:15 | hash1 [element :c] : | | hash_flow.rb:922:12:922:16 | [post] hash1 [element :d] : | hash_flow.rb:933:11:933:15 | hash1 [element :d] : | @@ -706,10 +897,10 @@ edges | hash_flow.rb:922:12:922:16 | hash1 [element :a] : | hash_flow.rb:922:12:922:38 | call to with_defaults! [element :a] : | | hash_flow.rb:922:12:922:16 | hash1 [element :c] : | hash_flow.rb:922:12:922:16 | [post] hash1 [element :c] : | | hash_flow.rb:922:12:922:16 | hash1 [element :c] : | hash_flow.rb:922:12:922:38 | call to with_defaults! [element :c] : | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :a] : | hash_flow.rb:923:11:923:14 | hash [element :a] : | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :c] : | hash_flow.rb:925:11:925:14 | hash [element :c] : | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :d] : | hash_flow.rb:926:11:926:14 | hash [element :d] : | -| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :f] : | hash_flow.rb:928:11:928:14 | hash [element :f] : | +| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :a] : | hash_flow.rb:922:5:922:8 | hash [element :a] : | +| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :c] : | hash_flow.rb:922:5:922:8 | hash [element :c] : | +| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :d] : | hash_flow.rb:922:5:922:8 | hash [element :d] : | +| hash_flow.rb:922:12:922:38 | call to with_defaults! [element :f] : | hash_flow.rb:922:5:922:8 | hash [element :f] : | | hash_flow.rb:922:33:922:37 | hash2 [element :d] : | hash_flow.rb:922:12:922:16 | [post] hash1 [element :d] : | | hash_flow.rb:922:33:922:37 | hash2 [element :d] : | hash_flow.rb:922:12:922:38 | call to with_defaults! [element :d] : | | hash_flow.rb:922:33:922:37 | hash2 [element :f] : | hash_flow.rb:922:12:922:16 | [post] hash1 [element :f] : | @@ -730,10 +921,18 @@ edges | hash_flow.rb:933:11:933:19 | ...[...] : | hash_flow.rb:933:10:933:20 | ( ... ) | | hash_flow.rb:935:11:935:15 | hash1 [element :f] : | hash_flow.rb:935:11:935:19 | ...[...] : | | hash_flow.rb:935:11:935:19 | ...[...] : | hash_flow.rb:935:10:935:20 | ( ... ) | -| hash_flow.rb:942:12:942:22 | call to taint : | hash_flow.rb:952:12:952:16 | hash1 [element :a] : | -| hash_flow.rb:944:12:944:22 | call to taint : | hash_flow.rb:952:12:952:16 | hash1 [element :c] : | -| hash_flow.rb:947:12:947:22 | call to taint : | hash_flow.rb:952:33:952:37 | hash2 [element :d] : | -| hash_flow.rb:949:12:949:22 | call to taint : | hash_flow.rb:952:33:952:37 | hash2 [element :f] : | +| hash_flow.rb:941:5:941:9 | hash1 [element :a] : | hash_flow.rb:952:12:952:16 | hash1 [element :a] : | +| hash_flow.rb:941:5:941:9 | hash1 [element :c] : | hash_flow.rb:952:12:952:16 | hash1 [element :c] : | +| hash_flow.rb:942:12:942:22 | call to taint : | hash_flow.rb:941:5:941:9 | hash1 [element :a] : | +| hash_flow.rb:944:12:944:22 | call to taint : | hash_flow.rb:941:5:941:9 | hash1 [element :c] : | +| hash_flow.rb:946:5:946:9 | hash2 [element :d] : | hash_flow.rb:952:33:952:37 | hash2 [element :d] : | +| hash_flow.rb:946:5:946:9 | hash2 [element :f] : | hash_flow.rb:952:33:952:37 | hash2 [element :f] : | +| hash_flow.rb:947:12:947:22 | call to taint : | hash_flow.rb:946:5:946:9 | hash2 [element :d] : | +| hash_flow.rb:949:12:949:22 | call to taint : | hash_flow.rb:946:5:946:9 | hash2 [element :f] : | +| hash_flow.rb:952:5:952:8 | hash [element :a] : | hash_flow.rb:953:11:953:14 | hash [element :a] : | +| hash_flow.rb:952:5:952:8 | hash [element :c] : | hash_flow.rb:955:11:955:14 | hash [element :c] : | +| hash_flow.rb:952:5:952:8 | hash [element :d] : | hash_flow.rb:956:11:956:14 | hash [element :d] : | +| hash_flow.rb:952:5:952:8 | hash [element :f] : | hash_flow.rb:958:11:958:14 | hash [element :f] : | | hash_flow.rb:952:12:952:16 | [post] hash1 [element :a] : | hash_flow.rb:960:11:960:15 | hash1 [element :a] : | | hash_flow.rb:952:12:952:16 | [post] hash1 [element :c] : | hash_flow.rb:962:11:962:15 | hash1 [element :c] : | | hash_flow.rb:952:12:952:16 | [post] hash1 [element :d] : | hash_flow.rb:963:11:963:15 | hash1 [element :d] : | @@ -742,10 +941,10 @@ edges | hash_flow.rb:952:12:952:16 | hash1 [element :a] : | hash_flow.rb:952:12:952:38 | call to with_defaults! [element :a] : | | hash_flow.rb:952:12:952:16 | hash1 [element :c] : | hash_flow.rb:952:12:952:16 | [post] hash1 [element :c] : | | hash_flow.rb:952:12:952:16 | hash1 [element :c] : | hash_flow.rb:952:12:952:38 | call to with_defaults! [element :c] : | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :a] : | hash_flow.rb:953:11:953:14 | hash [element :a] : | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :c] : | hash_flow.rb:955:11:955:14 | hash [element :c] : | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :d] : | hash_flow.rb:956:11:956:14 | hash [element :d] : | -| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :f] : | hash_flow.rb:958:11:958:14 | hash [element :f] : | +| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :a] : | hash_flow.rb:952:5:952:8 | hash [element :a] : | +| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :c] : | hash_flow.rb:952:5:952:8 | hash [element :c] : | +| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :d] : | hash_flow.rb:952:5:952:8 | hash [element :d] : | +| hash_flow.rb:952:12:952:38 | call to with_defaults! [element :f] : | hash_flow.rb:952:5:952:8 | hash [element :f] : | | hash_flow.rb:952:33:952:37 | hash2 [element :d] : | hash_flow.rb:952:12:952:16 | [post] hash1 [element :d] : | | hash_flow.rb:952:33:952:37 | hash2 [element :d] : | hash_flow.rb:952:12:952:38 | call to with_defaults! [element :d] : | | hash_flow.rb:952:33:952:37 | hash2 [element :f] : | hash_flow.rb:952:12:952:16 | [post] hash1 [element :f] : | @@ -767,6 +966,11 @@ edges | hash_flow.rb:965:11:965:15 | hash1 [element :f] : | hash_flow.rb:965:11:965:19 | ...[...] : | | hash_flow.rb:965:11:965:19 | ...[...] : | hash_flow.rb:965:10:965:20 | ( ... ) | nodes +| hash_flow.rb:10:5:10:8 | hash [element 0] : | semmle.label | hash [element 0] : | +| hash_flow.rb:10:5:10:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:10:5:10:8 | hash [element :c] : | semmle.label | hash [element :c] : | +| hash_flow.rb:10:5:10:8 | hash [element e] : | semmle.label | hash [element e] : | +| hash_flow.rb:10:5:10:8 | hash [element g] : | semmle.label | hash [element g] : | | hash_flow.rb:11:15:11:24 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:13:12:13:21 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:15:14:15:23 | call to taint : | semmle.label | call to taint : | @@ -812,50 +1016,64 @@ nodes | hash_flow.rb:46:10:46:17 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:48:10:48:13 | hash [element a] : | semmle.label | hash [element a] : | | hash_flow.rb:48:10:48:18 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:55:5:55:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | | hash_flow.rb:55:13:55:37 | ...[...] [element :a] : | semmle.label | ...[...] [element :a] : | | hash_flow.rb:55:21:55:30 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:56:10:56:14 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | | hash_flow.rb:56:10:56:18 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:59:5:59:5 | x [element :a] : | semmle.label | x [element :a] : | | hash_flow.rb:59:13:59:22 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:60:5:60:9 | hash2 [element :a] : | semmle.label | hash2 [element :a] : | | hash_flow.rb:60:13:60:19 | ...[...] [element :a] : | semmle.label | ...[...] [element :a] : | | hash_flow.rb:60:18:60:18 | x [element :a] : | semmle.label | x [element :a] : | | hash_flow.rb:61:10:61:14 | hash2 [element :a] : | semmle.label | hash2 [element :a] : | | hash_flow.rb:61:10:61:18 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:64:5:64:9 | hash3 [element] : | semmle.label | hash3 [element] : | | hash_flow.rb:64:13:64:45 | ...[...] [element] : | semmle.label | ...[...] [element] : | | hash_flow.rb:64:24:64:33 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:65:10:65:14 | hash3 [element] : | semmle.label | hash3 [element] : | | hash_flow.rb:65:10:65:18 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:66:10:66:14 | hash3 [element] : | semmle.label | hash3 [element] : | | hash_flow.rb:66:10:66:18 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:68:5:68:9 | hash4 [element :a] : | semmle.label | hash4 [element :a] : | | hash_flow.rb:68:13:68:39 | ...[...] [element :a] : | semmle.label | ...[...] [element :a] : | | hash_flow.rb:68:22:68:31 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:69:10:69:14 | hash4 [element :a] : | semmle.label | hash4 [element :a] : | | hash_flow.rb:69:10:69:18 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:72:5:72:9 | hash5 [element a] : | semmle.label | hash5 [element a] : | | hash_flow.rb:72:13:72:45 | ...[...] [element a] : | semmle.label | ...[...] [element a] : | | hash_flow.rb:72:25:72:34 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:73:10:73:14 | hash5 [element a] : | semmle.label | hash5 [element a] : | | hash_flow.rb:73:10:73:19 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:76:5:76:9 | hash6 [element a] : | semmle.label | hash6 [element a] : | | hash_flow.rb:76:13:76:47 | ...[...] [element a] : | semmle.label | ...[...] [element a] : | | hash_flow.rb:76:26:76:35 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:77:10:77:14 | hash6 [element a] : | semmle.label | hash6 [element a] : | | hash_flow.rb:77:10:77:19 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:84:5:84:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | | hash_flow.rb:84:13:84:42 | call to [] [element :a] : | semmle.label | call to [] [element :a] : | | hash_flow.rb:84:26:84:35 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:85:10:85:14 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | | hash_flow.rb:85:10:85:18 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:92:5:92:8 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:93:15:93:24 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:96:5:96:9 | hash2 [element :a] : | semmle.label | hash2 [element :a] : | | hash_flow.rb:96:13:96:34 | call to try_convert [element :a] : | semmle.label | call to try_convert [element :a] : | | hash_flow.rb:96:30:96:33 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:97:10:97:14 | hash2 [element :a] : | semmle.label | hash2 [element :a] : | | hash_flow.rb:97:10:97:18 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:105:5:105:5 | b : | semmle.label | b : | +| hash_flow.rb:105:21:105:30 | __synth__0 : | semmle.label | __synth__0 : | | hash_flow.rb:105:21:105:30 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:106:10:106:10 | b | semmle.label | b | +| hash_flow.rb:113:5:113:5 | b : | semmle.label | b : | | hash_flow.rb:113:9:113:12 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | | hash_flow.rb:113:9:113:34 | call to store : | semmle.label | call to store : | | hash_flow.rb:113:24:113:33 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:114:10:114:13 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:114:10:114:17 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:115:10:115:10 | b | semmle.label | b | +| hash_flow.rb:118:5:118:5 | c : | semmle.label | c : | | hash_flow.rb:118:9:118:12 | [post] hash [element] : | semmle.label | [post] hash [element] : | | hash_flow.rb:118:9:118:33 | call to store : | semmle.label | call to store : | | hash_flow.rb:118:23:118:32 | call to taint : | semmle.label | call to taint : | @@ -864,6 +1082,7 @@ nodes | hash_flow.rb:120:10:120:13 | hash [element] : | semmle.label | hash [element] : | | hash_flow.rb:120:10:120:17 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:121:10:121:10 | c | semmle.label | c | +| hash_flow.rb:127:5:127:8 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:128:15:128:24 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:131:5:131:8 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:131:18:131:29 | key_or_value : | semmle.label | key_or_value : | @@ -871,27 +1090,36 @@ nodes | hash_flow.rb:134:5:134:8 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:134:22:134:26 | value : | semmle.label | value : | | hash_flow.rb:136:14:136:18 | value | semmle.label | value | +| hash_flow.rb:143:5:143:8 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:144:15:144:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:147:5:147:5 | b [element 1] : | semmle.label | b [element 1] : | | hash_flow.rb:147:9:147:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:147:9:147:22 | call to assoc [element 1] : | semmle.label | call to assoc [element 1] : | | hash_flow.rb:149:10:149:10 | b [element 1] : | semmle.label | b [element 1] : | | hash_flow.rb:149:10:149:13 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:150:10:150:10 | b [element 1] : | semmle.label | b [element 1] : | | hash_flow.rb:150:10:150:13 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:151:5:151:5 | c [element 1] : | semmle.label | c [element 1] : | | hash_flow.rb:151:9:151:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:151:9:151:21 | call to assoc [element 1] : | semmle.label | call to assoc [element 1] : | | hash_flow.rb:152:10:152:10 | c [element 1] : | semmle.label | c [element 1] : | | hash_flow.rb:152:10:152:13 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:169:5:169:8 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:170:15:170:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:173:5:173:5 | a [element :a] : | semmle.label | a [element :a] : | | hash_flow.rb:173:9:173:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:173:9:173:20 | call to compact [element :a] : | semmle.label | call to compact [element :a] : | | hash_flow.rb:174:10:174:10 | a [element :a] : | semmle.label | a [element :a] : | | hash_flow.rb:174:10:174:14 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:181:5:181:8 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:182:15:182:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:185:5:185:5 | a : | semmle.label | a : | | hash_flow.rb:185:9:185:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:185:9:185:23 | call to delete : | semmle.label | call to delete : | | hash_flow.rb:186:10:186:10 | a | semmle.label | a | +| hash_flow.rb:193:5:193:8 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:194:15:194:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:197:5:197:5 | a [element :a] : | semmle.label | a [element :a] : | | hash_flow.rb:197:9:197:12 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | | hash_flow.rb:197:9:197:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:197:9:200:7 | call to delete_if [element :a] : | semmle.label | call to delete_if [element :a] : | @@ -901,45 +1129,60 @@ nodes | hash_flow.rb:201:10:201:14 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:202:10:202:13 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:202:10:202:17 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:209:5:209:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:209:5:209:8 | hash [element :c, element :d] : | semmle.label | hash [element :c, element :d] : | | hash_flow.rb:210:15:210:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:213:19:213:29 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:217:10:217:13 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:217:10:217:21 | call to dig | semmle.label | call to dig | | hash_flow.rb:219:10:219:13 | hash [element :c, element :d] : | semmle.label | hash [element :c, element :d] : | | hash_flow.rb:219:10:219:24 | call to dig | semmle.label | call to dig | +| hash_flow.rb:226:5:226:8 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:227:15:227:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:230:5:230:5 | x [element :a] : | semmle.label | x [element :a] : | | hash_flow.rb:230:9:230:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:230:9:233:7 | call to each [element :a] : | semmle.label | call to each [element :a] : | | hash_flow.rb:230:28:230:32 | value : | semmle.label | value : | | hash_flow.rb:232:14:232:18 | value | semmle.label | value | | hash_flow.rb:234:10:234:10 | x [element :a] : | semmle.label | x [element :a] : | | hash_flow.rb:234:10:234:14 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:241:5:241:8 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:242:15:242:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:245:5:245:5 | x [element :a] : | semmle.label | x [element :a] : | | hash_flow.rb:245:9:245:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:245:9:247:7 | call to each_key [element :a] : | semmle.label | call to each_key [element :a] : | | hash_flow.rb:248:10:248:10 | x [element :a] : | semmle.label | x [element :a] : | | hash_flow.rb:248:10:248:14 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:255:5:255:8 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:256:15:256:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:259:5:259:5 | x [element :a] : | semmle.label | x [element :a] : | | hash_flow.rb:259:9:259:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:259:9:262:7 | call to each_pair [element :a] : | semmle.label | call to each_pair [element :a] : | | hash_flow.rb:259:33:259:37 | value : | semmle.label | value : | | hash_flow.rb:261:14:261:18 | value | semmle.label | value | | hash_flow.rb:263:10:263:10 | x [element :a] : | semmle.label | x [element :a] : | | hash_flow.rb:263:10:263:14 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:270:5:270:8 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:271:15:271:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:274:5:274:5 | x [element :a] : | semmle.label | x [element :a] : | | hash_flow.rb:274:9:274:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:274:9:276:7 | call to each_value [element :a] : | semmle.label | call to each_value [element :a] : | | hash_flow.rb:274:29:274:33 | value : | semmle.label | value : | | hash_flow.rb:275:14:275:18 | value | semmle.label | value | | hash_flow.rb:277:10:277:10 | x [element :a] : | semmle.label | x [element :a] : | | hash_flow.rb:277:10:277:14 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:284:5:284:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:287:15:287:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:290:5:290:5 | x [element :c] : | semmle.label | x [element :c] : | | hash_flow.rb:290:9:290:12 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:290:9:290:28 | call to except [element :c] : | semmle.label | call to except [element :c] : | | hash_flow.rb:293:10:293:10 | x [element :c] : | semmle.label | x [element :c] : | | hash_flow.rb:293:10:293:14 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:300:5:300:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:300:5:300:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:301:15:301:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:303:15:303:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:305:5:305:5 | b : | semmle.label | b : | | hash_flow.rb:305:9:305:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:305:9:305:12 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:305:9:307:7 | call to fetch : | semmle.label | call to fetch : | @@ -947,23 +1190,30 @@ nodes | hash_flow.rb:305:37:305:37 | x : | semmle.label | x : | | hash_flow.rb:306:14:306:14 | x | semmle.label | x | | hash_flow.rb:308:10:308:10 | b | semmle.label | b | +| hash_flow.rb:309:5:309:5 | b : | semmle.label | b : | | hash_flow.rb:309:9:309:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:309:9:309:22 | call to fetch : | semmle.label | call to fetch : | | hash_flow.rb:310:10:310:10 | b | semmle.label | b | +| hash_flow.rb:311:5:311:5 | b : | semmle.label | b : | | hash_flow.rb:311:9:311:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:311:9:311:35 | call to fetch : | semmle.label | call to fetch : | | hash_flow.rb:311:24:311:34 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:312:10:312:10 | b | semmle.label | b | +| hash_flow.rb:313:5:313:5 | b : | semmle.label | b : | | hash_flow.rb:313:9:313:35 | call to fetch : | semmle.label | call to fetch : | | hash_flow.rb:313:24:313:34 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:314:10:314:10 | b | semmle.label | b | +| hash_flow.rb:315:5:315:5 | b : | semmle.label | b : | | hash_flow.rb:315:9:315:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:315:9:315:12 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:315:9:315:34 | call to fetch : | semmle.label | call to fetch : | | hash_flow.rb:315:23:315:33 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:316:10:316:10 | b | semmle.label | b | +| hash_flow.rb:322:5:322:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:322:5:322:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:323:15:323:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:325:15:325:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:327:5:327:5 | b [element] : | semmle.label | b [element] : | | hash_flow.rb:327:9:327:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:327:9:327:12 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:327:9:330:7 | call to fetch_values [element] : | semmle.label | call to fetch_values [element] : | @@ -973,17 +1223,22 @@ nodes | hash_flow.rb:329:9:329:19 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:331:10:331:10 | b [element] : | semmle.label | b [element] : | | hash_flow.rb:331:10:331:13 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:332:5:332:5 | b [element] : | semmle.label | b [element] : | | hash_flow.rb:332:9:332:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:332:9:332:29 | call to fetch_values [element] : | semmle.label | call to fetch_values [element] : | | hash_flow.rb:333:10:333:10 | b [element] : | semmle.label | b [element] : | | hash_flow.rb:333:10:333:13 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:334:5:334:5 | b [element] : | semmle.label | b [element] : | | hash_flow.rb:334:9:334:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:334:9:334:12 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:334:9:334:31 | call to fetch_values [element] : | semmle.label | call to fetch_values [element] : | | hash_flow.rb:335:10:335:10 | b [element] : | semmle.label | b [element] : | | hash_flow.rb:335:10:335:13 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:341:5:341:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:341:5:341:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:342:15:342:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:344:15:344:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:346:5:346:5 | b [element :a] : | semmle.label | b [element :a] : | | hash_flow.rb:346:9:346:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:346:9:346:12 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:346:9:350:7 | call to filter [element :a] : | semmle.label | call to filter [element :a] : | @@ -992,6 +1247,8 @@ nodes | hash_flow.rb:351:10:351:16 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:351:11:351:11 | b [element :a] : | semmle.label | b [element :a] : | | hash_flow.rb:351:11:351:15 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:357:5:357:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:357:5:357:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:358:15:358:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:360:15:360:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:362:5:362:8 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | @@ -1002,16 +1259,22 @@ nodes | hash_flow.rb:367:10:367:19 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:367:11:367:14 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:367:11:367:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:373:5:373:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:373:5:373:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:374:15:374:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:376:15:376:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:378:5:378:5 | b [element] : | semmle.label | b [element] : | | hash_flow.rb:378:9:378:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:378:9:378:12 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:378:9:378:20 | call to flatten [element] : | semmle.label | call to flatten [element] : | | hash_flow.rb:379:10:379:15 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:379:11:379:11 | b [element] : | semmle.label | b [element] : | | hash_flow.rb:379:11:379:14 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:385:5:385:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:385:5:385:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:386:15:386:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:388:15:388:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:390:5:390:5 | b [element :a] : | semmle.label | b [element :a] : | | hash_flow.rb:390:9:390:12 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | | hash_flow.rb:390:9:390:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:390:9:390:12 | hash [element :c] : | semmle.label | hash [element :c] : | @@ -1024,10 +1287,18 @@ nodes | hash_flow.rb:396:10:396:16 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:396:11:396:11 | b [element :a] : | semmle.label | b [element :a] : | | hash_flow.rb:396:11:396:15 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:402:5:402:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | +| hash_flow.rb:402:5:402:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | | hash_flow.rb:403:15:403:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:405:15:405:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:407:5:407:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | +| hash_flow.rb:407:5:407:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | | hash_flow.rb:408:15:408:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:410:15:410:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:412:5:412:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:412:5:412:8 | hash [element :c] : | semmle.label | hash [element :c] : | +| hash_flow.rb:412:5:412:8 | hash [element :d] : | semmle.label | hash [element :d] : | +| hash_flow.rb:412:5:412:8 | hash [element :f] : | semmle.label | hash [element :f] : | | hash_flow.rb:412:12:412:16 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | | hash_flow.rb:412:12:412:16 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | | hash_flow.rb:412:12:416:7 | call to merge [element :a] : | semmle.label | call to merge [element :a] : | @@ -1052,10 +1323,18 @@ nodes | hash_flow.rb:422:10:422:19 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:422:11:422:14 | hash [element :f] : | semmle.label | hash [element :f] : | | hash_flow.rb:422:11:422:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:428:5:428:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | +| hash_flow.rb:428:5:428:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | | hash_flow.rb:429:15:429:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:431:15:431:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:433:5:433:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | +| hash_flow.rb:433:5:433:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | | hash_flow.rb:434:15:434:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:436:15:436:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:438:5:438:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:438:5:438:8 | hash [element :c] : | semmle.label | hash [element :c] : | +| hash_flow.rb:438:5:438:8 | hash [element :d] : | semmle.label | hash [element :d] : | +| hash_flow.rb:438:5:438:8 | hash [element :f] : | semmle.label | hash [element :f] : | | hash_flow.rb:438:12:438:16 | [post] hash1 [element :a] : | semmle.label | [post] hash1 [element :a] : | | hash_flow.rb:438:12:438:16 | [post] hash1 [element :c] : | semmle.label | [post] hash1 [element :c] : | | hash_flow.rb:438:12:438:16 | [post] hash1 [element :d] : | semmle.label | [post] hash1 [element :d] : | @@ -1096,19 +1375,25 @@ nodes | hash_flow.rb:455:10:455:20 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:455:11:455:15 | hash1 [element :f] : | semmle.label | hash1 [element :f] : | | hash_flow.rb:455:11:455:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:461:5:461:8 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:462:15:462:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:465:5:465:5 | b [element 1] : | semmle.label | b [element 1] : | | hash_flow.rb:465:9:465:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:465:9:465:22 | call to rassoc [element 1] : | semmle.label | call to rassoc [element 1] : | | hash_flow.rb:467:10:467:10 | b [element 1] : | semmle.label | b [element 1] : | | hash_flow.rb:467:10:467:13 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:473:5:473:8 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:474:15:474:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:477:5:477:5 | b [element :a] : | semmle.label | b [element :a] : | | hash_flow.rb:477:9:477:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:477:9:481:7 | call to reject [element :a] : | semmle.label | call to reject [element :a] : | | hash_flow.rb:477:29:477:33 | value : | semmle.label | value : | | hash_flow.rb:479:14:479:18 | value | semmle.label | value | | hash_flow.rb:482:10:482:10 | b [element :a] : | semmle.label | b [element :a] : | | hash_flow.rb:482:10:482:14 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:488:5:488:8 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:489:15:489:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:492:5:492:5 | b [element :a] : | semmle.label | b [element :a] : | | hash_flow.rb:492:9:492:12 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | | hash_flow.rb:492:9:492:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:492:9:496:7 | call to reject! [element :a] : | semmle.label | call to reject! [element :a] : | @@ -1118,6 +1403,8 @@ nodes | hash_flow.rb:497:10:497:14 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:498:10:498:13 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:498:10:498:17 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:504:5:504:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:504:5:504:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:505:15:505:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:507:15:507:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:512:5:512:9 | [post] hash2 [element :a] : | semmle.label | [post] hash2 [element :a] : | @@ -1130,8 +1417,11 @@ nodes | hash_flow.rb:515:10:515:20 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:515:11:515:15 | hash2 [element :c] : | semmle.label | hash2 [element :c] : | | hash_flow.rb:515:11:515:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:519:5:519:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:519:5:519:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:520:15:520:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:522:15:522:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:524:5:524:5 | b [element :a] : | semmle.label | b [element :a] : | | hash_flow.rb:524:9:524:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:524:9:524:12 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:524:9:528:7 | call to select [element :a] : | semmle.label | call to select [element :a] : | @@ -1140,6 +1430,8 @@ nodes | hash_flow.rb:529:10:529:16 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:529:11:529:11 | b [element :a] : | semmle.label | b [element :a] : | | hash_flow.rb:529:11:529:15 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:535:5:535:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:535:5:535:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:536:15:536:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:538:15:538:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:540:5:540:8 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | @@ -1150,8 +1442,11 @@ nodes | hash_flow.rb:545:10:545:19 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:545:11:545:14 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:545:11:545:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:551:5:551:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:551:5:551:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:552:15:552:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:554:15:554:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:556:5:556:5 | b [element 1] : | semmle.label | b [element 1] : | | hash_flow.rb:556:9:556:12 | [post] hash [element :a] : | semmle.label | [post] hash [element :a] : | | hash_flow.rb:556:9:556:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:556:9:556:12 | hash [element :c] : | semmle.label | hash [element :c] : | @@ -1162,13 +1457,18 @@ nodes | hash_flow.rb:559:10:559:15 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:559:11:559:11 | b [element 1] : | semmle.label | b [element 1] : | | hash_flow.rb:559:11:559:14 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:565:5:565:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:565:5:565:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:566:15:566:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:568:15:568:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:570:5:570:5 | b [element :a] : | semmle.label | b [element :a] : | | hash_flow.rb:570:9:570:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:570:9:570:26 | call to slice [element :a] : | semmle.label | call to slice [element :a] : | | hash_flow.rb:571:10:571:16 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:571:11:571:11 | b [element :a] : | semmle.label | b [element :a] : | | hash_flow.rb:571:11:571:15 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:575:5:575:5 | c [element :a] : | semmle.label | c [element :a] : | +| hash_flow.rb:575:5:575:5 | c [element :c] : | semmle.label | c [element :c] : | | hash_flow.rb:575:9:575:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:575:9:575:12 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:575:9:575:25 | call to slice [element :a] : | semmle.label | call to slice [element :a] : | @@ -1179,8 +1479,11 @@ nodes | hash_flow.rb:578:10:578:16 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:578:11:578:11 | c [element :c] : | semmle.label | c [element :c] : | | hash_flow.rb:578:11:578:15 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:584:5:584:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:584:5:584:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:585:15:585:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:587:15:587:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:589:5:589:5 | a [element, element 1] : | semmle.label | a [element, element 1] : | | hash_flow.rb:589:9:589:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:589:9:589:12 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:589:9:589:17 | call to to_a [element, element 1] : | semmle.label | call to to_a [element, element 1] : | @@ -1188,8 +1491,12 @@ nodes | hash_flow.rb:591:11:591:11 | a [element, element 1] : | semmle.label | a [element, element 1] : | | hash_flow.rb:591:11:591:14 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | | hash_flow.rb:591:11:591:17 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:597:5:597:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:597:5:597:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:598:15:598:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:600:15:600:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:602:5:602:5 | a [element :a] : | semmle.label | a [element :a] : | +| hash_flow.rb:602:5:602:5 | a [element :c] : | semmle.label | a [element :c] : | | hash_flow.rb:602:9:602:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:602:9:602:12 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:602:9:602:17 | call to to_h [element :a] : | semmle.label | call to to_h [element :a] : | @@ -1200,6 +1507,7 @@ nodes | hash_flow.rb:605:10:605:16 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:605:11:605:11 | a [element :c] : | semmle.label | a [element :c] : | | hash_flow.rb:605:11:605:15 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:607:5:607:5 | b [element] : | semmle.label | b [element] : | | hash_flow.rb:607:9:607:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:607:9:607:12 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:607:9:611:7 | call to to_h [element] : | semmle.label | call to to_h [element] : | @@ -1209,8 +1517,11 @@ nodes | hash_flow.rb:612:10:612:16 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:612:11:612:11 | b [element] : | semmle.label | b [element] : | | hash_flow.rb:612:11:612:15 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:618:5:618:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:618:5:618:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:619:15:619:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:621:15:621:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:623:5:623:5 | a [element] : | semmle.label | a [element] : | | hash_flow.rb:623:9:623:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:623:9:623:12 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:623:9:623:45 | call to transform_keys [element] : | semmle.label | call to transform_keys [element] : | @@ -1223,6 +1534,8 @@ nodes | hash_flow.rb:626:10:626:17 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:626:11:626:11 | a [element] : | semmle.label | a [element] : | | hash_flow.rb:626:11:626:16 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:632:5:632:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:632:5:632:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:633:15:633:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:635:15:635:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:637:5:637:8 | [post] hash [element] : | semmle.label | [post] hash [element] : | @@ -1240,8 +1553,11 @@ nodes | hash_flow.rb:642:10:642:20 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:642:11:642:14 | hash [element] : | semmle.label | hash [element] : | | hash_flow.rb:642:11:642:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:648:5:648:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:648:5:648:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:649:15:649:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:651:15:651:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:653:5:653:5 | b [element] : | semmle.label | b [element] : | | hash_flow.rb:653:9:653:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:653:9:653:12 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:653:9:656:7 | call to transform_values [element] : | semmle.label | call to transform_values [element] : | @@ -1254,6 +1570,8 @@ nodes | hash_flow.rb:658:10:658:16 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:658:11:658:11 | b [element] : | semmle.label | b [element] : | | hash_flow.rb:658:11:658:15 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:664:5:664:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:664:5:664:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:665:15:665:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:667:15:667:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:669:5:669:8 | [post] hash [element] : | semmle.label | [post] hash [element] : | @@ -1265,10 +1583,18 @@ nodes | hash_flow.rb:673:10:673:19 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:673:11:673:14 | hash [element] : | semmle.label | hash [element] : | | hash_flow.rb:673:11:673:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:679:5:679:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | +| hash_flow.rb:679:5:679:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | | hash_flow.rb:680:15:680:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:682:15:682:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:684:5:684:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | +| hash_flow.rb:684:5:684:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | | hash_flow.rb:685:15:685:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:687:15:687:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:689:5:689:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:689:5:689:8 | hash [element :c] : | semmle.label | hash [element :c] : | +| hash_flow.rb:689:5:689:8 | hash [element :d] : | semmle.label | hash [element :d] : | +| hash_flow.rb:689:5:689:8 | hash [element :f] : | semmle.label | hash [element :f] : | | hash_flow.rb:689:12:689:16 | [post] hash1 [element :a] : | semmle.label | [post] hash1 [element :a] : | | hash_flow.rb:689:12:689:16 | [post] hash1 [element :c] : | semmle.label | [post] hash1 [element :c] : | | hash_flow.rb:689:12:689:16 | [post] hash1 [element :d] : | semmle.label | [post] hash1 [element :d] : | @@ -1309,29 +1635,45 @@ nodes | hash_flow.rb:706:10:706:20 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:706:11:706:15 | hash1 [element :f] : | semmle.label | hash1 [element :f] : | | hash_flow.rb:706:11:706:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:712:5:712:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:712:5:712:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:713:15:713:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:715:15:715:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:717:5:717:5 | a [element] : | semmle.label | a [element] : | | hash_flow.rb:717:9:717:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:717:9:717:12 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:717:9:717:19 | call to values [element] : | semmle.label | call to values [element] : | | hash_flow.rb:718:10:718:15 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:718:11:718:11 | a [element] : | semmle.label | a [element] : | | hash_flow.rb:718:11:718:14 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:724:5:724:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:724:5:724:8 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:725:15:725:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:727:15:727:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:729:5:729:5 | b [element 0] : | semmle.label | b [element 0] : | | hash_flow.rb:729:9:729:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:729:9:729:26 | call to values_at [element 0] : | semmle.label | call to values_at [element 0] : | | hash_flow.rb:730:10:730:10 | b [element 0] : | semmle.label | b [element 0] : | | hash_flow.rb:730:10:730:13 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:731:5:731:5 | b [element] : | semmle.label | b [element] : | | hash_flow.rb:731:9:731:12 | hash [element :a] : | semmle.label | hash [element :a] : | | hash_flow.rb:731:9:731:12 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:731:9:731:31 | call to fetch_values [element] : | semmle.label | call to fetch_values [element] : | | hash_flow.rb:732:10:732:10 | b [element] : | semmle.label | b [element] : | | hash_flow.rb:732:10:732:13 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:738:5:738:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | +| hash_flow.rb:738:5:738:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | | hash_flow.rb:739:15:739:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:741:15:741:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:743:5:743:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | +| hash_flow.rb:743:5:743:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | | hash_flow.rb:744:15:744:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:746:15:746:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:748:5:748:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:748:5:748:8 | hash [element :c] : | semmle.label | hash [element :c] : | +| hash_flow.rb:748:5:748:8 | hash [element :d] : | semmle.label | hash [element :d] : | +| hash_flow.rb:748:5:748:8 | hash [element :f] : | semmle.label | hash [element :f] : | +| hash_flow.rb:748:5:748:8 | hash [element :g] : | semmle.label | hash [element :g] : | | hash_flow.rb:748:14:748:20 | ** ... [element :a] : | semmle.label | ** ... [element :a] : | | hash_flow.rb:748:14:748:20 | ** ... [element :c] : | semmle.label | ** ... [element :c] : | | hash_flow.rb:748:16:748:20 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | @@ -1351,6 +1693,9 @@ nodes | hash_flow.rb:754:10:754:17 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:755:10:755:13 | hash [element :g] : | semmle.label | hash [element :g] : | | hash_flow.rb:755:10:755:17 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:762:5:762:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:762:5:762:8 | hash [element :c] : | semmle.label | hash [element :c] : | +| hash_flow.rb:762:5:762:8 | hash [element :d] : | semmle.label | hash [element :d] : | | hash_flow.rb:763:15:763:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:765:15:765:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:766:15:766:25 | call to taint : | semmle.label | call to taint : | @@ -1360,6 +1705,7 @@ nodes | hash_flow.rb:771:10:771:17 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:772:10:772:13 | hash [element :d] : | semmle.label | hash [element :d] : | | hash_flow.rb:772:10:772:17 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:774:5:774:5 | x [element :c] : | semmle.label | x [element :c] : | | hash_flow.rb:774:9:774:12 | [post] hash [element :c] : | semmle.label | [post] hash [element :c] : | | hash_flow.rb:774:9:774:12 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:774:9:774:31 | call to except! [element :c] : | semmle.label | call to except! [element :c] : | @@ -1367,10 +1713,18 @@ nodes | hash_flow.rb:778:10:778:14 | ...[...] | semmle.label | ...[...] | | hash_flow.rb:783:10:783:13 | hash [element :c] : | semmle.label | hash [element :c] : | | hash_flow.rb:783:10:783:17 | ...[...] | semmle.label | ...[...] | +| hash_flow.rb:790:5:790:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | +| hash_flow.rb:790:5:790:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | | hash_flow.rb:791:15:791:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:793:15:793:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:795:5:795:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | +| hash_flow.rb:795:5:795:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | | hash_flow.rb:796:15:796:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:798:15:798:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:800:5:800:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:800:5:800:8 | hash [element :c] : | semmle.label | hash [element :c] : | +| hash_flow.rb:800:5:800:8 | hash [element :d] : | semmle.label | hash [element :d] : | +| hash_flow.rb:800:5:800:8 | hash [element :f] : | semmle.label | hash [element :f] : | | hash_flow.rb:800:12:800:16 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | | hash_flow.rb:800:12:800:16 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | | hash_flow.rb:800:12:804:7 | call to deep_merge [element :a] : | semmle.label | call to deep_merge [element :a] : | @@ -1395,10 +1749,18 @@ nodes | hash_flow.rb:810:10:810:19 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:810:11:810:14 | hash [element :f] : | semmle.label | hash [element :f] : | | hash_flow.rb:810:11:810:18 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:816:5:816:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | +| hash_flow.rb:816:5:816:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | | hash_flow.rb:817:15:817:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:819:15:819:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:821:5:821:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | +| hash_flow.rb:821:5:821:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | | hash_flow.rb:822:15:822:25 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:824:15:824:25 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:826:5:826:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:826:5:826:8 | hash [element :c] : | semmle.label | hash [element :c] : | +| hash_flow.rb:826:5:826:8 | hash [element :d] : | semmle.label | hash [element :d] : | +| hash_flow.rb:826:5:826:8 | hash [element :f] : | semmle.label | hash [element :f] : | | hash_flow.rb:826:12:826:16 | [post] hash1 [element :a] : | semmle.label | [post] hash1 [element :a] : | | hash_flow.rb:826:12:826:16 | [post] hash1 [element :c] : | semmle.label | [post] hash1 [element :c] : | | hash_flow.rb:826:12:826:16 | [post] hash1 [element :d] : | semmle.label | [post] hash1 [element :d] : | @@ -1439,10 +1801,18 @@ nodes | hash_flow.rb:843:10:843:20 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:843:11:843:15 | hash1 [element :f] : | semmle.label | hash1 [element :f] : | | hash_flow.rb:843:11:843:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:849:5:849:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | +| hash_flow.rb:849:5:849:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | | hash_flow.rb:850:12:850:22 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:852:12:852:22 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:854:5:854:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | +| hash_flow.rb:854:5:854:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | | hash_flow.rb:855:12:855:22 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:857:12:857:22 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:860:5:860:9 | hash3 [element :a] : | semmle.label | hash3 [element :a] : | +| hash_flow.rb:860:5:860:9 | hash3 [element :c] : | semmle.label | hash3 [element :c] : | +| hash_flow.rb:860:5:860:9 | hash3 [element :d] : | semmle.label | hash3 [element :d] : | +| hash_flow.rb:860:5:860:9 | hash3 [element :f] : | semmle.label | hash3 [element :f] : | | hash_flow.rb:860:13:860:17 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | | hash_flow.rb:860:13:860:17 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | | hash_flow.rb:860:13:860:38 | call to reverse_merge [element :a] : | semmle.label | call to reverse_merge [element :a] : | @@ -1463,6 +1833,10 @@ nodes | hash_flow.rb:866:10:866:20 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:866:11:866:15 | hash3 [element :f] : | semmle.label | hash3 [element :f] : | | hash_flow.rb:866:11:866:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:869:5:869:9 | hash4 [element :a] : | semmle.label | hash4 [element :a] : | +| hash_flow.rb:869:5:869:9 | hash4 [element :c] : | semmle.label | hash4 [element :c] : | +| hash_flow.rb:869:5:869:9 | hash4 [element :d] : | semmle.label | hash4 [element :d] : | +| hash_flow.rb:869:5:869:9 | hash4 [element :f] : | semmle.label | hash4 [element :f] : | | hash_flow.rb:869:13:869:17 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | | hash_flow.rb:869:13:869:17 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | | hash_flow.rb:869:13:869:38 | call to with_defaults [element :a] : | semmle.label | call to with_defaults [element :a] : | @@ -1483,10 +1857,18 @@ nodes | hash_flow.rb:875:10:875:20 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:875:11:875:15 | hash4 [element :f] : | semmle.label | hash4 [element :f] : | | hash_flow.rb:875:11:875:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:881:5:881:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | +| hash_flow.rb:881:5:881:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | | hash_flow.rb:882:12:882:22 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:884:12:884:22 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:886:5:886:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | +| hash_flow.rb:886:5:886:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | | hash_flow.rb:887:12:887:22 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:889:12:889:22 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:892:5:892:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:892:5:892:8 | hash [element :c] : | semmle.label | hash [element :c] : | +| hash_flow.rb:892:5:892:8 | hash [element :d] : | semmle.label | hash [element :d] : | +| hash_flow.rb:892:5:892:8 | hash [element :f] : | semmle.label | hash [element :f] : | | hash_flow.rb:892:12:892:16 | [post] hash1 [element :a] : | semmle.label | [post] hash1 [element :a] : | | hash_flow.rb:892:12:892:16 | [post] hash1 [element :c] : | semmle.label | [post] hash1 [element :c] : | | hash_flow.rb:892:12:892:16 | [post] hash1 [element :d] : | semmle.label | [post] hash1 [element :d] : | @@ -1523,10 +1905,18 @@ nodes | hash_flow.rb:905:10:905:20 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:905:11:905:15 | hash1 [element :f] : | semmle.label | hash1 [element :f] : | | hash_flow.rb:905:11:905:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:911:5:911:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | +| hash_flow.rb:911:5:911:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | | hash_flow.rb:912:12:912:22 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:914:12:914:22 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:916:5:916:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | +| hash_flow.rb:916:5:916:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | | hash_flow.rb:917:12:917:22 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:919:12:919:22 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:922:5:922:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:922:5:922:8 | hash [element :c] : | semmle.label | hash [element :c] : | +| hash_flow.rb:922:5:922:8 | hash [element :d] : | semmle.label | hash [element :d] : | +| hash_flow.rb:922:5:922:8 | hash [element :f] : | semmle.label | hash [element :f] : | | hash_flow.rb:922:12:922:16 | [post] hash1 [element :a] : | semmle.label | [post] hash1 [element :a] : | | hash_flow.rb:922:12:922:16 | [post] hash1 [element :c] : | semmle.label | [post] hash1 [element :c] : | | hash_flow.rb:922:12:922:16 | [post] hash1 [element :d] : | semmle.label | [post] hash1 [element :d] : | @@ -1563,10 +1953,18 @@ nodes | hash_flow.rb:935:10:935:20 | ( ... ) | semmle.label | ( ... ) | | hash_flow.rb:935:11:935:15 | hash1 [element :f] : | semmle.label | hash1 [element :f] : | | hash_flow.rb:935:11:935:19 | ...[...] : | semmle.label | ...[...] : | +| hash_flow.rb:941:5:941:9 | hash1 [element :a] : | semmle.label | hash1 [element :a] : | +| hash_flow.rb:941:5:941:9 | hash1 [element :c] : | semmle.label | hash1 [element :c] : | | hash_flow.rb:942:12:942:22 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:944:12:944:22 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:946:5:946:9 | hash2 [element :d] : | semmle.label | hash2 [element :d] : | +| hash_flow.rb:946:5:946:9 | hash2 [element :f] : | semmle.label | hash2 [element :f] : | | hash_flow.rb:947:12:947:22 | call to taint : | semmle.label | call to taint : | | hash_flow.rb:949:12:949:22 | call to taint : | semmle.label | call to taint : | +| hash_flow.rb:952:5:952:8 | hash [element :a] : | semmle.label | hash [element :a] : | +| hash_flow.rb:952:5:952:8 | hash [element :c] : | semmle.label | hash [element :c] : | +| hash_flow.rb:952:5:952:8 | hash [element :d] : | semmle.label | hash [element :d] : | +| hash_flow.rb:952:5:952:8 | hash [element :f] : | semmle.label | hash [element :f] : | | hash_flow.rb:952:12:952:16 | [post] hash1 [element :a] : | semmle.label | [post] hash1 [element :a] : | | hash_flow.rb:952:12:952:16 | [post] hash1 [element :c] : | semmle.label | [post] hash1 [element :c] : | | hash_flow.rb:952:12:952:16 | [post] hash1 [element :d] : | semmle.label | [post] hash1 [element :d] : | diff --git a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected index 2e1948ff2d7..60f62362f75 100644 --- a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected @@ -1,107 +1,107 @@ | UseUseExplosion.rb:18:5:22:7 | self (m) | UseUseExplosion.rb:20:13:20:17 | self | | UseUseExplosion.rb:18:5:22:7 | self in m | UseUseExplosion.rb:18:5:22:7 | self (m) | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2081:20:2116 | SSA phi read(x) | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2111:20:2111 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2127:20:2127 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2143:20:2143 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2159:20:2159 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2175:20:2175 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2191:20:2191 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2207:20:2207 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2223:20:2223 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2239:20:2239 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2255:20:2255 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2271:20:2271 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2287:20:2287 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2303:20:2303 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2319:20:2319 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2335:20:2335 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2351:20:2351 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2367:20:2367 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2383:20:2383 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2399:20:2399 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2415:20:2415 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2431:20:2431 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2447:20:2447 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2463:20:2463 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2479:20:2479 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2495:20:2495 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2511:20:2511 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2527:20:2527 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2543:20:2543 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2559:20:2559 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2575:20:2575 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2591:20:2591 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2607:20:2607 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2623:20:2623 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2639:20:2639 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2655:20:2655 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2671:20:2671 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2687:20:2687 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2703:20:2703 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2719:20:2719 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2735:20:2735 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2751:20:2751 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2767:20:2767 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2783:20:2783 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2799:20:2799 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2815:20:2815 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2831:20:2831 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2847:20:2847 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2863:20:2863 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2879:20:2879 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2895:20:2895 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2911:20:2911 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2927:20:2927 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2943:20:2943 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2959:20:2959 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2975:20:2975 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2991:20:2991 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3007:20:3007 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3023:20:3023 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3039:20:3039 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3055:20:3055 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3071:20:3071 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3087:20:3087 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3103:20:3103 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3119:20:3119 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3135:20:3135 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3151:20:3151 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3167:20:3167 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3183:20:3183 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3199:20:3199 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3215:20:3215 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3231:20:3231 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3247:20:3247 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3263:20:3263 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3279:20:3279 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3295:20:3295 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3311:20:3311 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3327:20:3327 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3343:20:3343 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3359:20:3359 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3375:20:3375 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3391:20:3391 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3407:20:3407 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3423:20:3423 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3439:20:3439 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3455:20:3455 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3471:20:3471 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3487:20:3487 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3503:20:3503 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3519:20:3519 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3535:20:3535 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3551:20:3551 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3567:20:3567 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3583:20:3583 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3599:20:3599 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3615:20:3615 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3631:20:3631 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3647:20:3647 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3663:20:3663 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3679:20:3679 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3695:20:3695 | x | -| UseUseExplosion.rb:19:13:19:13 | 0 | UseUseExplosion.rb:19:9:19:13 | ... = ... | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2081:20:2116 | SSA phi read(x) | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2111:20:2111 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2127:20:2127 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2143:20:2143 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2159:20:2159 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2175:20:2175 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2191:20:2191 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2207:20:2207 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2223:20:2223 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2239:20:2239 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2255:20:2255 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2271:20:2271 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2287:20:2287 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2303:20:2303 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2319:20:2319 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2335:20:2335 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2351:20:2351 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2367:20:2367 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2383:20:2383 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2399:20:2399 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2415:20:2415 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2431:20:2431 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2447:20:2447 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2463:20:2463 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2479:20:2479 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2495:20:2495 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2511:20:2511 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2527:20:2527 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2543:20:2543 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2559:20:2559 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2575:20:2575 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2591:20:2591 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2607:20:2607 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2623:20:2623 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2639:20:2639 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2655:20:2655 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2671:20:2671 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2687:20:2687 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2703:20:2703 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2719:20:2719 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2735:20:2735 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2751:20:2751 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2767:20:2767 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2783:20:2783 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2799:20:2799 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2815:20:2815 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2831:20:2831 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2847:20:2847 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2863:20:2863 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2879:20:2879 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2895:20:2895 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2911:20:2911 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2927:20:2927 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2943:20:2943 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2959:20:2959 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2975:20:2975 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2991:20:2991 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3007:20:3007 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3023:20:3023 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3039:20:3039 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3055:20:3055 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3071:20:3071 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3087:20:3087 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3103:20:3103 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3119:20:3119 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3135:20:3135 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3151:20:3151 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3167:20:3167 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3183:20:3183 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3199:20:3199 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3215:20:3215 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3231:20:3231 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3247:20:3247 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3263:20:3263 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3279:20:3279 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3295:20:3295 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3311:20:3311 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3327:20:3327 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3343:20:3343 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3359:20:3359 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3375:20:3375 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3391:20:3391 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3407:20:3407 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3423:20:3423 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3439:20:3439 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3455:20:3455 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3471:20:3471 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3487:20:3487 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3503:20:3503 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3519:20:3519 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3535:20:3535 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3551:20:3551 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3567:20:3567 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3583:20:3583 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3599:20:3599 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3615:20:3615 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3631:20:3631 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3647:20:3647 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3663:20:3663 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3679:20:3679 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3695:20:3695 | x | +| UseUseExplosion.rb:19:13:19:13 | 0 | UseUseExplosion.rb:19:9:19:9 | x | | UseUseExplosion.rb:19:13:19:13 | 0 | UseUseExplosion.rb:19:9:19:13 | ... = ... | | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(self) | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | UseUseExplosion.rb:21:2111:21:2111 | x | @@ -2402,8 +2402,8 @@ | local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) | local_dataflow.rb:49:1:53:3 | self | | local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:1:9:1:9 | a | | local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:2:7:2:7 | a | -| local_dataflow.rb:2:3:2:7 | ... = ... | local_dataflow.rb:3:13:3:13 | b | -| local_dataflow.rb:2:7:2:7 | a | local_dataflow.rb:2:3:2:7 | ... = ... | +| local_dataflow.rb:2:3:2:3 | b | local_dataflow.rb:3:13:3:13 | b | +| local_dataflow.rb:2:7:2:7 | a | local_dataflow.rb:2:3:2:3 | b | | local_dataflow.rb:2:7:2:7 | a | local_dataflow.rb:2:3:2:7 | ... = ... | | local_dataflow.rb:2:7:2:7 | a | local_dataflow.rb:3:10:3:10 | a | | local_dataflow.rb:3:7:3:14 | ( ... ) | local_dataflow.rb:3:3:3:14 | ... = ... | @@ -2421,39 +2421,39 @@ | local_dataflow.rb:6:7:6:14 | ( ... ) | local_dataflow.rb:6:3:6:14 | ... = ... | | local_dataflow.rb:6:8:6:13 | ... = ... | local_dataflow.rb:6:7:6:14 | ( ... ) | | local_dataflow.rb:6:10:6:11 | ... + ... | local_dataflow.rb:6:8:6:13 | ... = ... | -| local_dataflow.rb:9:1:9:15 | ... = ... | local_dataflow.rb:10:14:10:18 | array | +| local_dataflow.rb:9:1:9:5 | array | local_dataflow.rb:10:14:10:18 | array | +| local_dataflow.rb:9:9:9:15 | call to [] | local_dataflow.rb:9:1:9:5 | array | | local_dataflow.rb:9:9:9:15 | call to [] | local_dataflow.rb:9:1:9:15 | ... = ... | -| local_dataflow.rb:9:9:9:15 | call to [] | local_dataflow.rb:9:1:9:15 | ... = ... | -| local_dataflow.rb:10:5:13:3 | ... = ... | local_dataflow.rb:12:5:12:5 | x | | local_dataflow.rb:10:5:13:3 | self | local_dataflow.rb:11:1:11:2 | self | | local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:5:13:3 | ... = ... | -| local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:5:13:3 | ... = ... | | local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:5:13:3 | __synth__0__1 | | local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:5:13:3 | __synth__0__1 | +| local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:9:10:9 | x | | local_dataflow.rb:10:5:13:3 | call to each | local_dataflow.rb:10:1:13:3 | ... = ... | +| local_dataflow.rb:10:9:10:9 | x | local_dataflow.rb:12:5:12:5 | x | | local_dataflow.rb:10:14:10:18 | [post] array | local_dataflow.rb:15:10:15:14 | array | | local_dataflow.rb:10:14:10:18 | array | local_dataflow.rb:15:10:15:14 | array | | local_dataflow.rb:11:1:11:2 | [post] self | local_dataflow.rb:12:3:12:5 | self | | local_dataflow.rb:11:1:11:2 | self | local_dataflow.rb:12:3:12:5 | self | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | ... = ... | -| local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | ... = ... | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | __synth__0__1 | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | __synth__0__1 | +| local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:5:15:5 | x | | local_dataflow.rb:15:10:15:14 | [post] array | local_dataflow.rb:19:10:19:14 | array | | local_dataflow.rb:15:10:15:14 | array | local_dataflow.rb:19:10:19:14 | array | | local_dataflow.rb:16:9:16:10 | 10 | local_dataflow.rb:16:3:16:10 | break | -| local_dataflow.rb:19:1:21:3 | ... = ... | local_dataflow.rb:20:6:20:6 | x | -| local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:1:21:3 | ... = ... | | local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:1:21:3 | ... = ... | | local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:1:21:3 | __synth__0__1 | | local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:1:21:3 | __synth__0__1 | +| local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:5:19:5 | x | +| local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:20:6:20:6 | x | | local_dataflow.rb:24:2:24:8 | break | local_dataflow.rb:23:1:25:3 | while ... | | local_dataflow.rb:24:8:24:8 | 5 | local_dataflow.rb:24:2:24:8 | break | | local_dataflow.rb:28:5:28:26 | M | local_dataflow.rb:28:1:28:26 | ... = ... | | local_dataflow.rb:28:15:28:22 | "module" | local_dataflow.rb:28:5:28:26 | M | | local_dataflow.rb:30:5:30:24 | C | local_dataflow.rb:30:1:30:24 | ... = ... | | local_dataflow.rb:30:14:30:20 | "class" | local_dataflow.rb:30:5:30:24 | C | -| local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:25 | ... = ... | +| local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:1 | x | | local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:25 | ... = ... | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:34:7:34:7 | x | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:35:6:35:6 | x | @@ -2498,9 +2498,9 @@ | local_dataflow.rb:73:7:73:7 | x | local_dataflow.rb:72:7:73:7 | then ... | | local_dataflow.rb:74:3:75:6 | else ... | local_dataflow.rb:69:7:76:5 | case ... | | local_dataflow.rb:75:6:75:6 | x | local_dataflow.rb:74:3:75:6 | else ... | -| local_dataflow.rb:78:3:88:5 | ... = ... | local_dataflow.rb:89:8:89:8 | z | +| local_dataflow.rb:78:3:78:3 | z | local_dataflow.rb:89:8:89:8 | z | | local_dataflow.rb:78:7:88:5 | SSA phi read(self) | local_dataflow.rb:89:3:89:9 | self | -| local_dataflow.rb:78:7:88:5 | case ... | local_dataflow.rb:78:3:88:5 | ... = ... | +| local_dataflow.rb:78:7:88:5 | case ... | local_dataflow.rb:78:3:78:3 | z | | local_dataflow.rb:78:7:88:5 | case ... | local_dataflow.rb:78:3:88:5 | ... = ... | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:79:20:79:26 | self | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:80:24:80:30 | self | @@ -2544,18 +2544,18 @@ | local_dataflow.rb:87:29:87:29 | x | local_dataflow.rb:87:15:87:48 | then ... | | local_dataflow.rb:92:1:109:3 | self (and_or) | local_dataflow.rb:93:7:93:15 | self | | local_dataflow.rb:92:1:109:3 | self in and_or | local_dataflow.rb:92:1:109:3 | self (and_or) | -| local_dataflow.rb:93:3:93:28 | ... = ... | local_dataflow.rb:94:8:94:8 | a | +| local_dataflow.rb:93:3:93:3 | a | local_dataflow.rb:94:8:94:8 | a | | local_dataflow.rb:93:7:93:15 | [post] self | local_dataflow.rb:93:20:93:28 | self | | local_dataflow.rb:93:7:93:15 | call to source | local_dataflow.rb:93:7:93:28 | ... \|\| ... | | local_dataflow.rb:93:7:93:15 | self | local_dataflow.rb:93:20:93:28 | self | -| local_dataflow.rb:93:7:93:28 | ... \|\| ... | local_dataflow.rb:93:3:93:28 | ... = ... | +| local_dataflow.rb:93:7:93:28 | ... \|\| ... | local_dataflow.rb:93:3:93:3 | a | | local_dataflow.rb:93:7:93:28 | ... \|\| ... | local_dataflow.rb:93:3:93:28 | ... = ... | | local_dataflow.rb:93:7:93:28 | SSA phi read(self) | local_dataflow.rb:94:3:94:9 | self | | local_dataflow.rb:93:20:93:28 | call to source | local_dataflow.rb:93:7:93:28 | ... \|\| ... | | local_dataflow.rb:94:3:94:9 | [post] self | local_dataflow.rb:95:8:95:16 | self | | local_dataflow.rb:94:3:94:9 | self | local_dataflow.rb:95:8:95:16 | self | -| local_dataflow.rb:95:3:95:30 | ... = ... | local_dataflow.rb:96:8:96:8 | b | -| local_dataflow.rb:95:7:95:30 | ( ... ) | local_dataflow.rb:95:3:95:30 | ... = ... | +| local_dataflow.rb:95:3:95:3 | b | local_dataflow.rb:96:8:96:8 | b | +| local_dataflow.rb:95:7:95:30 | ( ... ) | local_dataflow.rb:95:3:95:3 | b | | local_dataflow.rb:95:7:95:30 | ( ... ) | local_dataflow.rb:95:3:95:30 | ... = ... | | local_dataflow.rb:95:8:95:16 | [post] self | local_dataflow.rb:95:21:95:29 | self | | local_dataflow.rb:95:8:95:16 | call to source | local_dataflow.rb:95:8:95:29 | ... or ... | @@ -2565,18 +2565,18 @@ | local_dataflow.rb:95:21:95:29 | call to source | local_dataflow.rb:95:8:95:29 | ... or ... | | local_dataflow.rb:96:3:96:9 | [post] self | local_dataflow.rb:98:7:98:15 | self | | local_dataflow.rb:96:3:96:9 | self | local_dataflow.rb:98:7:98:15 | self | -| local_dataflow.rb:98:3:98:28 | ... = ... | local_dataflow.rb:99:8:99:8 | a | +| local_dataflow.rb:98:3:98:3 | a | local_dataflow.rb:99:8:99:8 | a | | local_dataflow.rb:98:7:98:15 | [post] self | local_dataflow.rb:98:20:98:28 | self | | local_dataflow.rb:98:7:98:15 | call to source | local_dataflow.rb:98:7:98:28 | ... && ... | | local_dataflow.rb:98:7:98:15 | self | local_dataflow.rb:98:20:98:28 | self | -| local_dataflow.rb:98:7:98:28 | ... && ... | local_dataflow.rb:98:3:98:28 | ... = ... | +| local_dataflow.rb:98:7:98:28 | ... && ... | local_dataflow.rb:98:3:98:3 | a | | local_dataflow.rb:98:7:98:28 | ... && ... | local_dataflow.rb:98:3:98:28 | ... = ... | | local_dataflow.rb:98:7:98:28 | SSA phi read(self) | local_dataflow.rb:99:3:99:9 | self | | local_dataflow.rb:98:20:98:28 | call to source | local_dataflow.rb:98:7:98:28 | ... && ... | | local_dataflow.rb:99:3:99:9 | [post] self | local_dataflow.rb:100:8:100:16 | self | | local_dataflow.rb:99:3:99:9 | self | local_dataflow.rb:100:8:100:16 | self | -| local_dataflow.rb:100:3:100:31 | ... = ... | local_dataflow.rb:101:8:101:8 | b | -| local_dataflow.rb:100:7:100:31 | ( ... ) | local_dataflow.rb:100:3:100:31 | ... = ... | +| local_dataflow.rb:100:3:100:3 | b | local_dataflow.rb:101:8:101:8 | b | +| local_dataflow.rb:100:7:100:31 | ( ... ) | local_dataflow.rb:100:3:100:3 | b | | local_dataflow.rb:100:7:100:31 | ( ... ) | local_dataflow.rb:100:3:100:31 | ... = ... | | local_dataflow.rb:100:8:100:16 | [post] self | local_dataflow.rb:100:22:100:30 | self | | local_dataflow.rb:100:8:100:16 | call to source | local_dataflow.rb:100:8:100:30 | ... and ... | @@ -2586,27 +2586,27 @@ | local_dataflow.rb:100:22:100:30 | call to source | local_dataflow.rb:100:8:100:30 | ... and ... | | local_dataflow.rb:101:3:101:9 | [post] self | local_dataflow.rb:103:7:103:15 | self | | local_dataflow.rb:101:3:101:9 | self | local_dataflow.rb:103:7:103:15 | self | -| local_dataflow.rb:103:3:103:15 | ... = ... | local_dataflow.rb:104:3:104:3 | a | +| local_dataflow.rb:103:3:103:3 | a | local_dataflow.rb:104:3:104:3 | a | | local_dataflow.rb:103:7:103:15 | [post] self | local_dataflow.rb:104:9:104:17 | self | -| local_dataflow.rb:103:7:103:15 | call to source | local_dataflow.rb:103:3:103:15 | ... = ... | +| local_dataflow.rb:103:7:103:15 | call to source | local_dataflow.rb:103:3:103:3 | a | | local_dataflow.rb:103:7:103:15 | call to source | local_dataflow.rb:103:3:103:15 | ... = ... | | local_dataflow.rb:103:7:103:15 | self | local_dataflow.rb:104:9:104:17 | self | | local_dataflow.rb:104:3:104:3 | a | local_dataflow.rb:104:5:104:7 | ... \|\| ... | -| local_dataflow.rb:104:3:104:17 | ... = ... | local_dataflow.rb:105:8:105:8 | a | -| local_dataflow.rb:104:5:104:7 | ... \|\| ... | local_dataflow.rb:104:3:104:17 | ... = ... | +| local_dataflow.rb:104:3:104:3 | a | local_dataflow.rb:105:8:105:8 | a | +| local_dataflow.rb:104:5:104:7 | ... \|\| ... | local_dataflow.rb:104:3:104:3 | a | | local_dataflow.rb:104:5:104:7 | ... \|\| ... | local_dataflow.rb:104:3:104:17 | ... = ... | | local_dataflow.rb:104:5:104:7 | SSA phi read(self) | local_dataflow.rb:105:3:105:9 | self | | local_dataflow.rb:104:9:104:17 | call to source | local_dataflow.rb:104:5:104:7 | ... \|\| ... | | local_dataflow.rb:105:3:105:9 | [post] self | local_dataflow.rb:106:7:106:15 | self | | local_dataflow.rb:105:3:105:9 | self | local_dataflow.rb:106:7:106:15 | self | -| local_dataflow.rb:106:3:106:15 | ... = ... | local_dataflow.rb:107:3:107:3 | b | +| local_dataflow.rb:106:3:106:3 | b | local_dataflow.rb:107:3:107:3 | b | | local_dataflow.rb:106:7:106:15 | [post] self | local_dataflow.rb:107:9:107:17 | self | -| local_dataflow.rb:106:7:106:15 | call to source | local_dataflow.rb:106:3:106:15 | ... = ... | +| local_dataflow.rb:106:7:106:15 | call to source | local_dataflow.rb:106:3:106:3 | b | | local_dataflow.rb:106:7:106:15 | call to source | local_dataflow.rb:106:3:106:15 | ... = ... | | local_dataflow.rb:106:7:106:15 | self | local_dataflow.rb:107:9:107:17 | self | | local_dataflow.rb:107:3:107:3 | b | local_dataflow.rb:107:5:107:7 | ... && ... | -| local_dataflow.rb:107:3:107:17 | ... = ... | local_dataflow.rb:108:8:108:8 | b | -| local_dataflow.rb:107:5:107:7 | ... && ... | local_dataflow.rb:107:3:107:17 | ... = ... | +| local_dataflow.rb:107:3:107:3 | b | local_dataflow.rb:108:8:108:8 | b | +| local_dataflow.rb:107:5:107:7 | ... && ... | local_dataflow.rb:107:3:107:3 | b | | local_dataflow.rb:107:5:107:7 | ... && ... | local_dataflow.rb:107:3:107:17 | ... = ... | | local_dataflow.rb:107:5:107:7 | SSA phi read(self) | local_dataflow.rb:108:3:108:9 | self | | local_dataflow.rb:107:9:107:17 | call to source | local_dataflow.rb:107:5:107:7 | ... && ... | @@ -2650,8 +2650,8 @@ | local_dataflow.rb:126:1:128:3 | self in use | local_dataflow.rb:126:1:128:3 | self (use) | | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | local_dataflow.rb:132:6:132:11 | self | | local_dataflow.rb:130:1:150:3 | self in use_use_madness | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | -| local_dataflow.rb:131:3:131:8 | ... = ... | local_dataflow.rb:132:10:132:10 | x | -| local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:8 | ... = ... | +| local_dataflow.rb:131:3:131:3 | x | local_dataflow.rb:132:10:132:10 | x | +| local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:3 | x | | local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:8 | ... = ... | | local_dataflow.rb:132:6:132:11 | [post] self | local_dataflow.rb:133:8:133:13 | self | | local_dataflow.rb:132:6:132:11 | self | local_dataflow.rb:133:8:133:13 | self | diff --git a/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.expected b/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.expected index 762fc9a70f1..b824d6d37a1 100644 --- a/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.expected +++ b/ruby/ql/test/library-tests/dataflow/local/InlineFlowTest.expected @@ -1,38 +1,63 @@ failures edges -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:79:25:79:25 | b | -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:80:29:80:29 | a | -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:82:12:82:12 | c | -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:83:12:83:12 | d | -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:84:12:84:12 | e | -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:85:27:85:27 | f | -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:86:33:86:33 | g | -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:87:25:87:25 | x | -| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:89:8:89:8 | z | -| local_dataflow.rb:93:7:93:15 | call to source : | local_dataflow.rb:94:8:94:8 | a | -| local_dataflow.rb:93:7:93:15 | call to source : | local_dataflow.rb:94:8:94:8 | a | -| local_dataflow.rb:93:20:93:28 | call to source : | local_dataflow.rb:94:8:94:8 | a | -| local_dataflow.rb:93:20:93:28 | call to source : | local_dataflow.rb:94:8:94:8 | a | -| local_dataflow.rb:95:8:95:16 | call to source : | local_dataflow.rb:96:8:96:8 | b | -| local_dataflow.rb:95:8:95:16 | call to source : | local_dataflow.rb:96:8:96:8 | b | -| local_dataflow.rb:95:21:95:29 | call to source : | local_dataflow.rb:96:8:96:8 | b | -| local_dataflow.rb:95:21:95:29 | call to source : | local_dataflow.rb:96:8:96:8 | b | -| local_dataflow.rb:98:7:98:15 | call to source : | local_dataflow.rb:99:8:99:8 | a | -| local_dataflow.rb:98:7:98:15 | call to source : | local_dataflow.rb:99:8:99:8 | a | -| local_dataflow.rb:98:20:98:28 | call to source : | local_dataflow.rb:99:8:99:8 | a | -| local_dataflow.rb:98:20:98:28 | call to source : | local_dataflow.rb:99:8:99:8 | a | -| local_dataflow.rb:100:8:100:16 | call to source : | local_dataflow.rb:101:8:101:8 | b | -| local_dataflow.rb:100:8:100:16 | call to source : | local_dataflow.rb:101:8:101:8 | b | -| local_dataflow.rb:100:22:100:30 | call to source : | local_dataflow.rb:101:8:101:8 | b | -| local_dataflow.rb:100:22:100:30 | call to source : | local_dataflow.rb:101:8:101:8 | b | -| local_dataflow.rb:103:7:103:15 | call to source : | local_dataflow.rb:105:8:105:8 | a | -| local_dataflow.rb:103:7:103:15 | call to source : | local_dataflow.rb:105:8:105:8 | a | -| local_dataflow.rb:104:9:104:17 | call to source : | local_dataflow.rb:105:8:105:8 | a | -| local_dataflow.rb:104:9:104:17 | call to source : | local_dataflow.rb:105:8:105:8 | a | -| local_dataflow.rb:106:7:106:15 | call to source : | local_dataflow.rb:108:8:108:8 | b | -| local_dataflow.rb:106:7:106:15 | call to source : | local_dataflow.rb:108:8:108:8 | b | -| local_dataflow.rb:107:9:107:17 | call to source : | local_dataflow.rb:108:8:108:8 | b | -| local_dataflow.rb:107:9:107:17 | call to source : | local_dataflow.rb:108:8:108:8 | b | +| local_dataflow.rb:78:3:78:3 | z : | local_dataflow.rb:89:8:89:8 | z | +| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:79:13:79:13 | b : | +| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:80:8:80:8 | a : | +| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:81:9:81:9 | c : | +| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:81:13:81:13 | d : | +| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:81:16:81:16 | e : | +| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:85:13:85:13 | f : | +| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:86:18:86:18 | g : | +| local_dataflow.rb:78:12:78:20 | call to source : | local_dataflow.rb:87:10:87:10 | x : | +| local_dataflow.rb:79:13:79:13 | b : | local_dataflow.rb:79:25:79:25 | b | +| local_dataflow.rb:80:8:80:8 | a : | local_dataflow.rb:80:29:80:29 | a | +| local_dataflow.rb:81:9:81:9 | c : | local_dataflow.rb:82:12:82:12 | c | +| local_dataflow.rb:81:13:81:13 | d : | local_dataflow.rb:83:12:83:12 | d | +| local_dataflow.rb:81:16:81:16 | e : | local_dataflow.rb:84:12:84:12 | e | +| local_dataflow.rb:85:13:85:13 | f : | local_dataflow.rb:85:27:85:27 | f | +| local_dataflow.rb:86:18:86:18 | g : | local_dataflow.rb:86:33:86:33 | g | +| local_dataflow.rb:87:10:87:10 | x : | local_dataflow.rb:78:3:78:3 | z : | +| local_dataflow.rb:87:10:87:10 | x : | local_dataflow.rb:87:25:87:25 | x | +| local_dataflow.rb:93:3:93:3 | a : | local_dataflow.rb:94:8:94:8 | a | +| local_dataflow.rb:93:3:93:3 | a : | local_dataflow.rb:94:8:94:8 | a | +| local_dataflow.rb:93:7:93:15 | call to source : | local_dataflow.rb:93:3:93:3 | a : | +| local_dataflow.rb:93:7:93:15 | call to source : | local_dataflow.rb:93:3:93:3 | a : | +| local_dataflow.rb:93:20:93:28 | call to source : | local_dataflow.rb:93:3:93:3 | a : | +| local_dataflow.rb:93:20:93:28 | call to source : | local_dataflow.rb:93:3:93:3 | a : | +| local_dataflow.rb:95:3:95:3 | b : | local_dataflow.rb:96:8:96:8 | b | +| local_dataflow.rb:95:3:95:3 | b : | local_dataflow.rb:96:8:96:8 | b | +| local_dataflow.rb:95:8:95:16 | call to source : | local_dataflow.rb:95:3:95:3 | b : | +| local_dataflow.rb:95:8:95:16 | call to source : | local_dataflow.rb:95:3:95:3 | b : | +| local_dataflow.rb:95:21:95:29 | call to source : | local_dataflow.rb:95:3:95:3 | b : | +| local_dataflow.rb:95:21:95:29 | call to source : | local_dataflow.rb:95:3:95:3 | b : | +| local_dataflow.rb:98:3:98:3 | a : | local_dataflow.rb:99:8:99:8 | a | +| local_dataflow.rb:98:3:98:3 | a : | local_dataflow.rb:99:8:99:8 | a | +| local_dataflow.rb:98:7:98:15 | call to source : | local_dataflow.rb:98:3:98:3 | a : | +| local_dataflow.rb:98:7:98:15 | call to source : | local_dataflow.rb:98:3:98:3 | a : | +| local_dataflow.rb:98:20:98:28 | call to source : | local_dataflow.rb:98:3:98:3 | a : | +| local_dataflow.rb:98:20:98:28 | call to source : | local_dataflow.rb:98:3:98:3 | a : | +| local_dataflow.rb:100:3:100:3 | b : | local_dataflow.rb:101:8:101:8 | b | +| local_dataflow.rb:100:3:100:3 | b : | local_dataflow.rb:101:8:101:8 | b | +| local_dataflow.rb:100:8:100:16 | call to source : | local_dataflow.rb:100:3:100:3 | b : | +| local_dataflow.rb:100:8:100:16 | call to source : | local_dataflow.rb:100:3:100:3 | b : | +| local_dataflow.rb:100:22:100:30 | call to source : | local_dataflow.rb:100:3:100:3 | b : | +| local_dataflow.rb:100:22:100:30 | call to source : | local_dataflow.rb:100:3:100:3 | b : | +| local_dataflow.rb:103:3:103:3 | a : | local_dataflow.rb:104:3:104:3 | a : | +| local_dataflow.rb:103:3:103:3 | a : | local_dataflow.rb:104:3:104:3 | a : | +| local_dataflow.rb:103:7:103:15 | call to source : | local_dataflow.rb:103:3:103:3 | a : | +| local_dataflow.rb:103:7:103:15 | call to source : | local_dataflow.rb:103:3:103:3 | a : | +| local_dataflow.rb:104:3:104:3 | a : | local_dataflow.rb:105:8:105:8 | a | +| local_dataflow.rb:104:3:104:3 | a : | local_dataflow.rb:105:8:105:8 | a | +| local_dataflow.rb:104:9:104:17 | call to source : | local_dataflow.rb:104:3:104:3 | a : | +| local_dataflow.rb:104:9:104:17 | call to source : | local_dataflow.rb:104:3:104:3 | a : | +| local_dataflow.rb:106:3:106:3 | b : | local_dataflow.rb:107:3:107:3 | b : | +| local_dataflow.rb:106:3:106:3 | b : | local_dataflow.rb:107:3:107:3 | b : | +| local_dataflow.rb:106:7:106:15 | call to source : | local_dataflow.rb:106:3:106:3 | b : | +| local_dataflow.rb:106:7:106:15 | call to source : | local_dataflow.rb:106:3:106:3 | b : | +| local_dataflow.rb:107:3:107:3 | b : | local_dataflow.rb:108:8:108:8 | b | +| local_dataflow.rb:107:3:107:3 | b : | local_dataflow.rb:108:8:108:8 | b | +| local_dataflow.rb:107:9:107:17 | call to source : | local_dataflow.rb:107:3:107:3 | b : | +| local_dataflow.rb:107:9:107:17 | call to source : | local_dataflow.rb:107:3:107:3 | b : | | local_dataflow.rb:112:8:112:16 | call to source : | local_dataflow.rb:112:8:112:20 | call to dup | | local_dataflow.rb:112:8:112:16 | call to source : | local_dataflow.rb:112:8:112:20 | call to dup | | local_dataflow.rb:113:8:113:16 | call to source : | local_dataflow.rb:113:8:113:20 | call to dup : | @@ -56,48 +81,73 @@ edges | local_dataflow.rb:123:8:123:45 | call to tap : | local_dataflow.rb:123:8:123:49 | call to dup | | local_dataflow.rb:123:8:123:45 | call to tap : | local_dataflow.rb:123:8:123:49 | call to dup | nodes +| local_dataflow.rb:78:3:78:3 | z : | semmle.label | z : | | local_dataflow.rb:78:12:78:20 | call to source : | semmle.label | call to source : | +| local_dataflow.rb:79:13:79:13 | b : | semmle.label | b : | | local_dataflow.rb:79:25:79:25 | b | semmle.label | b | +| local_dataflow.rb:80:8:80:8 | a : | semmle.label | a : | | local_dataflow.rb:80:29:80:29 | a | semmle.label | a | +| local_dataflow.rb:81:9:81:9 | c : | semmle.label | c : | +| local_dataflow.rb:81:13:81:13 | d : | semmle.label | d : | +| local_dataflow.rb:81:16:81:16 | e : | semmle.label | e : | | local_dataflow.rb:82:12:82:12 | c | semmle.label | c | | local_dataflow.rb:83:12:83:12 | d | semmle.label | d | | local_dataflow.rb:84:12:84:12 | e | semmle.label | e | +| local_dataflow.rb:85:13:85:13 | f : | semmle.label | f : | | local_dataflow.rb:85:27:85:27 | f | semmle.label | f | +| local_dataflow.rb:86:18:86:18 | g : | semmle.label | g : | | local_dataflow.rb:86:33:86:33 | g | semmle.label | g | +| local_dataflow.rb:87:10:87:10 | x : | semmle.label | x : | | local_dataflow.rb:87:25:87:25 | x | semmle.label | x | | local_dataflow.rb:89:8:89:8 | z | semmle.label | z | +| local_dataflow.rb:93:3:93:3 | a : | semmle.label | a : | +| local_dataflow.rb:93:3:93:3 | a : | semmle.label | a : | | local_dataflow.rb:93:7:93:15 | call to source : | semmle.label | call to source : | | local_dataflow.rb:93:7:93:15 | call to source : | semmle.label | call to source : | | local_dataflow.rb:93:20:93:28 | call to source : | semmle.label | call to source : | | local_dataflow.rb:93:20:93:28 | call to source : | semmle.label | call to source : | | local_dataflow.rb:94:8:94:8 | a | semmle.label | a | | local_dataflow.rb:94:8:94:8 | a | semmle.label | a | +| local_dataflow.rb:95:3:95:3 | b : | semmle.label | b : | +| local_dataflow.rb:95:3:95:3 | b : | semmle.label | b : | | local_dataflow.rb:95:8:95:16 | call to source : | semmle.label | call to source : | | local_dataflow.rb:95:8:95:16 | call to source : | semmle.label | call to source : | | local_dataflow.rb:95:21:95:29 | call to source : | semmle.label | call to source : | | local_dataflow.rb:95:21:95:29 | call to source : | semmle.label | call to source : | | local_dataflow.rb:96:8:96:8 | b | semmle.label | b | | local_dataflow.rb:96:8:96:8 | b | semmle.label | b | +| local_dataflow.rb:98:3:98:3 | a : | semmle.label | a : | +| local_dataflow.rb:98:3:98:3 | a : | semmle.label | a : | | local_dataflow.rb:98:7:98:15 | call to source : | semmle.label | call to source : | | local_dataflow.rb:98:7:98:15 | call to source : | semmle.label | call to source : | | local_dataflow.rb:98:20:98:28 | call to source : | semmle.label | call to source : | | local_dataflow.rb:98:20:98:28 | call to source : | semmle.label | call to source : | | local_dataflow.rb:99:8:99:8 | a | semmle.label | a | | local_dataflow.rb:99:8:99:8 | a | semmle.label | a | +| local_dataflow.rb:100:3:100:3 | b : | semmle.label | b : | +| local_dataflow.rb:100:3:100:3 | b : | semmle.label | b : | | local_dataflow.rb:100:8:100:16 | call to source : | semmle.label | call to source : | | local_dataflow.rb:100:8:100:16 | call to source : | semmle.label | call to source : | | local_dataflow.rb:100:22:100:30 | call to source : | semmle.label | call to source : | | local_dataflow.rb:100:22:100:30 | call to source : | semmle.label | call to source : | | local_dataflow.rb:101:8:101:8 | b | semmle.label | b | | local_dataflow.rb:101:8:101:8 | b | semmle.label | b | +| local_dataflow.rb:103:3:103:3 | a : | semmle.label | a : | +| local_dataflow.rb:103:3:103:3 | a : | semmle.label | a : | | local_dataflow.rb:103:7:103:15 | call to source : | semmle.label | call to source : | | local_dataflow.rb:103:7:103:15 | call to source : | semmle.label | call to source : | +| local_dataflow.rb:104:3:104:3 | a : | semmle.label | a : | +| local_dataflow.rb:104:3:104:3 | a : | semmle.label | a : | | local_dataflow.rb:104:9:104:17 | call to source : | semmle.label | call to source : | | local_dataflow.rb:104:9:104:17 | call to source : | semmle.label | call to source : | | local_dataflow.rb:105:8:105:8 | a | semmle.label | a | | local_dataflow.rb:105:8:105:8 | a | semmle.label | a | +| local_dataflow.rb:106:3:106:3 | b : | semmle.label | b : | +| local_dataflow.rb:106:3:106:3 | b : | semmle.label | b : | | local_dataflow.rb:106:7:106:15 | call to source : | semmle.label | call to source : | | local_dataflow.rb:106:7:106:15 | call to source : | semmle.label | call to source : | +| local_dataflow.rb:107:3:107:3 | b : | semmle.label | b : | +| local_dataflow.rb:107:3:107:3 | b : | semmle.label | b : | | local_dataflow.rb:107:9:107:17 | call to source : | semmle.label | call to source : | | local_dataflow.rb:107:9:107:17 | call to source : | semmle.label | call to source : | | local_dataflow.rb:108:8:108:8 | b | semmle.label | b | diff --git a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected index da8b1b82747..890bef5720e 100644 --- a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected @@ -1,107 +1,107 @@ | UseUseExplosion.rb:18:5:22:7 | self (m) | UseUseExplosion.rb:20:13:20:17 | self | | UseUseExplosion.rb:18:5:22:7 | self in m | UseUseExplosion.rb:18:5:22:7 | self (m) | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2081:20:2116 | SSA phi read(x) | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2111:20:2111 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2127:20:2127 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2143:20:2143 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2159:20:2159 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2175:20:2175 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2191:20:2191 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2207:20:2207 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2223:20:2223 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2239:20:2239 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2255:20:2255 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2271:20:2271 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2287:20:2287 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2303:20:2303 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2319:20:2319 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2335:20:2335 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2351:20:2351 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2367:20:2367 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2383:20:2383 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2399:20:2399 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2415:20:2415 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2431:20:2431 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2447:20:2447 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2463:20:2463 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2479:20:2479 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2495:20:2495 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2511:20:2511 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2527:20:2527 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2543:20:2543 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2559:20:2559 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2575:20:2575 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2591:20:2591 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2607:20:2607 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2623:20:2623 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2639:20:2639 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2655:20:2655 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2671:20:2671 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2687:20:2687 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2703:20:2703 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2719:20:2719 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2735:20:2735 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2751:20:2751 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2767:20:2767 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2783:20:2783 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2799:20:2799 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2815:20:2815 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2831:20:2831 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2847:20:2847 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2863:20:2863 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2879:20:2879 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2895:20:2895 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2911:20:2911 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2927:20:2927 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2943:20:2943 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2959:20:2959 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2975:20:2975 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:2991:20:2991 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3007:20:3007 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3023:20:3023 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3039:20:3039 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3055:20:3055 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3071:20:3071 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3087:20:3087 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3103:20:3103 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3119:20:3119 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3135:20:3135 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3151:20:3151 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3167:20:3167 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3183:20:3183 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3199:20:3199 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3215:20:3215 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3231:20:3231 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3247:20:3247 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3263:20:3263 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3279:20:3279 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3295:20:3295 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3311:20:3311 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3327:20:3327 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3343:20:3343 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3359:20:3359 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3375:20:3375 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3391:20:3391 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3407:20:3407 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3423:20:3423 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3439:20:3439 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3455:20:3455 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3471:20:3471 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3487:20:3487 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3503:20:3503 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3519:20:3519 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3535:20:3535 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3551:20:3551 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3567:20:3567 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3583:20:3583 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3599:20:3599 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3615:20:3615 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3631:20:3631 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3647:20:3647 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3663:20:3663 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3679:20:3679 | x | -| UseUseExplosion.rb:19:9:19:13 | ... = ... | UseUseExplosion.rb:20:3695:20:3695 | x | -| UseUseExplosion.rb:19:13:19:13 | 0 | UseUseExplosion.rb:19:9:19:13 | ... = ... | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2081:20:2116 | SSA phi read(x) | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2111:20:2111 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2127:20:2127 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2143:20:2143 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2159:20:2159 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2175:20:2175 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2191:20:2191 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2207:20:2207 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2223:20:2223 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2239:20:2239 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2255:20:2255 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2271:20:2271 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2287:20:2287 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2303:20:2303 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2319:20:2319 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2335:20:2335 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2351:20:2351 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2367:20:2367 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2383:20:2383 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2399:20:2399 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2415:20:2415 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2431:20:2431 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2447:20:2447 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2463:20:2463 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2479:20:2479 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2495:20:2495 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2511:20:2511 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2527:20:2527 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2543:20:2543 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2559:20:2559 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2575:20:2575 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2591:20:2591 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2607:20:2607 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2623:20:2623 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2639:20:2639 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2655:20:2655 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2671:20:2671 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2687:20:2687 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2703:20:2703 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2719:20:2719 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2735:20:2735 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2751:20:2751 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2767:20:2767 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2783:20:2783 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2799:20:2799 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2815:20:2815 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2831:20:2831 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2847:20:2847 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2863:20:2863 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2879:20:2879 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2895:20:2895 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2911:20:2911 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2927:20:2927 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2943:20:2943 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2959:20:2959 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2975:20:2975 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:2991:20:2991 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3007:20:3007 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3023:20:3023 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3039:20:3039 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3055:20:3055 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3071:20:3071 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3087:20:3087 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3103:20:3103 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3119:20:3119 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3135:20:3135 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3151:20:3151 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3167:20:3167 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3183:20:3183 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3199:20:3199 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3215:20:3215 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3231:20:3231 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3247:20:3247 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3263:20:3263 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3279:20:3279 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3295:20:3295 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3311:20:3311 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3327:20:3327 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3343:20:3343 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3359:20:3359 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3375:20:3375 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3391:20:3391 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3407:20:3407 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3423:20:3423 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3439:20:3439 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3455:20:3455 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3471:20:3471 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3487:20:3487 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3503:20:3503 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3519:20:3519 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3535:20:3535 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3551:20:3551 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3567:20:3567 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3583:20:3583 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3599:20:3599 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3615:20:3615 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3631:20:3631 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3647:20:3647 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3663:20:3663 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3679:20:3679 | x | +| UseUseExplosion.rb:19:9:19:9 | x | UseUseExplosion.rb:20:3695:20:3695 | x | +| UseUseExplosion.rb:19:13:19:13 | 0 | UseUseExplosion.rb:19:9:19:9 | x | | UseUseExplosion.rb:19:13:19:13 | 0 | UseUseExplosion.rb:19:9:19:13 | ... = ... | | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(self) | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | UseUseExplosion.rb:21:2111:21:2111 | x | @@ -2833,8 +2833,8 @@ | local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) | local_dataflow.rb:49:1:53:3 | self | | local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:1:9:1:9 | a | | local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:2:7:2:7 | a | -| local_dataflow.rb:2:3:2:7 | ... = ... | local_dataflow.rb:3:13:3:13 | b | -| local_dataflow.rb:2:7:2:7 | a | local_dataflow.rb:2:3:2:7 | ... = ... | +| local_dataflow.rb:2:3:2:3 | b | local_dataflow.rb:3:13:3:13 | b | +| local_dataflow.rb:2:7:2:7 | a | local_dataflow.rb:2:3:2:3 | b | | local_dataflow.rb:2:7:2:7 | a | local_dataflow.rb:2:3:2:7 | ... = ... | | local_dataflow.rb:2:7:2:7 | a | local_dataflow.rb:3:10:3:10 | a | | local_dataflow.rb:3:7:3:14 | ( ... ) | local_dataflow.rb:3:3:3:14 | ... = ... | @@ -2854,33 +2854,33 @@ | local_dataflow.rb:6:8:6:13 | ... = ... | local_dataflow.rb:6:7:6:14 | ( ... ) | | local_dataflow.rb:6:10:6:11 | ... + ... | local_dataflow.rb:6:8:6:13 | ... = ... | | local_dataflow.rb:6:13:6:13 | b | local_dataflow.rb:6:10:6:11 | ... + ... | -| local_dataflow.rb:9:1:9:15 | ... = ... | local_dataflow.rb:10:14:10:18 | array | +| local_dataflow.rb:9:1:9:5 | array | local_dataflow.rb:10:14:10:18 | array | | local_dataflow.rb:9:9:9:15 | Array | local_dataflow.rb:9:9:9:15 | call to [] | +| local_dataflow.rb:9:9:9:15 | call to [] | local_dataflow.rb:9:1:9:5 | array | | local_dataflow.rb:9:9:9:15 | call to [] | local_dataflow.rb:9:1:9:15 | ... = ... | -| local_dataflow.rb:9:9:9:15 | call to [] | local_dataflow.rb:9:1:9:15 | ... = ... | -| local_dataflow.rb:10:5:13:3 | ... = ... | local_dataflow.rb:12:5:12:5 | x | | local_dataflow.rb:10:5:13:3 | self | local_dataflow.rb:11:1:11:2 | self | | local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:5:13:3 | ... = ... | -| local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:5:13:3 | ... = ... | | local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:5:13:3 | __synth__0__1 | | local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:5:13:3 | __synth__0__1 | +| local_dataflow.rb:10:5:13:3 | __synth__0__1 | local_dataflow.rb:10:9:10:9 | x | | local_dataflow.rb:10:5:13:3 | call to each | local_dataflow.rb:10:1:13:3 | ... = ... | +| local_dataflow.rb:10:9:10:9 | x | local_dataflow.rb:12:5:12:5 | x | | local_dataflow.rb:10:14:10:18 | [post] array | local_dataflow.rb:15:10:15:14 | array | | local_dataflow.rb:10:14:10:18 | array | local_dataflow.rb:15:10:15:14 | array | | local_dataflow.rb:11:1:11:2 | [post] self | local_dataflow.rb:12:3:12:5 | self | | local_dataflow.rb:11:1:11:2 | self | local_dataflow.rb:12:3:12:5 | self | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | ... = ... | -| local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | ... = ... | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | __synth__0__1 | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | __synth__0__1 | +| local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:5:15:5 | x | | local_dataflow.rb:15:10:15:14 | [post] array | local_dataflow.rb:19:10:19:14 | array | | local_dataflow.rb:15:10:15:14 | array | local_dataflow.rb:19:10:19:14 | array | | local_dataflow.rb:16:9:16:10 | 10 | local_dataflow.rb:16:3:16:10 | break | -| local_dataflow.rb:19:1:21:3 | ... = ... | local_dataflow.rb:20:6:20:6 | x | -| local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:1:21:3 | ... = ... | | local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:1:21:3 | ... = ... | | local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:1:21:3 | __synth__0__1 | | local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:1:21:3 | __synth__0__1 | +| local_dataflow.rb:19:1:21:3 | __synth__0__1 | local_dataflow.rb:19:5:19:5 | x | +| local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:20:6:20:6 | x | | local_dataflow.rb:20:6:20:6 | x | local_dataflow.rb:20:6:20:10 | ... > ... | | local_dataflow.rb:20:10:20:10 | 1 | local_dataflow.rb:20:6:20:10 | ... > ... | | local_dataflow.rb:24:2:24:8 | break | local_dataflow.rb:23:1:25:3 | while ... | @@ -2889,7 +2889,7 @@ | local_dataflow.rb:28:15:28:22 | "module" | local_dataflow.rb:28:5:28:26 | M | | local_dataflow.rb:30:5:30:24 | C | local_dataflow.rb:30:1:30:24 | ... = ... | | local_dataflow.rb:30:14:30:20 | "class" | local_dataflow.rb:30:5:30:24 | C | -| local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:25 | ... = ... | +| local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:1 | x | | local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:25 | ... = ... | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:34:7:34:7 | x | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:35:6:35:6 | x | @@ -2943,9 +2943,9 @@ | local_dataflow.rb:73:7:73:7 | x | local_dataflow.rb:72:7:73:7 | then ... | | local_dataflow.rb:74:3:75:6 | else ... | local_dataflow.rb:69:7:76:5 | case ... | | local_dataflow.rb:75:6:75:6 | x | local_dataflow.rb:74:3:75:6 | else ... | -| local_dataflow.rb:78:3:88:5 | ... = ... | local_dataflow.rb:89:8:89:8 | z | +| local_dataflow.rb:78:3:78:3 | z | local_dataflow.rb:89:8:89:8 | z | | local_dataflow.rb:78:7:88:5 | SSA phi read(self) | local_dataflow.rb:89:3:89:9 | self | -| local_dataflow.rb:78:7:88:5 | case ... | local_dataflow.rb:78:3:88:5 | ... = ... | +| local_dataflow.rb:78:7:88:5 | case ... | local_dataflow.rb:78:3:78:3 | z | | local_dataflow.rb:78:7:88:5 | case ... | local_dataflow.rb:78:3:88:5 | ... = ... | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:79:20:79:26 | self | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:80:24:80:30 | self | @@ -3000,18 +3000,18 @@ | local_dataflow.rb:87:29:87:29 | x | local_dataflow.rb:87:15:87:48 | then ... | | local_dataflow.rb:92:1:109:3 | self (and_or) | local_dataflow.rb:93:7:93:15 | self | | local_dataflow.rb:92:1:109:3 | self in and_or | local_dataflow.rb:92:1:109:3 | self (and_or) | -| local_dataflow.rb:93:3:93:28 | ... = ... | local_dataflow.rb:94:8:94:8 | a | +| local_dataflow.rb:93:3:93:3 | a | local_dataflow.rb:94:8:94:8 | a | | local_dataflow.rb:93:7:93:15 | [post] self | local_dataflow.rb:93:20:93:28 | self | | local_dataflow.rb:93:7:93:15 | call to source | local_dataflow.rb:93:7:93:28 | ... \|\| ... | | local_dataflow.rb:93:7:93:15 | self | local_dataflow.rb:93:20:93:28 | self | -| local_dataflow.rb:93:7:93:28 | ... \|\| ... | local_dataflow.rb:93:3:93:28 | ... = ... | +| local_dataflow.rb:93:7:93:28 | ... \|\| ... | local_dataflow.rb:93:3:93:3 | a | | local_dataflow.rb:93:7:93:28 | ... \|\| ... | local_dataflow.rb:93:3:93:28 | ... = ... | | local_dataflow.rb:93:7:93:28 | SSA phi read(self) | local_dataflow.rb:94:3:94:9 | self | | local_dataflow.rb:93:20:93:28 | call to source | local_dataflow.rb:93:7:93:28 | ... \|\| ... | | local_dataflow.rb:94:3:94:9 | [post] self | local_dataflow.rb:95:8:95:16 | self | | local_dataflow.rb:94:3:94:9 | self | local_dataflow.rb:95:8:95:16 | self | -| local_dataflow.rb:95:3:95:30 | ... = ... | local_dataflow.rb:96:8:96:8 | b | -| local_dataflow.rb:95:7:95:30 | ( ... ) | local_dataflow.rb:95:3:95:30 | ... = ... | +| local_dataflow.rb:95:3:95:3 | b | local_dataflow.rb:96:8:96:8 | b | +| local_dataflow.rb:95:7:95:30 | ( ... ) | local_dataflow.rb:95:3:95:3 | b | | local_dataflow.rb:95:7:95:30 | ( ... ) | local_dataflow.rb:95:3:95:30 | ... = ... | | local_dataflow.rb:95:8:95:16 | [post] self | local_dataflow.rb:95:21:95:29 | self | | local_dataflow.rb:95:8:95:16 | call to source | local_dataflow.rb:95:8:95:29 | ... or ... | @@ -3021,18 +3021,18 @@ | local_dataflow.rb:95:21:95:29 | call to source | local_dataflow.rb:95:8:95:29 | ... or ... | | local_dataflow.rb:96:3:96:9 | [post] self | local_dataflow.rb:98:7:98:15 | self | | local_dataflow.rb:96:3:96:9 | self | local_dataflow.rb:98:7:98:15 | self | -| local_dataflow.rb:98:3:98:28 | ... = ... | local_dataflow.rb:99:8:99:8 | a | +| local_dataflow.rb:98:3:98:3 | a | local_dataflow.rb:99:8:99:8 | a | | local_dataflow.rb:98:7:98:15 | [post] self | local_dataflow.rb:98:20:98:28 | self | | local_dataflow.rb:98:7:98:15 | call to source | local_dataflow.rb:98:7:98:28 | ... && ... | | local_dataflow.rb:98:7:98:15 | self | local_dataflow.rb:98:20:98:28 | self | -| local_dataflow.rb:98:7:98:28 | ... && ... | local_dataflow.rb:98:3:98:28 | ... = ... | +| local_dataflow.rb:98:7:98:28 | ... && ... | local_dataflow.rb:98:3:98:3 | a | | local_dataflow.rb:98:7:98:28 | ... && ... | local_dataflow.rb:98:3:98:28 | ... = ... | | local_dataflow.rb:98:7:98:28 | SSA phi read(self) | local_dataflow.rb:99:3:99:9 | self | | local_dataflow.rb:98:20:98:28 | call to source | local_dataflow.rb:98:7:98:28 | ... && ... | | local_dataflow.rb:99:3:99:9 | [post] self | local_dataflow.rb:100:8:100:16 | self | | local_dataflow.rb:99:3:99:9 | self | local_dataflow.rb:100:8:100:16 | self | -| local_dataflow.rb:100:3:100:31 | ... = ... | local_dataflow.rb:101:8:101:8 | b | -| local_dataflow.rb:100:7:100:31 | ( ... ) | local_dataflow.rb:100:3:100:31 | ... = ... | +| local_dataflow.rb:100:3:100:3 | b | local_dataflow.rb:101:8:101:8 | b | +| local_dataflow.rb:100:7:100:31 | ( ... ) | local_dataflow.rb:100:3:100:3 | b | | local_dataflow.rb:100:7:100:31 | ( ... ) | local_dataflow.rb:100:3:100:31 | ... = ... | | local_dataflow.rb:100:8:100:16 | [post] self | local_dataflow.rb:100:22:100:30 | self | | local_dataflow.rb:100:8:100:16 | call to source | local_dataflow.rb:100:8:100:30 | ... and ... | @@ -3042,27 +3042,27 @@ | local_dataflow.rb:100:22:100:30 | call to source | local_dataflow.rb:100:8:100:30 | ... and ... | | local_dataflow.rb:101:3:101:9 | [post] self | local_dataflow.rb:103:7:103:15 | self | | local_dataflow.rb:101:3:101:9 | self | local_dataflow.rb:103:7:103:15 | self | -| local_dataflow.rb:103:3:103:15 | ... = ... | local_dataflow.rb:104:3:104:3 | a | +| local_dataflow.rb:103:3:103:3 | a | local_dataflow.rb:104:3:104:3 | a | | local_dataflow.rb:103:7:103:15 | [post] self | local_dataflow.rb:104:9:104:17 | self | -| local_dataflow.rb:103:7:103:15 | call to source | local_dataflow.rb:103:3:103:15 | ... = ... | +| local_dataflow.rb:103:7:103:15 | call to source | local_dataflow.rb:103:3:103:3 | a | | local_dataflow.rb:103:7:103:15 | call to source | local_dataflow.rb:103:3:103:15 | ... = ... | | local_dataflow.rb:103:7:103:15 | self | local_dataflow.rb:104:9:104:17 | self | | local_dataflow.rb:104:3:104:3 | a | local_dataflow.rb:104:5:104:7 | ... \|\| ... | -| local_dataflow.rb:104:3:104:17 | ... = ... | local_dataflow.rb:105:8:105:8 | a | -| local_dataflow.rb:104:5:104:7 | ... \|\| ... | local_dataflow.rb:104:3:104:17 | ... = ... | +| local_dataflow.rb:104:3:104:3 | a | local_dataflow.rb:105:8:105:8 | a | +| local_dataflow.rb:104:5:104:7 | ... \|\| ... | local_dataflow.rb:104:3:104:3 | a | | local_dataflow.rb:104:5:104:7 | ... \|\| ... | local_dataflow.rb:104:3:104:17 | ... = ... | | local_dataflow.rb:104:5:104:7 | SSA phi read(self) | local_dataflow.rb:105:3:105:9 | self | | local_dataflow.rb:104:9:104:17 | call to source | local_dataflow.rb:104:5:104:7 | ... \|\| ... | | local_dataflow.rb:105:3:105:9 | [post] self | local_dataflow.rb:106:7:106:15 | self | | local_dataflow.rb:105:3:105:9 | self | local_dataflow.rb:106:7:106:15 | self | -| local_dataflow.rb:106:3:106:15 | ... = ... | local_dataflow.rb:107:3:107:3 | b | +| local_dataflow.rb:106:3:106:3 | b | local_dataflow.rb:107:3:107:3 | b | | local_dataflow.rb:106:7:106:15 | [post] self | local_dataflow.rb:107:9:107:17 | self | -| local_dataflow.rb:106:7:106:15 | call to source | local_dataflow.rb:106:3:106:15 | ... = ... | +| local_dataflow.rb:106:7:106:15 | call to source | local_dataflow.rb:106:3:106:3 | b | | local_dataflow.rb:106:7:106:15 | call to source | local_dataflow.rb:106:3:106:15 | ... = ... | | local_dataflow.rb:106:7:106:15 | self | local_dataflow.rb:107:9:107:17 | self | | local_dataflow.rb:107:3:107:3 | b | local_dataflow.rb:107:5:107:7 | ... && ... | -| local_dataflow.rb:107:3:107:17 | ... = ... | local_dataflow.rb:108:8:108:8 | b | -| local_dataflow.rb:107:5:107:7 | ... && ... | local_dataflow.rb:107:3:107:17 | ... = ... | +| local_dataflow.rb:107:3:107:3 | b | local_dataflow.rb:108:8:108:8 | b | +| local_dataflow.rb:107:5:107:7 | ... && ... | local_dataflow.rb:107:3:107:3 | b | | local_dataflow.rb:107:5:107:7 | ... && ... | local_dataflow.rb:107:3:107:17 | ... = ... | | local_dataflow.rb:107:5:107:7 | SSA phi read(self) | local_dataflow.rb:108:3:108:9 | self | | local_dataflow.rb:107:9:107:17 | call to source | local_dataflow.rb:107:5:107:7 | ... && ... | @@ -3106,8 +3106,8 @@ | local_dataflow.rb:126:1:128:3 | self in use | local_dataflow.rb:126:1:128:3 | self (use) | | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | local_dataflow.rb:132:6:132:11 | self | | local_dataflow.rb:130:1:150:3 | self in use_use_madness | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | -| local_dataflow.rb:131:3:131:8 | ... = ... | local_dataflow.rb:132:10:132:10 | x | -| local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:8 | ... = ... | +| local_dataflow.rb:131:3:131:3 | x | local_dataflow.rb:132:10:132:10 | x | +| local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:3 | x | | local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:8 | ... = ... | | local_dataflow.rb:132:6:132:11 | [post] self | local_dataflow.rb:133:8:133:13 | self | | local_dataflow.rb:132:6:132:11 | self | local_dataflow.rb:133:8:133:13 | self | diff --git a/ruby/ql/test/library-tests/dataflow/params/params-flow.expected b/ruby/ql/test/library-tests/dataflow/params/params-flow.expected index 12db100a968..3b459c4a3e6 100644 --- a/ruby/ql/test/library-tests/dataflow/params/params-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/params/params-flow.expected @@ -22,17 +22,21 @@ edges | params_flow.rb:33:12:33:19 | call to taint : | params_flow.rb:25:12:25:13 | p1 : | | params_flow.rb:33:26:33:34 | call to taint : | params_flow.rb:25:17:25:24 | **kwargs [element :p2] : | | params_flow.rb:33:41:33:49 | call to taint : | params_flow.rb:25:17:25:24 | **kwargs [element :p3] : | -| params_flow.rb:34:14:34:22 | call to taint : | params_flow.rb:35:25:35:28 | args [element :p3] : | +| params_flow.rb:34:1:34:4 | args [element :p3] : | params_flow.rb:35:25:35:28 | args [element :p3] : | +| params_flow.rb:34:14:34:22 | call to taint : | params_flow.rb:34:1:34:4 | args [element :p3] : | | params_flow.rb:35:12:35:20 | call to taint : | params_flow.rb:25:12:25:13 | p1 : | | params_flow.rb:35:23:35:28 | ** ... [element :p3] : | params_flow.rb:25:17:25:24 | **kwargs [element :p3] : | | params_flow.rb:35:25:35:28 | args [element :p3] : | params_flow.rb:35:23:35:28 | ** ... [element :p3] : | -| params_flow.rb:37:16:37:24 | call to taint : | params_flow.rb:38:10:38:13 | args [element :p1] : | -| params_flow.rb:37:34:37:42 | call to taint : | params_flow.rb:38:10:38:13 | args [element :p2] : | +| params_flow.rb:37:1:37:4 | args [element :p1] : | params_flow.rb:38:10:38:13 | args [element :p1] : | +| params_flow.rb:37:1:37:4 | args [element :p2] : | params_flow.rb:38:10:38:13 | args [element :p2] : | +| params_flow.rb:37:16:37:24 | call to taint : | params_flow.rb:37:1:37:4 | args [element :p1] : | +| params_flow.rb:37:34:37:42 | call to taint : | params_flow.rb:37:1:37:4 | args [element :p2] : | | params_flow.rb:38:8:38:13 | ** ... [element :p1] : | params_flow.rb:25:12:25:13 | p1 : | | params_flow.rb:38:8:38:13 | ** ... [element :p2] : | params_flow.rb:25:17:25:24 | **kwargs [element :p2] : | | params_flow.rb:38:10:38:13 | args [element :p1] : | params_flow.rb:38:8:38:13 | ** ... [element :p1] : | | params_flow.rb:38:10:38:13 | args [element :p2] : | params_flow.rb:38:8:38:13 | ** ... [element :p2] : | -| params_flow.rb:40:16:40:24 | call to taint : | params_flow.rb:41:26:41:29 | args [element :p1] : | +| params_flow.rb:40:1:40:4 | args [element :p1] : | params_flow.rb:41:26:41:29 | args [element :p1] : | +| params_flow.rb:40:16:40:24 | call to taint : | params_flow.rb:40:1:40:4 | args [element :p1] : | | params_flow.rb:41:13:41:21 | call to taint : | params_flow.rb:16:18:16:19 | p2 : | | params_flow.rb:41:24:41:29 | ** ... [element :p1] : | params_flow.rb:16:13:16:14 | p1 : | | params_flow.rb:41:26:41:29 | args [element :p1] : | params_flow.rb:41:24:41:29 | ** ... [element :p1] : | @@ -40,7 +44,8 @@ edges | params_flow.rb:49:13:49:14 | p1 : | params_flow.rb:50:10:50:11 | p1 | | params_flow.rb:54:9:54:17 | call to taint : | params_flow.rb:49:13:49:14 | p1 : | | params_flow.rb:57:9:57:17 | call to taint : | params_flow.rb:49:13:49:14 | p1 : | -| params_flow.rb:62:8:62:16 | call to taint : | params_flow.rb:66:13:66:16 | args : | +| params_flow.rb:62:1:62:4 | args : | params_flow.rb:66:13:66:16 | args : | +| params_flow.rb:62:8:62:16 | call to taint : | params_flow.rb:62:1:62:4 | args : | | params_flow.rb:63:16:63:17 | *x [element 0] : | params_flow.rb:64:10:64:10 | x [element 0] : | | params_flow.rb:64:10:64:10 | x [element 0] : | params_flow.rb:64:10:64:13 | ...[...] | | params_flow.rb:66:12:66:16 | * ... [element 0] : | params_flow.rb:63:16:63:17 | *x [element 0] : | @@ -75,16 +80,20 @@ nodes | params_flow.rb:33:12:33:19 | call to taint : | semmle.label | call to taint : | | params_flow.rb:33:26:33:34 | call to taint : | semmle.label | call to taint : | | params_flow.rb:33:41:33:49 | call to taint : | semmle.label | call to taint : | +| params_flow.rb:34:1:34:4 | args [element :p3] : | semmle.label | args [element :p3] : | | params_flow.rb:34:14:34:22 | call to taint : | semmle.label | call to taint : | | params_flow.rb:35:12:35:20 | call to taint : | semmle.label | call to taint : | | params_flow.rb:35:23:35:28 | ** ... [element :p3] : | semmle.label | ** ... [element :p3] : | | params_flow.rb:35:25:35:28 | args [element :p3] : | semmle.label | args [element :p3] : | +| params_flow.rb:37:1:37:4 | args [element :p1] : | semmle.label | args [element :p1] : | +| params_flow.rb:37:1:37:4 | args [element :p2] : | semmle.label | args [element :p2] : | | params_flow.rb:37:16:37:24 | call to taint : | semmle.label | call to taint : | | params_flow.rb:37:34:37:42 | call to taint : | semmle.label | call to taint : | | params_flow.rb:38:8:38:13 | ** ... [element :p1] : | semmle.label | ** ... [element :p1] : | | params_flow.rb:38:8:38:13 | ** ... [element :p2] : | semmle.label | ** ... [element :p2] : | | params_flow.rb:38:10:38:13 | args [element :p1] : | semmle.label | args [element :p1] : | | params_flow.rb:38:10:38:13 | args [element :p2] : | semmle.label | args [element :p2] : | +| params_flow.rb:40:1:40:4 | args [element :p1] : | semmle.label | args [element :p1] : | | params_flow.rb:40:16:40:24 | call to taint : | semmle.label | call to taint : | | params_flow.rb:41:13:41:21 | call to taint : | semmle.label | call to taint : | | params_flow.rb:41:24:41:29 | ** ... [element :p1] : | semmle.label | ** ... [element :p1] : | @@ -94,6 +103,7 @@ nodes | params_flow.rb:50:10:50:11 | p1 | semmle.label | p1 | | params_flow.rb:54:9:54:17 | call to taint : | semmle.label | call to taint : | | params_flow.rb:57:9:57:17 | call to taint : | semmle.label | call to taint : | +| params_flow.rb:62:1:62:4 | args : | semmle.label | args : | | params_flow.rb:62:8:62:16 | call to taint : | semmle.label | call to taint : | | params_flow.rb:63:16:63:17 | *x [element 0] : | semmle.label | *x [element 0] : | | params_flow.rb:64:10:64:10 | x [element 0] : | semmle.label | x [element 0] : | diff --git a/ruby/ql/test/library-tests/dataflow/pathname-flow/pathame-flow.expected b/ruby/ql/test/library-tests/dataflow/pathname-flow/pathame-flow.expected index a13e860bd04..b248ef21157 100644 --- a/ruby/ql/test/library-tests/dataflow/pathname-flow/pathame-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/pathname-flow/pathame-flow.expected @@ -1,216 +1,290 @@ failures edges -| pathname_flow.rb:4:10:4:33 | call to new : | pathname_flow.rb:5:10:5:11 | pn | +| pathname_flow.rb:4:5:4:6 | pn : | pathname_flow.rb:5:10:5:11 | pn | +| pathname_flow.rb:4:10:4:33 | call to new : | pathname_flow.rb:4:5:4:6 | pn : | | pathname_flow.rb:4:23:4:32 | call to source : | pathname_flow.rb:4:10:4:33 | call to new : | -| pathname_flow.rb:9:7:9:30 | call to new : | pathname_flow.rb:11:8:11:12 | ... + ... | +| pathname_flow.rb:9:3:9:3 | a : | pathname_flow.rb:11:8:11:12 | ... + ... | +| pathname_flow.rb:9:7:9:30 | call to new : | pathname_flow.rb:9:3:9:3 | a : | | pathname_flow.rb:9:20:9:29 | call to source : | pathname_flow.rb:9:7:9:30 | call to new : | -| pathname_flow.rb:10:7:10:30 | call to new : | pathname_flow.rb:11:8:11:12 | ... + ... | +| pathname_flow.rb:10:3:10:3 | b : | pathname_flow.rb:11:8:11:12 | ... + ... | +| pathname_flow.rb:10:7:10:30 | call to new : | pathname_flow.rb:10:3:10:3 | b : | | pathname_flow.rb:10:20:10:29 | call to source : | pathname_flow.rb:10:7:10:30 | call to new : | -| pathname_flow.rb:15:8:15:31 | call to new : | pathname_flow.rb:16:8:16:9 | pn : | +| pathname_flow.rb:15:3:15:4 | pn : | pathname_flow.rb:16:8:16:9 | pn : | +| pathname_flow.rb:15:8:15:31 | call to new : | pathname_flow.rb:15:3:15:4 | pn : | | pathname_flow.rb:15:21:15:30 | call to source : | pathname_flow.rb:15:8:15:31 | call to new : | | pathname_flow.rb:16:8:16:9 | pn : | pathname_flow.rb:16:8:16:17 | call to dirname | -| pathname_flow.rb:20:7:20:30 | call to new : | pathname_flow.rb:21:3:21:3 | a : | +| pathname_flow.rb:20:3:20:3 | a : | pathname_flow.rb:21:3:21:3 | a : | +| pathname_flow.rb:20:7:20:30 | call to new : | pathname_flow.rb:20:3:20:3 | a : | | pathname_flow.rb:20:20:20:29 | call to source : | pathname_flow.rb:20:7:20:30 | call to new : | | pathname_flow.rb:21:3:21:3 | a : | pathname_flow.rb:21:23:21:23 | x : | | pathname_flow.rb:21:23:21:23 | x : | pathname_flow.rb:22:10:22:10 | x | -| pathname_flow.rb:27:7:27:30 | call to new : | pathname_flow.rb:28:8:28:8 | a : | +| pathname_flow.rb:27:3:27:3 | a : | pathname_flow.rb:28:8:28:8 | a : | +| pathname_flow.rb:27:7:27:30 | call to new : | pathname_flow.rb:27:3:27:3 | a : | | pathname_flow.rb:27:20:27:29 | call to source : | pathname_flow.rb:27:7:27:30 | call to new : | | pathname_flow.rb:28:8:28:8 | a : | pathname_flow.rb:28:8:28:22 | call to expand_path | -| pathname_flow.rb:32:7:32:30 | call to new : | pathname_flow.rb:35:8:35:8 | a : | +| pathname_flow.rb:32:3:32:3 | a : | pathname_flow.rb:35:8:35:8 | a : | +| pathname_flow.rb:32:7:32:30 | call to new : | pathname_flow.rb:32:3:32:3 | a : | | pathname_flow.rb:32:20:32:29 | call to source : | pathname_flow.rb:32:7:32:30 | call to new : | -| pathname_flow.rb:34:7:34:30 | call to new : | pathname_flow.rb:35:18:35:18 | c : | +| pathname_flow.rb:34:3:34:3 | c : | pathname_flow.rb:35:18:35:18 | c : | +| pathname_flow.rb:34:7:34:30 | call to new : | pathname_flow.rb:34:3:34:3 | c : | | pathname_flow.rb:34:20:34:29 | call to source : | pathname_flow.rb:34:7:34:30 | call to new : | | pathname_flow.rb:35:8:35:8 | a : | pathname_flow.rb:35:8:35:19 | call to join | | pathname_flow.rb:35:18:35:18 | c : | pathname_flow.rb:35:8:35:19 | call to join | -| pathname_flow.rb:39:7:39:30 | call to new : | pathname_flow.rb:40:8:40:8 | a : | +| pathname_flow.rb:39:3:39:3 | a : | pathname_flow.rb:40:8:40:8 | a : | +| pathname_flow.rb:39:7:39:30 | call to new : | pathname_flow.rb:39:3:39:3 | a : | | pathname_flow.rb:39:20:39:29 | call to source : | pathname_flow.rb:39:7:39:30 | call to new : | | pathname_flow.rb:40:8:40:8 | a : | pathname_flow.rb:40:8:40:17 | call to parent | -| pathname_flow.rb:44:7:44:30 | call to new : | pathname_flow.rb:45:8:45:8 | a : | +| pathname_flow.rb:44:3:44:3 | a : | pathname_flow.rb:45:8:45:8 | a : | +| pathname_flow.rb:44:7:44:30 | call to new : | pathname_flow.rb:44:3:44:3 | a : | | pathname_flow.rb:44:20:44:29 | call to source : | pathname_flow.rb:44:7:44:30 | call to new : | | pathname_flow.rb:45:8:45:8 | a : | pathname_flow.rb:45:8:45:19 | call to realpath | -| pathname_flow.rb:49:7:49:30 | call to new : | pathname_flow.rb:50:8:50:8 | a : | +| pathname_flow.rb:49:3:49:3 | a : | pathname_flow.rb:50:8:50:8 | a : | +| pathname_flow.rb:49:7:49:30 | call to new : | pathname_flow.rb:49:3:49:3 | a : | | pathname_flow.rb:49:20:49:29 | call to source : | pathname_flow.rb:49:7:49:30 | call to new : | | pathname_flow.rb:50:8:50:8 | a : | pathname_flow.rb:50:8:50:39 | call to relative_path_from | -| pathname_flow.rb:54:7:54:30 | call to new : | pathname_flow.rb:55:8:55:8 | a : | +| pathname_flow.rb:54:3:54:3 | a : | pathname_flow.rb:55:8:55:8 | a : | +| pathname_flow.rb:54:7:54:30 | call to new : | pathname_flow.rb:54:3:54:3 | a : | | pathname_flow.rb:54:20:54:29 | call to source : | pathname_flow.rb:54:7:54:30 | call to new : | | pathname_flow.rb:55:8:55:8 | a : | pathname_flow.rb:55:8:55:16 | call to to_path | -| pathname_flow.rb:59:7:59:30 | call to new : | pathname_flow.rb:60:8:60:8 | a : | +| pathname_flow.rb:59:3:59:3 | a : | pathname_flow.rb:60:8:60:8 | a : | +| pathname_flow.rb:59:7:59:30 | call to new : | pathname_flow.rb:59:3:59:3 | a : | | pathname_flow.rb:59:20:59:29 | call to source : | pathname_flow.rb:59:7:59:30 | call to new : | | pathname_flow.rb:60:8:60:8 | a : | pathname_flow.rb:60:8:60:13 | call to to_s | -| pathname_flow.rb:64:7:64:30 | call to new : | pathname_flow.rb:66:8:66:8 | b | +| pathname_flow.rb:64:3:64:3 | a : | pathname_flow.rb:65:3:65:3 | b : | +| pathname_flow.rb:64:7:64:30 | call to new : | pathname_flow.rb:64:3:64:3 | a : | | pathname_flow.rb:64:20:64:29 | call to source : | pathname_flow.rb:64:7:64:30 | call to new : | -| pathname_flow.rb:70:7:70:30 | call to new : | pathname_flow.rb:72:8:72:8 | b | +| pathname_flow.rb:65:3:65:3 | b : | pathname_flow.rb:66:8:66:8 | b | +| pathname_flow.rb:70:3:70:3 | a : | pathname_flow.rb:71:3:71:3 | b : | +| pathname_flow.rb:70:7:70:30 | call to new : | pathname_flow.rb:70:3:70:3 | a : | | pathname_flow.rb:70:20:70:29 | call to source : | pathname_flow.rb:70:7:70:30 | call to new : | -| pathname_flow.rb:76:7:76:30 | call to new : | pathname_flow.rb:77:7:77:7 | a : | +| pathname_flow.rb:71:3:71:3 | b : | pathname_flow.rb:72:8:72:8 | b | +| pathname_flow.rb:76:3:76:3 | a : | pathname_flow.rb:77:7:77:7 | a : | +| pathname_flow.rb:76:7:76:30 | call to new : | pathname_flow.rb:76:3:76:3 | a : | | pathname_flow.rb:76:20:76:29 | call to source : | pathname_flow.rb:76:7:76:30 | call to new : | +| pathname_flow.rb:77:3:77:3 | b : | pathname_flow.rb:78:8:78:8 | b | | pathname_flow.rb:77:7:77:7 | a : | pathname_flow.rb:77:7:77:16 | call to basename : | -| pathname_flow.rb:77:7:77:16 | call to basename : | pathname_flow.rb:78:8:78:8 | b | -| pathname_flow.rb:82:7:82:30 | call to new : | pathname_flow.rb:83:7:83:7 | a : | +| pathname_flow.rb:77:7:77:16 | call to basename : | pathname_flow.rb:77:3:77:3 | b : | +| pathname_flow.rb:82:3:82:3 | a : | pathname_flow.rb:83:7:83:7 | a : | +| pathname_flow.rb:82:7:82:30 | call to new : | pathname_flow.rb:82:3:82:3 | a : | | pathname_flow.rb:82:20:82:29 | call to source : | pathname_flow.rb:82:7:82:30 | call to new : | +| pathname_flow.rb:83:3:83:3 | b : | pathname_flow.rb:84:8:84:8 | b | | pathname_flow.rb:83:7:83:7 | a : | pathname_flow.rb:83:7:83:17 | call to cleanpath : | -| pathname_flow.rb:83:7:83:17 | call to cleanpath : | pathname_flow.rb:84:8:84:8 | b | -| pathname_flow.rb:88:7:88:30 | call to new : | pathname_flow.rb:89:7:89:7 | a : | +| pathname_flow.rb:83:7:83:17 | call to cleanpath : | pathname_flow.rb:83:3:83:3 | b : | +| pathname_flow.rb:88:3:88:3 | a : | pathname_flow.rb:89:7:89:7 | a : | +| pathname_flow.rb:88:7:88:30 | call to new : | pathname_flow.rb:88:3:88:3 | a : | | pathname_flow.rb:88:20:88:29 | call to source : | pathname_flow.rb:88:7:88:30 | call to new : | +| pathname_flow.rb:89:3:89:3 | b : | pathname_flow.rb:90:8:90:8 | b | | pathname_flow.rb:89:7:89:7 | a : | pathname_flow.rb:89:7:89:25 | call to sub : | -| pathname_flow.rb:89:7:89:25 | call to sub : | pathname_flow.rb:90:8:90:8 | b | -| pathname_flow.rb:94:7:94:30 | call to new : | pathname_flow.rb:95:7:95:7 | a : | +| pathname_flow.rb:89:7:89:25 | call to sub : | pathname_flow.rb:89:3:89:3 | b : | +| pathname_flow.rb:94:3:94:3 | a : | pathname_flow.rb:95:7:95:7 | a : | +| pathname_flow.rb:94:7:94:30 | call to new : | pathname_flow.rb:94:3:94:3 | a : | | pathname_flow.rb:94:20:94:29 | call to source : | pathname_flow.rb:94:7:94:30 | call to new : | +| pathname_flow.rb:95:3:95:3 | b : | pathname_flow.rb:96:8:96:8 | b | | pathname_flow.rb:95:7:95:7 | a : | pathname_flow.rb:95:7:95:23 | call to sub_ext : | -| pathname_flow.rb:95:7:95:23 | call to sub_ext : | pathname_flow.rb:96:8:96:8 | b | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:104:8:104:8 | b : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:107:8:107:8 | c : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:109:7:109:7 | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:112:7:112:7 | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:115:7:115:7 | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:118:7:118:7 | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:121:7:121:7 | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:124:7:124:7 | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:127:7:127:7 | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:130:7:130:7 | a : | -| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:133:7:133:7 | a : | +| pathname_flow.rb:95:7:95:23 | call to sub_ext : | pathname_flow.rb:95:3:95:3 | b : | +| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:103:3:103:3 | b : | +| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:106:3:106:3 | c : | +| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:109:7:109:7 | a : | +| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:112:7:112:7 | a : | +| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:115:7:115:7 | a : | +| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:118:7:118:7 | a : | +| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:121:7:121:7 | a : | +| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:124:7:124:7 | a : | +| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:127:7:127:7 | a : | +| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:130:7:130:7 | a : | +| pathname_flow.rb:101:3:101:3 | a : | pathname_flow.rb:133:7:133:7 | a : | +| pathname_flow.rb:101:7:101:30 | call to new : | pathname_flow.rb:101:3:101:3 | a : | | pathname_flow.rb:101:20:101:29 | call to source : | pathname_flow.rb:101:7:101:30 | call to new : | +| pathname_flow.rb:103:3:103:3 | b : | pathname_flow.rb:104:8:104:8 | b : | | pathname_flow.rb:104:8:104:8 | b : | pathname_flow.rb:104:8:104:17 | call to realpath | +| pathname_flow.rb:106:3:106:3 | c : | pathname_flow.rb:107:8:107:8 | c : | | pathname_flow.rb:107:8:107:8 | c : | pathname_flow.rb:107:8:107:17 | call to realpath | +| pathname_flow.rb:109:3:109:3 | d : | pathname_flow.rb:110:8:110:8 | d : | | pathname_flow.rb:109:7:109:7 | a : | pathname_flow.rb:109:7:109:16 | call to basename : | -| pathname_flow.rb:109:7:109:16 | call to basename : | pathname_flow.rb:110:8:110:8 | d : | +| pathname_flow.rb:109:7:109:16 | call to basename : | pathname_flow.rb:109:3:109:3 | d : | | pathname_flow.rb:110:8:110:8 | d : | pathname_flow.rb:110:8:110:17 | call to realpath | +| pathname_flow.rb:112:3:112:3 | e : | pathname_flow.rb:113:8:113:8 | e : | | pathname_flow.rb:112:7:112:7 | a : | pathname_flow.rb:112:7:112:17 | call to cleanpath : | -| pathname_flow.rb:112:7:112:17 | call to cleanpath : | pathname_flow.rb:113:8:113:8 | e : | +| pathname_flow.rb:112:7:112:17 | call to cleanpath : | pathname_flow.rb:112:3:112:3 | e : | | pathname_flow.rb:113:8:113:8 | e : | pathname_flow.rb:113:8:113:17 | call to realpath | +| pathname_flow.rb:115:3:115:3 | f : | pathname_flow.rb:116:8:116:8 | f : | | pathname_flow.rb:115:7:115:7 | a : | pathname_flow.rb:115:7:115:19 | call to expand_path : | -| pathname_flow.rb:115:7:115:19 | call to expand_path : | pathname_flow.rb:116:8:116:8 | f : | +| pathname_flow.rb:115:7:115:19 | call to expand_path : | pathname_flow.rb:115:3:115:3 | f : | | pathname_flow.rb:116:8:116:8 | f : | pathname_flow.rb:116:8:116:17 | call to realpath | +| pathname_flow.rb:118:3:118:3 | g : | pathname_flow.rb:119:8:119:8 | g : | | pathname_flow.rb:118:7:118:7 | a : | pathname_flow.rb:118:7:118:19 | call to join : | -| pathname_flow.rb:118:7:118:19 | call to join : | pathname_flow.rb:119:8:119:8 | g : | +| pathname_flow.rb:118:7:118:19 | call to join : | pathname_flow.rb:118:3:118:3 | g : | | pathname_flow.rb:119:8:119:8 | g : | pathname_flow.rb:119:8:119:17 | call to realpath | +| pathname_flow.rb:121:3:121:3 | h : | pathname_flow.rb:122:8:122:8 | h : | | pathname_flow.rb:121:7:121:7 | a : | pathname_flow.rb:121:7:121:16 | call to realpath : | -| pathname_flow.rb:121:7:121:16 | call to realpath : | pathname_flow.rb:122:8:122:8 | h : | +| pathname_flow.rb:121:7:121:16 | call to realpath : | pathname_flow.rb:121:3:121:3 | h : | | pathname_flow.rb:122:8:122:8 | h : | pathname_flow.rb:122:8:122:17 | call to realpath | +| pathname_flow.rb:124:3:124:3 | i : | pathname_flow.rb:125:8:125:8 | i : | | pathname_flow.rb:124:7:124:7 | a : | pathname_flow.rb:124:7:124:38 | call to relative_path_from : | -| pathname_flow.rb:124:7:124:38 | call to relative_path_from : | pathname_flow.rb:125:8:125:8 | i : | +| pathname_flow.rb:124:7:124:38 | call to relative_path_from : | pathname_flow.rb:124:3:124:3 | i : | | pathname_flow.rb:125:8:125:8 | i : | pathname_flow.rb:125:8:125:17 | call to realpath | +| pathname_flow.rb:127:3:127:3 | j : | pathname_flow.rb:128:8:128:8 | j : | | pathname_flow.rb:127:7:127:7 | a : | pathname_flow.rb:127:7:127:25 | call to sub : | -| pathname_flow.rb:127:7:127:25 | call to sub : | pathname_flow.rb:128:8:128:8 | j : | +| pathname_flow.rb:127:7:127:25 | call to sub : | pathname_flow.rb:127:3:127:3 | j : | | pathname_flow.rb:128:8:128:8 | j : | pathname_flow.rb:128:8:128:17 | call to realpath | +| pathname_flow.rb:130:3:130:3 | k : | pathname_flow.rb:131:8:131:8 | k : | | pathname_flow.rb:130:7:130:7 | a : | pathname_flow.rb:130:7:130:23 | call to sub_ext : | -| pathname_flow.rb:130:7:130:23 | call to sub_ext : | pathname_flow.rb:131:8:131:8 | k : | +| pathname_flow.rb:130:7:130:23 | call to sub_ext : | pathname_flow.rb:130:3:130:3 | k : | | pathname_flow.rb:131:8:131:8 | k : | pathname_flow.rb:131:8:131:17 | call to realpath | +| pathname_flow.rb:133:3:133:3 | l : | pathname_flow.rb:134:8:134:8 | l : | | pathname_flow.rb:133:7:133:7 | a : | pathname_flow.rb:133:7:133:15 | call to to_path : | -| pathname_flow.rb:133:7:133:15 | call to to_path : | pathname_flow.rb:134:8:134:8 | l : | +| pathname_flow.rb:133:7:133:15 | call to to_path : | pathname_flow.rb:133:3:133:3 | l : | | pathname_flow.rb:134:8:134:8 | l : | pathname_flow.rb:134:8:134:17 | call to realpath | nodes +| pathname_flow.rb:4:5:4:6 | pn : | semmle.label | pn : | | pathname_flow.rb:4:10:4:33 | call to new : | semmle.label | call to new : | | pathname_flow.rb:4:23:4:32 | call to source : | semmle.label | call to source : | | pathname_flow.rb:5:10:5:11 | pn | semmle.label | pn | +| pathname_flow.rb:9:3:9:3 | a : | semmle.label | a : | | pathname_flow.rb:9:7:9:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:9:20:9:29 | call to source : | semmle.label | call to source : | +| pathname_flow.rb:10:3:10:3 | b : | semmle.label | b : | | pathname_flow.rb:10:7:10:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:10:20:10:29 | call to source : | semmle.label | call to source : | | pathname_flow.rb:11:8:11:12 | ... + ... | semmle.label | ... + ... | +| pathname_flow.rb:15:3:15:4 | pn : | semmle.label | pn : | | pathname_flow.rb:15:8:15:31 | call to new : | semmle.label | call to new : | | pathname_flow.rb:15:21:15:30 | call to source : | semmle.label | call to source : | | pathname_flow.rb:16:8:16:9 | pn : | semmle.label | pn : | | pathname_flow.rb:16:8:16:17 | call to dirname | semmle.label | call to dirname | +| pathname_flow.rb:20:3:20:3 | a : | semmle.label | a : | | pathname_flow.rb:20:7:20:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:20:20:20:29 | call to source : | semmle.label | call to source : | | pathname_flow.rb:21:3:21:3 | a : | semmle.label | a : | | pathname_flow.rb:21:23:21:23 | x : | semmle.label | x : | | pathname_flow.rb:22:10:22:10 | x | semmle.label | x | +| pathname_flow.rb:27:3:27:3 | a : | semmle.label | a : | | pathname_flow.rb:27:7:27:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:27:20:27:29 | call to source : | semmle.label | call to source : | | pathname_flow.rb:28:8:28:8 | a : | semmle.label | a : | | pathname_flow.rb:28:8:28:22 | call to expand_path | semmle.label | call to expand_path | +| pathname_flow.rb:32:3:32:3 | a : | semmle.label | a : | | pathname_flow.rb:32:7:32:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:32:20:32:29 | call to source : | semmle.label | call to source : | +| pathname_flow.rb:34:3:34:3 | c : | semmle.label | c : | | pathname_flow.rb:34:7:34:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:34:20:34:29 | call to source : | semmle.label | call to source : | | pathname_flow.rb:35:8:35:8 | a : | semmle.label | a : | | pathname_flow.rb:35:8:35:19 | call to join | semmle.label | call to join | | pathname_flow.rb:35:18:35:18 | c : | semmle.label | c : | +| pathname_flow.rb:39:3:39:3 | a : | semmle.label | a : | | pathname_flow.rb:39:7:39:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:39:20:39:29 | call to source : | semmle.label | call to source : | | pathname_flow.rb:40:8:40:8 | a : | semmle.label | a : | | pathname_flow.rb:40:8:40:17 | call to parent | semmle.label | call to parent | +| pathname_flow.rb:44:3:44:3 | a : | semmle.label | a : | | pathname_flow.rb:44:7:44:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:44:20:44:29 | call to source : | semmle.label | call to source : | | pathname_flow.rb:45:8:45:8 | a : | semmle.label | a : | | pathname_flow.rb:45:8:45:19 | call to realpath | semmle.label | call to realpath | +| pathname_flow.rb:49:3:49:3 | a : | semmle.label | a : | | pathname_flow.rb:49:7:49:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:49:20:49:29 | call to source : | semmle.label | call to source : | | pathname_flow.rb:50:8:50:8 | a : | semmle.label | a : | | pathname_flow.rb:50:8:50:39 | call to relative_path_from | semmle.label | call to relative_path_from | +| pathname_flow.rb:54:3:54:3 | a : | semmle.label | a : | | pathname_flow.rb:54:7:54:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:54:20:54:29 | call to source : | semmle.label | call to source : | | pathname_flow.rb:55:8:55:8 | a : | semmle.label | a : | | pathname_flow.rb:55:8:55:16 | call to to_path | semmle.label | call to to_path | +| pathname_flow.rb:59:3:59:3 | a : | semmle.label | a : | | pathname_flow.rb:59:7:59:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:59:20:59:29 | call to source : | semmle.label | call to source : | | pathname_flow.rb:60:8:60:8 | a : | semmle.label | a : | | pathname_flow.rb:60:8:60:13 | call to to_s | semmle.label | call to to_s | +| pathname_flow.rb:64:3:64:3 | a : | semmle.label | a : | | pathname_flow.rb:64:7:64:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:64:20:64:29 | call to source : | semmle.label | call to source : | +| pathname_flow.rb:65:3:65:3 | b : | semmle.label | b : | | pathname_flow.rb:66:8:66:8 | b | semmle.label | b | +| pathname_flow.rb:70:3:70:3 | a : | semmle.label | a : | | pathname_flow.rb:70:7:70:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:70:20:70:29 | call to source : | semmle.label | call to source : | +| pathname_flow.rb:71:3:71:3 | b : | semmle.label | b : | | pathname_flow.rb:72:8:72:8 | b | semmle.label | b | +| pathname_flow.rb:76:3:76:3 | a : | semmle.label | a : | | pathname_flow.rb:76:7:76:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:76:20:76:29 | call to source : | semmle.label | call to source : | +| pathname_flow.rb:77:3:77:3 | b : | semmle.label | b : | | pathname_flow.rb:77:7:77:7 | a : | semmle.label | a : | | pathname_flow.rb:77:7:77:16 | call to basename : | semmle.label | call to basename : | | pathname_flow.rb:78:8:78:8 | b | semmle.label | b | +| pathname_flow.rb:82:3:82:3 | a : | semmle.label | a : | | pathname_flow.rb:82:7:82:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:82:20:82:29 | call to source : | semmle.label | call to source : | +| pathname_flow.rb:83:3:83:3 | b : | semmle.label | b : | | pathname_flow.rb:83:7:83:7 | a : | semmle.label | a : | | pathname_flow.rb:83:7:83:17 | call to cleanpath : | semmle.label | call to cleanpath : | | pathname_flow.rb:84:8:84:8 | b | semmle.label | b | +| pathname_flow.rb:88:3:88:3 | a : | semmle.label | a : | | pathname_flow.rb:88:7:88:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:88:20:88:29 | call to source : | semmle.label | call to source : | +| pathname_flow.rb:89:3:89:3 | b : | semmle.label | b : | | pathname_flow.rb:89:7:89:7 | a : | semmle.label | a : | | pathname_flow.rb:89:7:89:25 | call to sub : | semmle.label | call to sub : | | pathname_flow.rb:90:8:90:8 | b | semmle.label | b | +| pathname_flow.rb:94:3:94:3 | a : | semmle.label | a : | | pathname_flow.rb:94:7:94:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:94:20:94:29 | call to source : | semmle.label | call to source : | +| pathname_flow.rb:95:3:95:3 | b : | semmle.label | b : | | pathname_flow.rb:95:7:95:7 | a : | semmle.label | a : | | pathname_flow.rb:95:7:95:23 | call to sub_ext : | semmle.label | call to sub_ext : | | pathname_flow.rb:96:8:96:8 | b | semmle.label | b | +| pathname_flow.rb:101:3:101:3 | a : | semmle.label | a : | | pathname_flow.rb:101:7:101:30 | call to new : | semmle.label | call to new : | | pathname_flow.rb:101:20:101:29 | call to source : | semmle.label | call to source : | +| pathname_flow.rb:103:3:103:3 | b : | semmle.label | b : | | pathname_flow.rb:104:8:104:8 | b : | semmle.label | b : | | pathname_flow.rb:104:8:104:17 | call to realpath | semmle.label | call to realpath | +| pathname_flow.rb:106:3:106:3 | c : | semmle.label | c : | | pathname_flow.rb:107:8:107:8 | c : | semmle.label | c : | | pathname_flow.rb:107:8:107:17 | call to realpath | semmle.label | call to realpath | +| pathname_flow.rb:109:3:109:3 | d : | semmle.label | d : | | pathname_flow.rb:109:7:109:7 | a : | semmle.label | a : | | pathname_flow.rb:109:7:109:16 | call to basename : | semmle.label | call to basename : | | pathname_flow.rb:110:8:110:8 | d : | semmle.label | d : | | pathname_flow.rb:110:8:110:17 | call to realpath | semmle.label | call to realpath | +| pathname_flow.rb:112:3:112:3 | e : | semmle.label | e : | | pathname_flow.rb:112:7:112:7 | a : | semmle.label | a : | | pathname_flow.rb:112:7:112:17 | call to cleanpath : | semmle.label | call to cleanpath : | | pathname_flow.rb:113:8:113:8 | e : | semmle.label | e : | | pathname_flow.rb:113:8:113:17 | call to realpath | semmle.label | call to realpath | +| pathname_flow.rb:115:3:115:3 | f : | semmle.label | f : | | pathname_flow.rb:115:7:115:7 | a : | semmle.label | a : | | pathname_flow.rb:115:7:115:19 | call to expand_path : | semmle.label | call to expand_path : | | pathname_flow.rb:116:8:116:8 | f : | semmle.label | f : | | pathname_flow.rb:116:8:116:17 | call to realpath | semmle.label | call to realpath | +| pathname_flow.rb:118:3:118:3 | g : | semmle.label | g : | | pathname_flow.rb:118:7:118:7 | a : | semmle.label | a : | | pathname_flow.rb:118:7:118:19 | call to join : | semmle.label | call to join : | | pathname_flow.rb:119:8:119:8 | g : | semmle.label | g : | | pathname_flow.rb:119:8:119:17 | call to realpath | semmle.label | call to realpath | +| pathname_flow.rb:121:3:121:3 | h : | semmle.label | h : | | pathname_flow.rb:121:7:121:7 | a : | semmle.label | a : | | pathname_flow.rb:121:7:121:16 | call to realpath : | semmle.label | call to realpath : | | pathname_flow.rb:122:8:122:8 | h : | semmle.label | h : | | pathname_flow.rb:122:8:122:17 | call to realpath | semmle.label | call to realpath | +| pathname_flow.rb:124:3:124:3 | i : | semmle.label | i : | | pathname_flow.rb:124:7:124:7 | a : | semmle.label | a : | | pathname_flow.rb:124:7:124:38 | call to relative_path_from : | semmle.label | call to relative_path_from : | | pathname_flow.rb:125:8:125:8 | i : | semmle.label | i : | | pathname_flow.rb:125:8:125:17 | call to realpath | semmle.label | call to realpath | +| pathname_flow.rb:127:3:127:3 | j : | semmle.label | j : | | pathname_flow.rb:127:7:127:7 | a : | semmle.label | a : | | pathname_flow.rb:127:7:127:25 | call to sub : | semmle.label | call to sub : | | pathname_flow.rb:128:8:128:8 | j : | semmle.label | j : | | pathname_flow.rb:128:8:128:17 | call to realpath | semmle.label | call to realpath | +| pathname_flow.rb:130:3:130:3 | k : | semmle.label | k : | | pathname_flow.rb:130:7:130:7 | a : | semmle.label | a : | | pathname_flow.rb:130:7:130:23 | call to sub_ext : | semmle.label | call to sub_ext : | | pathname_flow.rb:131:8:131:8 | k : | semmle.label | k : | | pathname_flow.rb:131:8:131:17 | call to realpath | semmle.label | call to realpath | +| pathname_flow.rb:133:3:133:3 | l : | semmle.label | l : | | pathname_flow.rb:133:7:133:7 | a : | semmle.label | a : | | pathname_flow.rb:133:7:133:15 | call to to_path : | semmle.label | call to to_path : | | pathname_flow.rb:134:8:134:8 | l : | semmle.label | l : | diff --git a/ruby/ql/test/library-tests/dataflow/string-flow/string-flow.expected b/ruby/ql/test/library-tests/dataflow/string-flow/string-flow.expected index 122a1d8eb1f..651a6affec7 100644 --- a/ruby/ql/test/library-tests/dataflow/string-flow/string-flow.expected +++ b/ruby/ql/test/library-tests/dataflow/string-flow/string-flow.expected @@ -2,126 +2,161 @@ failures | string_flow.rb:85:10:85:10 | a | Unexpected result: hasValueFlow=a | | string_flow.rb:227:10:227:10 | a | Unexpected result: hasValueFlow=a | edges -| string_flow.rb:2:9:2:18 | call to source : | string_flow.rb:3:21:3:21 | a : | -| string_flow.rb:2:9:2:18 | call to source : | string_flow.rb:3:21:3:21 | a : | +| string_flow.rb:2:5:2:5 | a : | string_flow.rb:3:21:3:21 | a : | +| string_flow.rb:2:5:2:5 | a : | string_flow.rb:3:21:3:21 | a : | +| string_flow.rb:2:9:2:18 | call to source : | string_flow.rb:2:5:2:5 | a : | +| string_flow.rb:2:9:2:18 | call to source : | string_flow.rb:2:5:2:5 | a : | | string_flow.rb:3:21:3:21 | a : | string_flow.rb:3:10:3:22 | call to new | | string_flow.rb:3:21:3:21 | a : | string_flow.rb:3:10:3:22 | call to new | -| string_flow.rb:7:9:7:18 | call to source : | string_flow.rb:9:29:9:29 | a : | -| string_flow.rb:8:9:8:16 | call to source : | string_flow.rb:10:29:10:29 | b : | +| string_flow.rb:7:5:7:5 | a : | string_flow.rb:9:29:9:29 | a : | +| string_flow.rb:7:9:7:18 | call to source : | string_flow.rb:7:5:7:5 | a : | +| string_flow.rb:8:5:8:5 | b : | string_flow.rb:10:29:10:29 | b : | +| string_flow.rb:8:9:8:16 | call to source : | string_flow.rb:8:5:8:5 | b : | | string_flow.rb:9:29:9:29 | a : | string_flow.rb:9:10:9:30 | call to try_convert | | string_flow.rb:10:29:10:29 | b : | string_flow.rb:10:10:10:30 | call to try_convert | -| string_flow.rb:14:9:14:18 | call to source : | string_flow.rb:15:10:15:17 | ... % ... | -| string_flow.rb:14:9:14:18 | call to source : | string_flow.rb:15:17:15:17 | a : | -| string_flow.rb:14:9:14:18 | call to source : | string_flow.rb:16:10:16:29 | ... % ... | -| string_flow.rb:14:9:14:18 | call to source : | string_flow.rb:16:28:16:28 | a : | -| string_flow.rb:14:9:14:18 | call to source : | string_flow.rb:17:10:17:10 | a : | -| string_flow.rb:14:9:14:18 | call to source : | string_flow.rb:17:10:17:18 | ... % ... | +| string_flow.rb:14:5:14:5 | a : | string_flow.rb:15:10:15:17 | ... % ... | +| string_flow.rb:14:5:14:5 | a : | string_flow.rb:15:17:15:17 | a : | +| string_flow.rb:14:5:14:5 | a : | string_flow.rb:16:10:16:29 | ... % ... | +| string_flow.rb:14:5:14:5 | a : | string_flow.rb:16:28:16:28 | a : | +| string_flow.rb:14:5:14:5 | a : | string_flow.rb:17:10:17:10 | a : | +| string_flow.rb:14:5:14:5 | a : | string_flow.rb:17:10:17:18 | ... % ... | +| string_flow.rb:14:9:14:18 | call to source : | string_flow.rb:14:5:14:5 | a : | | string_flow.rb:15:17:15:17 | a : | string_flow.rb:15:10:15:17 | ... % ... | | string_flow.rb:16:28:16:28 | a : | string_flow.rb:16:10:16:29 | ... % ... | | string_flow.rb:17:10:17:10 | a : | string_flow.rb:17:10:17:18 | ... % ... | -| string_flow.rb:21:9:21:18 | call to source : | string_flow.rb:23:10:23:10 | b | -| string_flow.rb:27:9:27:18 | call to source : | string_flow.rb:29:10:29:10 | b | -| string_flow.rb:33:9:33:18 | call to source : | string_flow.rb:35:10:35:10 | b | -| string_flow.rb:33:9:33:18 | call to source : | string_flow.rb:37:10:37:10 | c | -| string_flow.rb:41:9:41:18 | call to source : | string_flow.rb:42:10:42:10 | a : | +| string_flow.rb:21:5:21:5 | a : | string_flow.rb:22:5:22:5 | b : | +| string_flow.rb:21:9:21:18 | call to source : | string_flow.rb:21:5:21:5 | a : | +| string_flow.rb:22:5:22:5 | b : | string_flow.rb:23:10:23:10 | b | +| string_flow.rb:27:5:27:5 | a : | string_flow.rb:28:5:28:5 | b : | +| string_flow.rb:27:9:27:18 | call to source : | string_flow.rb:27:5:27:5 | a : | +| string_flow.rb:28:5:28:5 | b : | string_flow.rb:29:10:29:10 | b | +| string_flow.rb:33:5:33:5 | a : | string_flow.rb:34:5:34:5 | b : | +| string_flow.rb:33:5:33:5 | a : | string_flow.rb:36:5:36:5 | c : | +| string_flow.rb:33:9:33:18 | call to source : | string_flow.rb:33:5:33:5 | a : | +| string_flow.rb:34:5:34:5 | b : | string_flow.rb:35:10:35:10 | b | +| string_flow.rb:36:5:36:5 | c : | string_flow.rb:37:10:37:10 | c | +| string_flow.rb:41:5:41:5 | a : | string_flow.rb:42:10:42:10 | a : | +| string_flow.rb:41:9:41:18 | call to source : | string_flow.rb:41:5:41:5 | a : | | string_flow.rb:42:10:42:10 | a : | string_flow.rb:42:10:42:12 | call to b | -| string_flow.rb:46:9:46:18 | call to source : | string_flow.rb:47:10:47:10 | a : | -| string_flow.rb:46:9:46:18 | call to source : | string_flow.rb:48:10:48:10 | a : | -| string_flow.rb:46:9:46:18 | call to source : | string_flow.rb:49:10:49:10 | a : | +| string_flow.rb:46:5:46:5 | a : | string_flow.rb:47:10:47:10 | a : | +| string_flow.rb:46:5:46:5 | a : | string_flow.rb:48:10:48:10 | a : | +| string_flow.rb:46:5:46:5 | a : | string_flow.rb:49:10:49:10 | a : | +| string_flow.rb:46:9:46:18 | call to source : | string_flow.rb:46:5:46:5 | a : | | string_flow.rb:47:10:47:10 | a : | string_flow.rb:47:10:47:23 | call to byteslice | | string_flow.rb:48:10:48:10 | a : | string_flow.rb:48:10:48:26 | call to byteslice | | string_flow.rb:49:10:49:10 | a : | string_flow.rb:49:10:49:26 | call to byteslice | -| string_flow.rb:53:9:53:18 | call to source : | string_flow.rb:54:10:54:10 | a : | -| string_flow.rb:53:9:53:18 | call to source : | string_flow.rb:55:10:55:10 | a : | +| string_flow.rb:53:5:53:5 | a : | string_flow.rb:54:10:54:10 | a : | +| string_flow.rb:53:5:53:5 | a : | string_flow.rb:55:10:55:10 | a : | +| string_flow.rb:53:9:53:18 | call to source : | string_flow.rb:53:5:53:5 | a : | | string_flow.rb:54:10:54:10 | a : | string_flow.rb:54:10:54:21 | call to capitalize | | string_flow.rb:55:10:55:10 | a : | string_flow.rb:55:10:55:22 | call to capitalize! | -| string_flow.rb:59:9:59:18 | call to source : | string_flow.rb:60:10:60:10 | a : | -| string_flow.rb:59:9:59:18 | call to source : | string_flow.rb:61:27:61:27 | a : | -| string_flow.rb:59:9:59:18 | call to source : | string_flow.rb:62:10:62:10 | a : | -| string_flow.rb:59:9:59:18 | call to source : | string_flow.rb:63:26:63:26 | a : | -| string_flow.rb:59:9:59:18 | call to source : | string_flow.rb:64:10:64:10 | a : | -| string_flow.rb:59:9:59:18 | call to source : | string_flow.rb:65:26:65:26 | a : | +| string_flow.rb:59:5:59:5 | a : | string_flow.rb:60:10:60:10 | a : | +| string_flow.rb:59:5:59:5 | a : | string_flow.rb:61:27:61:27 | a : | +| string_flow.rb:59:5:59:5 | a : | string_flow.rb:62:10:62:10 | a : | +| string_flow.rb:59:5:59:5 | a : | string_flow.rb:63:26:63:26 | a : | +| string_flow.rb:59:5:59:5 | a : | string_flow.rb:64:10:64:10 | a : | +| string_flow.rb:59:5:59:5 | a : | string_flow.rb:65:26:65:26 | a : | +| string_flow.rb:59:9:59:18 | call to source : | string_flow.rb:59:5:59:5 | a : | | string_flow.rb:60:10:60:10 | a : | string_flow.rb:60:10:60:21 | call to center | | string_flow.rb:61:27:61:27 | a : | string_flow.rb:61:10:61:28 | call to center | | string_flow.rb:62:10:62:10 | a : | string_flow.rb:62:10:62:20 | call to ljust | | string_flow.rb:63:26:63:26 | a : | string_flow.rb:63:10:63:27 | call to ljust | | string_flow.rb:64:10:64:10 | a : | string_flow.rb:64:10:64:20 | call to rjust | | string_flow.rb:65:26:65:26 | a : | string_flow.rb:65:10:65:27 | call to rjust | -| string_flow.rb:69:9:69:18 | call to source : | string_flow.rb:70:10:70:10 | a : | -| string_flow.rb:69:9:69:18 | call to source : | string_flow.rb:71:10:71:10 | a : | +| string_flow.rb:69:5:69:5 | a : | string_flow.rb:70:10:70:10 | a : | +| string_flow.rb:69:5:69:5 | a : | string_flow.rb:71:10:71:10 | a : | +| string_flow.rb:69:9:69:18 | call to source : | string_flow.rb:69:5:69:5 | a : | | string_flow.rb:70:10:70:10 | a : | string_flow.rb:70:10:70:16 | call to chomp | | string_flow.rb:71:10:71:10 | a : | string_flow.rb:71:10:71:17 | call to chomp! | -| string_flow.rb:75:9:75:18 | call to source : | string_flow.rb:76:10:76:10 | a : | -| string_flow.rb:75:9:75:18 | call to source : | string_flow.rb:77:10:77:10 | a : | +| string_flow.rb:75:5:75:5 | a : | string_flow.rb:76:10:76:10 | a : | +| string_flow.rb:75:5:75:5 | a : | string_flow.rb:77:10:77:10 | a : | +| string_flow.rb:75:9:75:18 | call to source : | string_flow.rb:75:5:75:5 | a : | | string_flow.rb:76:10:76:10 | a : | string_flow.rb:76:10:76:15 | call to chop | | string_flow.rb:77:10:77:10 | a : | string_flow.rb:77:10:77:16 | call to chop! | -| string_flow.rb:83:9:83:18 | call to source : | string_flow.rb:84:5:84:5 | a : | -| string_flow.rb:83:9:83:18 | call to source : | string_flow.rb:84:5:84:5 | a : | +| string_flow.rb:83:5:83:5 | a : | string_flow.rb:84:5:84:5 | a : | +| string_flow.rb:83:5:83:5 | a : | string_flow.rb:84:5:84:5 | a : | +| string_flow.rb:83:9:83:18 | call to source : | string_flow.rb:83:5:83:5 | a : | +| string_flow.rb:83:9:83:18 | call to source : | string_flow.rb:83:5:83:5 | a : | | string_flow.rb:84:5:84:5 | [post] a : | string_flow.rb:85:10:85:10 | a | | string_flow.rb:84:5:84:5 | [post] a : | string_flow.rb:85:10:85:10 | a | | string_flow.rb:84:5:84:5 | a : | string_flow.rb:84:5:84:5 | [post] a : | | string_flow.rb:84:5:84:5 | a : | string_flow.rb:84:5:84:5 | [post] a : | -| string_flow.rb:108:9:108:18 | call to source : | string_flow.rb:109:10:109:10 | a : | +| string_flow.rb:108:5:108:5 | a : | string_flow.rb:109:10:109:10 | a : | +| string_flow.rb:108:9:108:18 | call to source : | string_flow.rb:108:5:108:5 | a : | | string_flow.rb:109:10:109:10 | [post] a : | string_flow.rb:110:10:110:10 | a : | | string_flow.rb:109:10:109:10 | [post] a : | string_flow.rb:111:10:111:10 | a : | | string_flow.rb:109:10:109:10 | a : | string_flow.rb:109:10:109:10 | [post] a : | | string_flow.rb:109:10:109:10 | a : | string_flow.rb:109:10:109:22 | call to delete | | string_flow.rb:110:10:110:10 | a : | string_flow.rb:110:10:110:29 | call to delete_prefix | | string_flow.rb:111:10:111:10 | a : | string_flow.rb:111:10:111:29 | call to delete_suffix | -| string_flow.rb:115:9:115:18 | call to source : | string_flow.rb:116:10:116:10 | a : | -| string_flow.rb:115:9:115:18 | call to source : | string_flow.rb:117:10:117:10 | a : | -| string_flow.rb:115:9:115:18 | call to source : | string_flow.rb:118:10:118:10 | a : | -| string_flow.rb:115:9:115:18 | call to source : | string_flow.rb:119:10:119:10 | a : | -| string_flow.rb:115:9:115:18 | call to source : | string_flow.rb:120:10:120:10 | a : | -| string_flow.rb:115:9:115:18 | call to source : | string_flow.rb:121:10:121:10 | a : | +| string_flow.rb:115:5:115:5 | a : | string_flow.rb:116:10:116:10 | a : | +| string_flow.rb:115:5:115:5 | a : | string_flow.rb:117:10:117:10 | a : | +| string_flow.rb:115:5:115:5 | a : | string_flow.rb:118:10:118:10 | a : | +| string_flow.rb:115:5:115:5 | a : | string_flow.rb:119:10:119:10 | a : | +| string_flow.rb:115:5:115:5 | a : | string_flow.rb:120:10:120:10 | a : | +| string_flow.rb:115:5:115:5 | a : | string_flow.rb:121:10:121:10 | a : | +| string_flow.rb:115:9:115:18 | call to source : | string_flow.rb:115:5:115:5 | a : | | string_flow.rb:116:10:116:10 | a : | string_flow.rb:116:10:116:19 | call to downcase | | string_flow.rb:117:10:117:10 | a : | string_flow.rb:117:10:117:20 | call to downcase! | | string_flow.rb:118:10:118:10 | a : | string_flow.rb:118:10:118:19 | call to swapcase | | string_flow.rb:119:10:119:10 | a : | string_flow.rb:119:10:119:20 | call to swapcase! | | string_flow.rb:120:10:120:10 | a : | string_flow.rb:120:10:120:17 | call to upcase | | string_flow.rb:121:10:121:10 | a : | string_flow.rb:121:10:121:18 | call to upcase! | -| string_flow.rb:125:9:125:18 | call to source : | string_flow.rb:126:9:126:9 | a : | +| string_flow.rb:125:5:125:5 | a : | string_flow.rb:126:9:126:9 | a : | +| string_flow.rb:125:9:125:18 | call to source : | string_flow.rb:125:5:125:5 | a : | +| string_flow.rb:126:5:126:5 | b : | string_flow.rb:127:10:127:10 | b | +| string_flow.rb:126:5:126:5 | b : | string_flow.rb:128:10:128:10 | b : | | string_flow.rb:126:9:126:9 | a : | string_flow.rb:126:9:126:14 | call to dump : | -| string_flow.rb:126:9:126:14 | call to dump : | string_flow.rb:127:10:127:10 | b | -| string_flow.rb:126:9:126:14 | call to dump : | string_flow.rb:128:10:128:10 | b : | +| string_flow.rb:126:9:126:14 | call to dump : | string_flow.rb:126:5:126:5 | b : | | string_flow.rb:128:10:128:10 | b : | string_flow.rb:128:10:128:17 | call to undump | -| string_flow.rb:132:9:132:18 | call to source : | string_flow.rb:133:9:133:9 | a : | -| string_flow.rb:132:9:132:18 | call to source : | string_flow.rb:135:9:135:9 | a : | +| string_flow.rb:132:5:132:5 | a : | string_flow.rb:133:9:133:9 | a : | +| string_flow.rb:132:5:132:5 | a : | string_flow.rb:135:9:135:9 | a : | +| string_flow.rb:132:9:132:18 | call to source : | string_flow.rb:132:5:132:5 | a : | +| string_flow.rb:133:5:133:5 | b : | string_flow.rb:134:10:134:10 | b | | string_flow.rb:133:9:133:9 | a : | string_flow.rb:133:9:133:40 | call to each_line : | | string_flow.rb:133:9:133:9 | a : | string_flow.rb:133:24:133:27 | line : | -| string_flow.rb:133:9:133:40 | call to each_line : | string_flow.rb:134:10:134:10 | b | +| string_flow.rb:133:9:133:40 | call to each_line : | string_flow.rb:133:5:133:5 | b : | | string_flow.rb:133:24:133:27 | line : | string_flow.rb:133:35:133:38 | line | +| string_flow.rb:135:5:135:5 | c [element] : | string_flow.rb:136:10:136:10 | c [element] : | | string_flow.rb:135:9:135:9 | a : | string_flow.rb:135:9:135:19 | call to each_line [element] : | -| string_flow.rb:135:9:135:19 | call to each_line [element] : | string_flow.rb:136:10:136:10 | c [element] : | +| string_flow.rb:135:9:135:19 | call to each_line [element] : | string_flow.rb:135:5:135:5 | c [element] : | | string_flow.rb:136:10:136:10 | c [element] : | string_flow.rb:136:10:136:15 | call to to_a [element] : | | string_flow.rb:136:10:136:15 | call to to_a [element] : | string_flow.rb:136:10:136:18 | ...[...] | -| string_flow.rb:140:9:140:18 | call to source : | string_flow.rb:141:9:141:9 | a : | -| string_flow.rb:140:9:140:18 | call to source : | string_flow.rb:143:9:143:9 | a : | +| string_flow.rb:140:5:140:5 | a : | string_flow.rb:141:9:141:9 | a : | +| string_flow.rb:140:5:140:5 | a : | string_flow.rb:143:9:143:9 | a : | +| string_flow.rb:140:9:140:18 | call to source : | string_flow.rb:140:5:140:5 | a : | +| string_flow.rb:141:5:141:5 | b : | string_flow.rb:142:10:142:10 | b | | string_flow.rb:141:9:141:9 | a : | string_flow.rb:141:9:141:36 | call to lines : | | string_flow.rb:141:9:141:9 | a : | string_flow.rb:141:20:141:23 | line : | -| string_flow.rb:141:9:141:36 | call to lines : | string_flow.rb:142:10:142:10 | b | +| string_flow.rb:141:9:141:36 | call to lines : | string_flow.rb:141:5:141:5 | b : | | string_flow.rb:141:20:141:23 | line : | string_flow.rb:141:31:141:34 | line | +| string_flow.rb:143:5:143:5 | c [element] : | string_flow.rb:144:10:144:10 | c [element] : | | string_flow.rb:143:9:143:9 | a : | string_flow.rb:143:9:143:15 | call to lines [element] : | -| string_flow.rb:143:9:143:15 | call to lines [element] : | string_flow.rb:144:10:144:10 | c [element] : | +| string_flow.rb:143:9:143:15 | call to lines [element] : | string_flow.rb:143:5:143:5 | c [element] : | | string_flow.rb:144:10:144:10 | c [element] : | string_flow.rb:144:10:144:13 | ...[...] | -| string_flow.rb:148:9:148:18 | call to source : | string_flow.rb:149:10:149:10 | a : | -| string_flow.rb:148:9:148:18 | call to source : | string_flow.rb:150:10:150:10 | a : | -| string_flow.rb:148:9:148:18 | call to source : | string_flow.rb:151:10:151:10 | a : | -| string_flow.rb:148:9:148:18 | call to source : | string_flow.rb:152:10:152:10 | a : | +| string_flow.rb:148:5:148:5 | a : | string_flow.rb:149:10:149:10 | a : | +| string_flow.rb:148:5:148:5 | a : | string_flow.rb:150:10:150:10 | a : | +| string_flow.rb:148:5:148:5 | a : | string_flow.rb:151:10:151:10 | a : | +| string_flow.rb:148:5:148:5 | a : | string_flow.rb:152:10:152:10 | a : | +| string_flow.rb:148:9:148:18 | call to source : | string_flow.rb:148:5:148:5 | a : | | string_flow.rb:149:10:149:10 | a : | string_flow.rb:149:10:149:26 | call to encode | | string_flow.rb:150:10:150:10 | a : | string_flow.rb:150:10:150:27 | call to encode! | | string_flow.rb:151:10:151:10 | a : | string_flow.rb:151:10:151:28 | call to unicode_normalize | | string_flow.rb:152:10:152:10 | a : | string_flow.rb:152:10:152:29 | call to unicode_normalize! | -| string_flow.rb:156:9:156:18 | call to source : | string_flow.rb:157:10:157:10 | a : | +| string_flow.rb:156:5:156:5 | a : | string_flow.rb:157:10:157:10 | a : | +| string_flow.rb:156:9:156:18 | call to source : | string_flow.rb:156:5:156:5 | a : | | string_flow.rb:157:10:157:10 | a : | string_flow.rb:157:10:157:34 | call to force_encoding | -| string_flow.rb:161:9:161:18 | call to source : | string_flow.rb:162:10:162:10 | a : | +| string_flow.rb:161:5:161:5 | a : | string_flow.rb:162:10:162:10 | a : | +| string_flow.rb:161:9:161:18 | call to source : | string_flow.rb:161:5:161:5 | a : | | string_flow.rb:162:10:162:10 | a : | string_flow.rb:162:10:162:17 | call to freeze | -| string_flow.rb:166:9:166:18 | call to source : | string_flow.rb:168:10:168:10 | a : | -| string_flow.rb:166:9:166:18 | call to source : | string_flow.rb:169:10:169:10 | a : | -| string_flow.rb:166:9:166:18 | call to source : | string_flow.rb:170:10:170:10 | a : | -| string_flow.rb:166:9:166:18 | call to source : | string_flow.rb:171:10:171:10 | a : | -| string_flow.rb:167:9:167:18 | call to source : | string_flow.rb:168:22:168:22 | c : | -| string_flow.rb:167:9:167:18 | call to source : | string_flow.rb:169:23:169:23 | c : | +| string_flow.rb:166:5:166:5 | a : | string_flow.rb:168:10:168:10 | a : | +| string_flow.rb:166:5:166:5 | a : | string_flow.rb:169:10:169:10 | a : | +| string_flow.rb:166:5:166:5 | a : | string_flow.rb:170:10:170:10 | a : | +| string_flow.rb:166:5:166:5 | a : | string_flow.rb:171:10:171:10 | a : | +| string_flow.rb:166:9:166:18 | call to source : | string_flow.rb:166:5:166:5 | a : | +| string_flow.rb:167:5:167:5 | c : | string_flow.rb:168:22:168:22 | c : | +| string_flow.rb:167:5:167:5 | c : | string_flow.rb:169:23:169:23 | c : | +| string_flow.rb:167:9:167:18 | call to source : | string_flow.rb:167:5:167:5 | c : | | string_flow.rb:168:10:168:10 | a : | string_flow.rb:168:10:168:23 | call to gsub | | string_flow.rb:168:22:168:22 | c : | string_flow.rb:168:10:168:23 | call to gsub | | string_flow.rb:169:10:169:10 | a : | string_flow.rb:169:10:169:24 | call to gsub! | @@ -130,12 +165,14 @@ edges | string_flow.rb:170:32:170:41 | call to source : | string_flow.rb:170:10:170:43 | call to gsub | | string_flow.rb:171:10:171:10 | a : | string_flow.rb:171:10:171:44 | call to gsub! | | string_flow.rb:171:33:171:42 | call to source : | string_flow.rb:171:10:171:44 | call to gsub! | -| string_flow.rb:175:9:175:18 | call to source : | string_flow.rb:177:10:177:10 | a : | -| string_flow.rb:175:9:175:18 | call to source : | string_flow.rb:178:10:178:10 | a : | -| string_flow.rb:175:9:175:18 | call to source : | string_flow.rb:179:10:179:10 | a : | -| string_flow.rb:175:9:175:18 | call to source : | string_flow.rb:180:10:180:10 | a : | -| string_flow.rb:176:9:176:18 | call to source : | string_flow.rb:177:21:177:21 | c : | -| string_flow.rb:176:9:176:18 | call to source : | string_flow.rb:178:22:178:22 | c : | +| string_flow.rb:175:5:175:5 | a : | string_flow.rb:177:10:177:10 | a : | +| string_flow.rb:175:5:175:5 | a : | string_flow.rb:178:10:178:10 | a : | +| string_flow.rb:175:5:175:5 | a : | string_flow.rb:179:10:179:10 | a : | +| string_flow.rb:175:5:175:5 | a : | string_flow.rb:180:10:180:10 | a : | +| string_flow.rb:175:9:175:18 | call to source : | string_flow.rb:175:5:175:5 | a : | +| string_flow.rb:176:5:176:5 | c : | string_flow.rb:177:21:177:21 | c : | +| string_flow.rb:176:5:176:5 | c : | string_flow.rb:178:22:178:22 | c : | +| string_flow.rb:176:9:176:18 | call to source : | string_flow.rb:176:5:176:5 | c : | | string_flow.rb:177:10:177:10 | a : | string_flow.rb:177:10:177:22 | call to sub | | string_flow.rb:177:21:177:21 | c : | string_flow.rb:177:10:177:22 | call to sub | | string_flow.rb:178:10:178:10 | a : | string_flow.rb:178:10:178:23 | call to sub! | @@ -144,70 +181,84 @@ edges | string_flow.rb:179:31:179:40 | call to source : | string_flow.rb:179:10:179:42 | call to sub | | string_flow.rb:180:10:180:10 | a : | string_flow.rb:180:10:180:43 | call to sub! | | string_flow.rb:180:32:180:41 | call to source : | string_flow.rb:180:10:180:43 | call to sub! | -| string_flow.rb:191:9:191:18 | call to source : | string_flow.rb:192:10:192:10 | a : | +| string_flow.rb:191:5:191:5 | a : | string_flow.rb:192:10:192:10 | a : | +| string_flow.rb:191:9:191:18 | call to source : | string_flow.rb:191:5:191:5 | a : | | string_flow.rb:192:10:192:10 | a : | string_flow.rb:192:10:192:18 | call to inspect | -| string_flow.rb:196:9:196:18 | call to source : | string_flow.rb:197:10:197:10 | a : | -| string_flow.rb:196:9:196:18 | call to source : | string_flow.rb:198:10:198:10 | a : | -| string_flow.rb:196:9:196:18 | call to source : | string_flow.rb:199:10:199:10 | a : | -| string_flow.rb:196:9:196:18 | call to source : | string_flow.rb:200:10:200:10 | a : | -| string_flow.rb:196:9:196:18 | call to source : | string_flow.rb:201:10:201:10 | a : | -| string_flow.rb:196:9:196:18 | call to source : | string_flow.rb:202:10:202:10 | a : | +| string_flow.rb:196:5:196:5 | a : | string_flow.rb:197:10:197:10 | a : | +| string_flow.rb:196:5:196:5 | a : | string_flow.rb:198:10:198:10 | a : | +| string_flow.rb:196:5:196:5 | a : | string_flow.rb:199:10:199:10 | a : | +| string_flow.rb:196:5:196:5 | a : | string_flow.rb:200:10:200:10 | a : | +| string_flow.rb:196:5:196:5 | a : | string_flow.rb:201:10:201:10 | a : | +| string_flow.rb:196:5:196:5 | a : | string_flow.rb:202:10:202:10 | a : | +| string_flow.rb:196:9:196:18 | call to source : | string_flow.rb:196:5:196:5 | a : | | string_flow.rb:197:10:197:10 | a : | string_flow.rb:197:10:197:16 | call to strip | | string_flow.rb:198:10:198:10 | a : | string_flow.rb:198:10:198:17 | call to strip! | | string_flow.rb:199:10:199:10 | a : | string_flow.rb:199:10:199:17 | call to lstrip | | string_flow.rb:200:10:200:10 | a : | string_flow.rb:200:10:200:18 | call to lstrip! | | string_flow.rb:201:10:201:10 | a : | string_flow.rb:201:10:201:17 | call to rstrip | | string_flow.rb:202:10:202:10 | a : | string_flow.rb:202:10:202:18 | call to rstrip! | -| string_flow.rb:206:9:206:18 | call to source : | string_flow.rb:207:10:207:10 | a : | -| string_flow.rb:206:9:206:18 | call to source : | string_flow.rb:208:10:208:10 | a : | -| string_flow.rb:206:9:206:18 | call to source : | string_flow.rb:209:10:209:10 | a : | -| string_flow.rb:206:9:206:18 | call to source : | string_flow.rb:210:10:210:10 | a : | +| string_flow.rb:206:5:206:5 | a : | string_flow.rb:207:10:207:10 | a : | +| string_flow.rb:206:5:206:5 | a : | string_flow.rb:208:10:208:10 | a : | +| string_flow.rb:206:5:206:5 | a : | string_flow.rb:209:10:209:10 | a : | +| string_flow.rb:206:5:206:5 | a : | string_flow.rb:210:10:210:10 | a : | +| string_flow.rb:206:9:206:18 | call to source : | string_flow.rb:206:5:206:5 | a : | | string_flow.rb:207:10:207:10 | a : | string_flow.rb:207:10:207:15 | call to next | | string_flow.rb:208:10:208:10 | a : | string_flow.rb:208:10:208:16 | call to next! | | string_flow.rb:209:10:209:10 | a : | string_flow.rb:209:10:209:15 | call to succ | | string_flow.rb:210:10:210:10 | a : | string_flow.rb:210:10:210:16 | call to succ! | -| string_flow.rb:214:9:214:18 | call to source : | string_flow.rb:215:9:215:9 | a : | +| string_flow.rb:214:5:214:5 | a : | string_flow.rb:215:9:215:9 | a : | +| string_flow.rb:214:9:214:18 | call to source : | string_flow.rb:214:5:214:5 | a : | +| string_flow.rb:215:5:215:5 | b [element 0] : | string_flow.rb:216:10:216:10 | b [element 0] : | +| string_flow.rb:215:5:215:5 | b [element 1] : | string_flow.rb:217:10:217:10 | b [element 1] : | +| string_flow.rb:215:5:215:5 | b [element 2] : | string_flow.rb:218:10:218:10 | b [element 2] : | | string_flow.rb:215:9:215:9 | a : | string_flow.rb:215:9:215:24 | call to partition [element 0] : | | string_flow.rb:215:9:215:9 | a : | string_flow.rb:215:9:215:24 | call to partition [element 1] : | | string_flow.rb:215:9:215:9 | a : | string_flow.rb:215:9:215:24 | call to partition [element 2] : | -| string_flow.rb:215:9:215:24 | call to partition [element 0] : | string_flow.rb:216:10:216:10 | b [element 0] : | -| string_flow.rb:215:9:215:24 | call to partition [element 1] : | string_flow.rb:217:10:217:10 | b [element 1] : | -| string_flow.rb:215:9:215:24 | call to partition [element 2] : | string_flow.rb:218:10:218:10 | b [element 2] : | +| string_flow.rb:215:9:215:24 | call to partition [element 0] : | string_flow.rb:215:5:215:5 | b [element 0] : | +| string_flow.rb:215:9:215:24 | call to partition [element 1] : | string_flow.rb:215:5:215:5 | b [element 1] : | +| string_flow.rb:215:9:215:24 | call to partition [element 2] : | string_flow.rb:215:5:215:5 | b [element 2] : | | string_flow.rb:216:10:216:10 | b [element 0] : | string_flow.rb:216:10:216:13 | ...[...] | | string_flow.rb:217:10:217:10 | b [element 1] : | string_flow.rb:217:10:217:13 | ...[...] | | string_flow.rb:218:10:218:10 | b [element 2] : | string_flow.rb:218:10:218:13 | ...[...] | -| string_flow.rb:223:9:223:18 | call to source : | string_flow.rb:225:10:225:10 | a : | -| string_flow.rb:223:9:223:18 | call to source : | string_flow.rb:225:10:225:10 | a : | -| string_flow.rb:224:9:224:18 | call to source : | string_flow.rb:225:20:225:20 | b : | +| string_flow.rb:223:5:223:5 | a : | string_flow.rb:225:10:225:10 | a : | +| string_flow.rb:223:5:223:5 | a : | string_flow.rb:225:10:225:10 | a : | +| string_flow.rb:223:9:223:18 | call to source : | string_flow.rb:223:5:223:5 | a : | +| string_flow.rb:223:9:223:18 | call to source : | string_flow.rb:223:5:223:5 | a : | +| string_flow.rb:224:5:224:5 | b : | string_flow.rb:225:20:225:20 | b : | +| string_flow.rb:224:9:224:18 | call to source : | string_flow.rb:224:5:224:5 | b : | | string_flow.rb:225:10:225:10 | [post] a : | string_flow.rb:227:10:227:10 | a | | string_flow.rb:225:10:225:10 | [post] a : | string_flow.rb:227:10:227:10 | a | | string_flow.rb:225:10:225:10 | a : | string_flow.rb:225:10:225:10 | [post] a : | | string_flow.rb:225:10:225:10 | a : | string_flow.rb:225:10:225:10 | [post] a : | | string_flow.rb:225:20:225:20 | b : | string_flow.rb:225:10:225:10 | [post] a : | | string_flow.rb:225:20:225:20 | b : | string_flow.rb:225:10:225:21 | call to replace | -| string_flow.rb:231:9:231:18 | call to source : | string_flow.rb:232:10:232:10 | a : | +| string_flow.rb:231:5:231:5 | a : | string_flow.rb:232:10:232:10 | a : | +| string_flow.rb:231:9:231:18 | call to source : | string_flow.rb:231:5:231:5 | a : | | string_flow.rb:232:10:232:10 | a : | string_flow.rb:232:10:232:18 | call to reverse | -| string_flow.rb:236:9:236:18 | call to source : | string_flow.rb:237:9:237:9 | a : | -| string_flow.rb:236:9:236:18 | call to source : | string_flow.rb:238:9:238:9 | a : | -| string_flow.rb:236:9:236:18 | call to source : | string_flow.rb:240:9:240:9 | a : | +| string_flow.rb:236:5:236:5 | a : | string_flow.rb:237:9:237:9 | a : | +| string_flow.rb:236:5:236:5 | a : | string_flow.rb:238:9:238:9 | a : | +| string_flow.rb:236:5:236:5 | a : | string_flow.rb:240:9:240:9 | a : | +| string_flow.rb:236:9:236:18 | call to source : | string_flow.rb:236:5:236:5 | a : | | string_flow.rb:237:9:237:9 | a : | string_flow.rb:237:24:237:24 | x : | | string_flow.rb:237:24:237:24 | x : | string_flow.rb:237:35:237:35 | x | +| string_flow.rb:238:5:238:5 | b : | string_flow.rb:239:10:239:10 | b | | string_flow.rb:238:9:238:9 | a : | string_flow.rb:238:9:238:37 | call to scan : | | string_flow.rb:238:9:238:9 | a : | string_flow.rb:238:27:238:27 | y : | -| string_flow.rb:238:9:238:37 | call to scan : | string_flow.rb:239:10:239:10 | b | +| string_flow.rb:238:9:238:37 | call to scan : | string_flow.rb:238:5:238:5 | b : | | string_flow.rb:238:27:238:27 | y : | string_flow.rb:238:35:238:35 | y | +| string_flow.rb:240:5:240:5 | b [element] : | string_flow.rb:241:10:241:10 | b [element] : | +| string_flow.rb:240:5:240:5 | b [element] : | string_flow.rb:242:10:242:10 | b [element] : | | string_flow.rb:240:9:240:9 | a : | string_flow.rb:240:9:240:19 | call to scan [element] : | -| string_flow.rb:240:9:240:19 | call to scan [element] : | string_flow.rb:241:10:241:10 | b [element] : | -| string_flow.rb:240:9:240:19 | call to scan [element] : | string_flow.rb:242:10:242:10 | b [element] : | +| string_flow.rb:240:9:240:19 | call to scan [element] : | string_flow.rb:240:5:240:5 | b [element] : | | string_flow.rb:241:10:241:10 | b [element] : | string_flow.rb:241:10:241:13 | ...[...] | | string_flow.rb:242:10:242:10 | b [element] : | string_flow.rb:242:10:242:13 | ...[...] | -| string_flow.rb:246:5:246:18 | ... = ... : | string_flow.rb:250:26:250:26 | a : | -| string_flow.rb:246:9:246:18 | call to source : | string_flow.rb:246:5:246:18 | ... = ... : | -| string_flow.rb:246:9:246:18 | call to source : | string_flow.rb:247:10:247:10 | a : | -| string_flow.rb:246:9:246:18 | call to source : | string_flow.rb:248:20:248:20 | a : | -| string_flow.rb:246:9:246:18 | call to source : | string_flow.rb:249:5:249:5 | a : | -| string_flow.rb:246:9:246:18 | call to source : | string_flow.rb:252:10:252:10 | a : | -| string_flow.rb:246:9:246:18 | call to source : | string_flow.rb:253:21:253:21 | a : | +| string_flow.rb:246:5:246:5 | a : | string_flow.rb:247:10:247:10 | a : | +| string_flow.rb:246:5:246:5 | a : | string_flow.rb:248:20:248:20 | a : | +| string_flow.rb:246:5:246:5 | a : | string_flow.rb:249:5:249:5 | a : | +| string_flow.rb:246:5:246:5 | a : | string_flow.rb:250:26:250:26 | a : | +| string_flow.rb:246:5:246:5 | a : | string_flow.rb:252:10:252:10 | a : | +| string_flow.rb:246:5:246:5 | a : | string_flow.rb:253:21:253:21 | a : | +| string_flow.rb:246:9:246:18 | call to source : | string_flow.rb:246:5:246:5 | a : | | string_flow.rb:247:10:247:10 | a : | string_flow.rb:247:10:247:21 | call to scrub | | string_flow.rb:248:20:248:20 | a : | string_flow.rb:248:10:248:21 | call to scrub | | string_flow.rb:249:5:249:5 | a : | string_flow.rb:249:16:249:16 | x : | @@ -215,23 +266,29 @@ edges | string_flow.rb:250:26:250:26 | a : | string_flow.rb:250:10:250:28 | call to scrub | | string_flow.rb:252:10:252:10 | a : | string_flow.rb:252:10:252:22 | call to scrub! | | string_flow.rb:253:21:253:21 | a : | string_flow.rb:253:10:253:22 | call to scrub! | -| string_flow.rb:255:5:255:18 | ... = ... : | string_flow.rb:258:27:258:27 | a : | -| string_flow.rb:255:9:255:18 | call to source : | string_flow.rb:255:5:255:18 | ... = ... : | -| string_flow.rb:255:9:255:18 | call to source : | string_flow.rb:256:5:256:5 | a : | +| string_flow.rb:255:5:255:5 | a : | string_flow.rb:256:5:256:5 | a : | +| string_flow.rb:255:5:255:5 | a : | string_flow.rb:258:27:258:27 | a : | +| string_flow.rb:255:9:255:18 | call to source : | string_flow.rb:255:5:255:5 | a : | | string_flow.rb:256:5:256:5 | a : | string_flow.rb:256:17:256:17 | x : | | string_flow.rb:256:17:256:17 | x : | string_flow.rb:256:25:256:25 | x | | string_flow.rb:258:27:258:27 | a : | string_flow.rb:258:10:258:29 | call to scrub! | -| string_flow.rb:262:9:262:18 | call to source : | string_flow.rb:263:10:263:10 | a : | +| string_flow.rb:262:5:262:5 | a : | string_flow.rb:263:10:263:10 | a : | +| string_flow.rb:262:9:262:18 | call to source : | string_flow.rb:262:5:262:5 | a : | | string_flow.rb:263:10:263:10 | a : | string_flow.rb:263:10:263:22 | call to shellescape | -| string_flow.rb:267:9:267:18 | call to source : | string_flow.rb:268:9:268:9 | a : | +| string_flow.rb:267:5:267:5 | a : | string_flow.rb:268:9:268:9 | a : | +| string_flow.rb:267:9:267:18 | call to source : | string_flow.rb:267:5:267:5 | a : | +| string_flow.rb:268:5:268:5 | b [element] : | string_flow.rb:269:10:269:10 | b [element] : | | string_flow.rb:268:9:268:9 | a : | string_flow.rb:268:9:268:20 | call to shellsplit [element] : | -| string_flow.rb:268:9:268:20 | call to shellsplit [element] : | string_flow.rb:269:10:269:10 | b [element] : | +| string_flow.rb:268:9:268:20 | call to shellsplit [element] : | string_flow.rb:268:5:268:5 | b [element] : | | string_flow.rb:269:10:269:10 | b [element] : | string_flow.rb:269:10:269:13 | ...[...] | -| string_flow.rb:273:9:273:18 | call to source : | string_flow.rb:274:9:274:9 | a : | -| string_flow.rb:273:9:273:18 | call to source : | string_flow.rb:277:9:277:9 | a : | +| string_flow.rb:273:5:273:5 | a : | string_flow.rb:274:9:274:9 | a : | +| string_flow.rb:273:5:273:5 | a : | string_flow.rb:277:9:277:9 | a : | +| string_flow.rb:273:9:273:18 | call to source : | string_flow.rb:273:5:273:5 | a : | +| string_flow.rb:274:5:274:5 | b : | string_flow.rb:275:10:275:10 | b : | | string_flow.rb:274:9:274:9 | a : | string_flow.rb:274:9:274:18 | call to slice : | -| string_flow.rb:274:9:274:18 | call to slice : | string_flow.rb:275:10:275:10 | b : | +| string_flow.rb:274:9:274:18 | call to slice : | string_flow.rb:274:5:274:5 | b : | | string_flow.rb:275:10:275:10 | b : | string_flow.rb:275:10:275:13 | ...[...] | +| string_flow.rb:277:5:277:5 | b : | string_flow.rb:278:10:278:10 | b : | | string_flow.rb:277:9:277:9 | [post] a : | string_flow.rb:280:9:280:9 | a : | | string_flow.rb:277:9:277:9 | [post] a : | string_flow.rb:283:9:283:9 | a : | | string_flow.rb:277:9:277:9 | [post] a [element 1] : | string_flow.rb:283:9:283:9 | a [element 1] : | @@ -242,45 +299,53 @@ edges | string_flow.rb:277:9:277:9 | a : | string_flow.rb:277:9:277:9 | [post] a [element 2] : | | string_flow.rb:277:9:277:9 | a : | string_flow.rb:277:9:277:9 | [post] a [element] : | | string_flow.rb:277:9:277:9 | a : | string_flow.rb:277:9:277:19 | call to slice! : | -| string_flow.rb:277:9:277:19 | call to slice! : | string_flow.rb:278:10:278:10 | b : | +| string_flow.rb:277:9:277:19 | call to slice! : | string_flow.rb:277:5:277:5 | b : | | string_flow.rb:278:10:278:10 | b : | string_flow.rb:278:10:278:13 | ...[...] | +| string_flow.rb:280:5:280:5 | b : | string_flow.rb:281:10:281:10 | b : | | string_flow.rb:280:9:280:9 | a : | string_flow.rb:280:9:280:20 | call to split : | -| string_flow.rb:280:9:280:20 | call to split : | string_flow.rb:281:10:281:10 | b : | +| string_flow.rb:280:9:280:20 | call to split : | string_flow.rb:280:5:280:5 | b : | | string_flow.rb:281:10:281:10 | b : | string_flow.rb:281:10:281:13 | ...[...] | +| string_flow.rb:283:5:283:5 | b : | string_flow.rb:284:10:284:10 | b : | +| string_flow.rb:283:5:283:5 | b [element 0] : | string_flow.rb:284:10:284:10 | b [element 0] : | +| string_flow.rb:283:5:283:5 | b [element 1] : | string_flow.rb:284:10:284:10 | b [element 1] : | +| string_flow.rb:283:5:283:5 | b [element] : | string_flow.rb:284:10:284:10 | b [element] : | | string_flow.rb:283:9:283:9 | a : | string_flow.rb:283:9:283:14 | ...[...] : | | string_flow.rb:283:9:283:9 | a : | string_flow.rb:283:9:283:14 | ...[...] [element 0] : | | string_flow.rb:283:9:283:9 | a : | string_flow.rb:283:9:283:14 | ...[...] [element 1] : | | string_flow.rb:283:9:283:9 | a [element 1] : | string_flow.rb:283:9:283:14 | ...[...] [element 0] : | | string_flow.rb:283:9:283:9 | a [element 2] : | string_flow.rb:283:9:283:14 | ...[...] [element 1] : | | string_flow.rb:283:9:283:9 | a [element] : | string_flow.rb:283:9:283:14 | ...[...] [element] : | -| string_flow.rb:283:9:283:14 | ...[...] : | string_flow.rb:284:10:284:10 | b : | -| string_flow.rb:283:9:283:14 | ...[...] [element 0] : | string_flow.rb:284:10:284:10 | b [element 0] : | -| string_flow.rb:283:9:283:14 | ...[...] [element 1] : | string_flow.rb:284:10:284:10 | b [element 1] : | -| string_flow.rb:283:9:283:14 | ...[...] [element] : | string_flow.rb:284:10:284:10 | b [element] : | +| string_flow.rb:283:9:283:14 | ...[...] : | string_flow.rb:283:5:283:5 | b : | +| string_flow.rb:283:9:283:14 | ...[...] [element 0] : | string_flow.rb:283:5:283:5 | b [element 0] : | +| string_flow.rb:283:9:283:14 | ...[...] [element 1] : | string_flow.rb:283:5:283:5 | b [element 1] : | +| string_flow.rb:283:9:283:14 | ...[...] [element] : | string_flow.rb:283:5:283:5 | b [element] : | | string_flow.rb:284:10:284:10 | b : | string_flow.rb:284:10:284:13 | ...[...] | | string_flow.rb:284:10:284:10 | b [element 0] : | string_flow.rb:284:10:284:13 | ...[...] | | string_flow.rb:284:10:284:10 | b [element 1] : | string_flow.rb:284:10:284:13 | ...[...] | | string_flow.rb:284:10:284:10 | b [element] : | string_flow.rb:284:10:284:13 | ...[...] | -| string_flow.rb:288:9:288:18 | call to source : | string_flow.rb:289:10:289:10 | a : | -| string_flow.rb:288:9:288:18 | call to source : | string_flow.rb:290:10:290:10 | a : | -| string_flow.rb:288:9:288:18 | call to source : | string_flow.rb:291:10:291:10 | a : | -| string_flow.rb:288:9:288:18 | call to source : | string_flow.rb:292:10:292:10 | a : | +| string_flow.rb:288:5:288:5 | a : | string_flow.rb:289:10:289:10 | a : | +| string_flow.rb:288:5:288:5 | a : | string_flow.rb:290:10:290:10 | a : | +| string_flow.rb:288:5:288:5 | a : | string_flow.rb:291:10:291:10 | a : | +| string_flow.rb:288:5:288:5 | a : | string_flow.rb:292:10:292:10 | a : | +| string_flow.rb:288:9:288:18 | call to source : | string_flow.rb:288:5:288:5 | a : | | string_flow.rb:289:10:289:10 | a : | string_flow.rb:289:10:289:18 | call to squeeze | | string_flow.rb:290:10:290:10 | a : | string_flow.rb:290:10:290:23 | call to squeeze | | string_flow.rb:291:10:291:10 | a : | string_flow.rb:291:10:291:19 | call to squeeze! | | string_flow.rb:292:10:292:10 | a : | string_flow.rb:292:10:292:24 | call to squeeze! | -| string_flow.rb:296:9:296:18 | call to source : | string_flow.rb:297:10:297:10 | a : | -| string_flow.rb:296:9:296:18 | call to source : | string_flow.rb:298:10:298:10 | a : | +| string_flow.rb:296:5:296:5 | a : | string_flow.rb:297:10:297:10 | a : | +| string_flow.rb:296:5:296:5 | a : | string_flow.rb:298:10:298:10 | a : | +| string_flow.rb:296:9:296:18 | call to source : | string_flow.rb:296:5:296:5 | a : | | string_flow.rb:297:10:297:10 | a : | string_flow.rb:297:10:297:17 | call to to_str | | string_flow.rb:298:10:298:10 | a : | string_flow.rb:298:10:298:15 | call to to_s | -| string_flow.rb:302:9:302:18 | call to source : | string_flow.rb:303:10:303:10 | a : | -| string_flow.rb:302:9:302:18 | call to source : | string_flow.rb:304:22:304:22 | a : | -| string_flow.rb:302:9:302:18 | call to source : | string_flow.rb:305:10:305:10 | a : | -| string_flow.rb:302:9:302:18 | call to source : | string_flow.rb:306:23:306:23 | a : | -| string_flow.rb:302:9:302:18 | call to source : | string_flow.rb:307:10:307:10 | a : | -| string_flow.rb:302:9:302:18 | call to source : | string_flow.rb:308:24:308:24 | a : | -| string_flow.rb:302:9:302:18 | call to source : | string_flow.rb:309:10:309:10 | a : | -| string_flow.rb:302:9:302:18 | call to source : | string_flow.rb:310:25:310:25 | a : | +| string_flow.rb:302:5:302:5 | a : | string_flow.rb:303:10:303:10 | a : | +| string_flow.rb:302:5:302:5 | a : | string_flow.rb:304:22:304:22 | a : | +| string_flow.rb:302:5:302:5 | a : | string_flow.rb:305:10:305:10 | a : | +| string_flow.rb:302:5:302:5 | a : | string_flow.rb:306:23:306:23 | a : | +| string_flow.rb:302:5:302:5 | a : | string_flow.rb:307:10:307:10 | a : | +| string_flow.rb:302:5:302:5 | a : | string_flow.rb:308:24:308:24 | a : | +| string_flow.rb:302:5:302:5 | a : | string_flow.rb:309:10:309:10 | a : | +| string_flow.rb:302:5:302:5 | a : | string_flow.rb:310:25:310:25 | a : | +| string_flow.rb:302:9:302:18 | call to source : | string_flow.rb:302:5:302:5 | a : | | string_flow.rb:303:10:303:10 | a : | string_flow.rb:303:10:303:23 | call to tr | | string_flow.rb:304:22:304:22 | a : | string_flow.rb:304:10:304:23 | call to tr | | string_flow.rb:305:10:305:10 | a : | string_flow.rb:305:10:305:24 | call to tr! | @@ -289,9 +354,10 @@ edges | string_flow.rb:308:24:308:24 | a : | string_flow.rb:308:10:308:25 | call to tr_s | | string_flow.rb:309:10:309:10 | a : | string_flow.rb:309:10:309:26 | call to tr_s! | | string_flow.rb:310:25:310:25 | a : | string_flow.rb:310:10:310:26 | call to tr_s! | -| string_flow.rb:314:9:314:18 | call to source : | string_flow.rb:315:5:315:5 | a : | -| string_flow.rb:314:9:314:18 | call to source : | string_flow.rb:316:5:316:5 | a : | -| string_flow.rb:314:9:314:18 | call to source : | string_flow.rb:317:14:317:14 | a : | +| string_flow.rb:314:5:314:5 | a : | string_flow.rb:315:5:315:5 | a : | +| string_flow.rb:314:5:314:5 | a : | string_flow.rb:316:5:316:5 | a : | +| string_flow.rb:314:5:314:5 | a : | string_flow.rb:317:14:317:14 | a : | +| string_flow.rb:314:9:314:18 | call to source : | string_flow.rb:314:5:314:5 | a : | | string_flow.rb:315:5:315:5 | a : | string_flow.rb:315:20:315:20 | x : | | string_flow.rb:315:20:315:20 | x : | string_flow.rb:315:28:315:28 | x | | string_flow.rb:316:5:316:5 | a : | string_flow.rb:316:26:316:26 | x : | @@ -299,18 +365,23 @@ edges | string_flow.rb:317:14:317:14 | a : | string_flow.rb:317:20:317:20 | x : | | string_flow.rb:317:20:317:20 | x : | string_flow.rb:317:28:317:28 | x | nodes +| string_flow.rb:2:5:2:5 | a : | semmle.label | a : | +| string_flow.rb:2:5:2:5 | a : | semmle.label | a : | | string_flow.rb:2:9:2:18 | call to source : | semmle.label | call to source : | | string_flow.rb:2:9:2:18 | call to source : | semmle.label | call to source : | | string_flow.rb:3:10:3:22 | call to new | semmle.label | call to new | | string_flow.rb:3:10:3:22 | call to new | semmle.label | call to new | | string_flow.rb:3:21:3:21 | a : | semmle.label | a : | | string_flow.rb:3:21:3:21 | a : | semmle.label | a : | +| string_flow.rb:7:5:7:5 | a : | semmle.label | a : | | string_flow.rb:7:9:7:18 | call to source : | semmle.label | call to source : | +| string_flow.rb:8:5:8:5 | b : | semmle.label | b : | | string_flow.rb:8:9:8:16 | call to source : | semmle.label | call to source : | | string_flow.rb:9:10:9:30 | call to try_convert | semmle.label | call to try_convert | | string_flow.rb:9:29:9:29 | a : | semmle.label | a : | | string_flow.rb:10:10:10:30 | call to try_convert | semmle.label | call to try_convert | | string_flow.rb:10:29:10:29 | b : | semmle.label | b : | +| string_flow.rb:14:5:14:5 | a : | semmle.label | a : | | string_flow.rb:14:9:14:18 | call to source : | semmle.label | call to source : | | string_flow.rb:15:10:15:17 | ... % ... | semmle.label | ... % ... | | string_flow.rb:15:17:15:17 | a : | semmle.label | a : | @@ -318,16 +389,25 @@ nodes | string_flow.rb:16:28:16:28 | a : | semmle.label | a : | | string_flow.rb:17:10:17:10 | a : | semmle.label | a : | | string_flow.rb:17:10:17:18 | ... % ... | semmle.label | ... % ... | +| string_flow.rb:21:5:21:5 | a : | semmle.label | a : | | string_flow.rb:21:9:21:18 | call to source : | semmle.label | call to source : | +| string_flow.rb:22:5:22:5 | b : | semmle.label | b : | | string_flow.rb:23:10:23:10 | b | semmle.label | b | +| string_flow.rb:27:5:27:5 | a : | semmle.label | a : | | string_flow.rb:27:9:27:18 | call to source : | semmle.label | call to source : | +| string_flow.rb:28:5:28:5 | b : | semmle.label | b : | | string_flow.rb:29:10:29:10 | b | semmle.label | b | +| string_flow.rb:33:5:33:5 | a : | semmle.label | a : | | string_flow.rb:33:9:33:18 | call to source : | semmle.label | call to source : | +| string_flow.rb:34:5:34:5 | b : | semmle.label | b : | | string_flow.rb:35:10:35:10 | b | semmle.label | b | +| string_flow.rb:36:5:36:5 | c : | semmle.label | c : | | string_flow.rb:37:10:37:10 | c | semmle.label | c | +| string_flow.rb:41:5:41:5 | a : | semmle.label | a : | | string_flow.rb:41:9:41:18 | call to source : | semmle.label | call to source : | | string_flow.rb:42:10:42:10 | a : | semmle.label | a : | | string_flow.rb:42:10:42:12 | call to b | semmle.label | call to b | +| string_flow.rb:46:5:46:5 | a : | semmle.label | a : | | string_flow.rb:46:9:46:18 | call to source : | semmle.label | call to source : | | string_flow.rb:47:10:47:10 | a : | semmle.label | a : | | string_flow.rb:47:10:47:23 | call to byteslice | semmle.label | call to byteslice | @@ -335,11 +415,13 @@ nodes | string_flow.rb:48:10:48:26 | call to byteslice | semmle.label | call to byteslice | | string_flow.rb:49:10:49:10 | a : | semmle.label | a : | | string_flow.rb:49:10:49:26 | call to byteslice | semmle.label | call to byteslice | +| string_flow.rb:53:5:53:5 | a : | semmle.label | a : | | string_flow.rb:53:9:53:18 | call to source : | semmle.label | call to source : | | string_flow.rb:54:10:54:10 | a : | semmle.label | a : | | string_flow.rb:54:10:54:21 | call to capitalize | semmle.label | call to capitalize | | string_flow.rb:55:10:55:10 | a : | semmle.label | a : | | string_flow.rb:55:10:55:22 | call to capitalize! | semmle.label | call to capitalize! | +| string_flow.rb:59:5:59:5 | a : | semmle.label | a : | | string_flow.rb:59:9:59:18 | call to source : | semmle.label | call to source : | | string_flow.rb:60:10:60:10 | a : | semmle.label | a : | | string_flow.rb:60:10:60:21 | call to center | semmle.label | call to center | @@ -353,16 +435,20 @@ nodes | string_flow.rb:64:10:64:20 | call to rjust | semmle.label | call to rjust | | string_flow.rb:65:10:65:27 | call to rjust | semmle.label | call to rjust | | string_flow.rb:65:26:65:26 | a : | semmle.label | a : | +| string_flow.rb:69:5:69:5 | a : | semmle.label | a : | | string_flow.rb:69:9:69:18 | call to source : | semmle.label | call to source : | | string_flow.rb:70:10:70:10 | a : | semmle.label | a : | | string_flow.rb:70:10:70:16 | call to chomp | semmle.label | call to chomp | | string_flow.rb:71:10:71:10 | a : | semmle.label | a : | | string_flow.rb:71:10:71:17 | call to chomp! | semmle.label | call to chomp! | +| string_flow.rb:75:5:75:5 | a : | semmle.label | a : | | string_flow.rb:75:9:75:18 | call to source : | semmle.label | call to source : | | string_flow.rb:76:10:76:10 | a : | semmle.label | a : | | string_flow.rb:76:10:76:15 | call to chop | semmle.label | call to chop | | string_flow.rb:77:10:77:10 | a : | semmle.label | a : | | string_flow.rb:77:10:77:16 | call to chop! | semmle.label | call to chop! | +| string_flow.rb:83:5:83:5 | a : | semmle.label | a : | +| string_flow.rb:83:5:83:5 | a : | semmle.label | a : | | string_flow.rb:83:9:83:18 | call to source : | semmle.label | call to source : | | string_flow.rb:83:9:83:18 | call to source : | semmle.label | call to source : | | string_flow.rb:84:5:84:5 | [post] a : | semmle.label | [post] a : | @@ -371,6 +457,7 @@ nodes | string_flow.rb:84:5:84:5 | a : | semmle.label | a : | | string_flow.rb:85:10:85:10 | a | semmle.label | a | | string_flow.rb:85:10:85:10 | a | semmle.label | a | +| string_flow.rb:108:5:108:5 | a : | semmle.label | a : | | string_flow.rb:108:9:108:18 | call to source : | semmle.label | call to source : | | string_flow.rb:109:10:109:10 | [post] a : | semmle.label | [post] a : | | string_flow.rb:109:10:109:10 | a : | semmle.label | a : | @@ -379,6 +466,7 @@ nodes | string_flow.rb:110:10:110:29 | call to delete_prefix | semmle.label | call to delete_prefix | | string_flow.rb:111:10:111:10 | a : | semmle.label | a : | | string_flow.rb:111:10:111:29 | call to delete_suffix | semmle.label | call to delete_suffix | +| string_flow.rb:115:5:115:5 | a : | semmle.label | a : | | string_flow.rb:115:9:115:18 | call to source : | semmle.label | call to source : | | string_flow.rb:116:10:116:10 | a : | semmle.label | a : | | string_flow.rb:116:10:116:19 | call to downcase | semmle.label | call to downcase | @@ -392,33 +480,42 @@ nodes | string_flow.rb:120:10:120:17 | call to upcase | semmle.label | call to upcase | | string_flow.rb:121:10:121:10 | a : | semmle.label | a : | | string_flow.rb:121:10:121:18 | call to upcase! | semmle.label | call to upcase! | +| string_flow.rb:125:5:125:5 | a : | semmle.label | a : | | string_flow.rb:125:9:125:18 | call to source : | semmle.label | call to source : | +| string_flow.rb:126:5:126:5 | b : | semmle.label | b : | | string_flow.rb:126:9:126:9 | a : | semmle.label | a : | | string_flow.rb:126:9:126:14 | call to dump : | semmle.label | call to dump : | | string_flow.rb:127:10:127:10 | b | semmle.label | b | | string_flow.rb:128:10:128:10 | b : | semmle.label | b : | | string_flow.rb:128:10:128:17 | call to undump | semmle.label | call to undump | +| string_flow.rb:132:5:132:5 | a : | semmle.label | a : | | string_flow.rb:132:9:132:18 | call to source : | semmle.label | call to source : | +| string_flow.rb:133:5:133:5 | b : | semmle.label | b : | | string_flow.rb:133:9:133:9 | a : | semmle.label | a : | | string_flow.rb:133:9:133:40 | call to each_line : | semmle.label | call to each_line : | | string_flow.rb:133:24:133:27 | line : | semmle.label | line : | | string_flow.rb:133:35:133:38 | line | semmle.label | line | | string_flow.rb:134:10:134:10 | b | semmle.label | b | +| string_flow.rb:135:5:135:5 | c [element] : | semmle.label | c [element] : | | string_flow.rb:135:9:135:9 | a : | semmle.label | a : | | string_flow.rb:135:9:135:19 | call to each_line [element] : | semmle.label | call to each_line [element] : | | string_flow.rb:136:10:136:10 | c [element] : | semmle.label | c [element] : | | string_flow.rb:136:10:136:15 | call to to_a [element] : | semmle.label | call to to_a [element] : | | string_flow.rb:136:10:136:18 | ...[...] | semmle.label | ...[...] | +| string_flow.rb:140:5:140:5 | a : | semmle.label | a : | | string_flow.rb:140:9:140:18 | call to source : | semmle.label | call to source : | +| string_flow.rb:141:5:141:5 | b : | semmle.label | b : | | string_flow.rb:141:9:141:9 | a : | semmle.label | a : | | string_flow.rb:141:9:141:36 | call to lines : | semmle.label | call to lines : | | string_flow.rb:141:20:141:23 | line : | semmle.label | line : | | string_flow.rb:141:31:141:34 | line | semmle.label | line | | string_flow.rb:142:10:142:10 | b | semmle.label | b | +| string_flow.rb:143:5:143:5 | c [element] : | semmle.label | c [element] : | | string_flow.rb:143:9:143:9 | a : | semmle.label | a : | | string_flow.rb:143:9:143:15 | call to lines [element] : | semmle.label | call to lines [element] : | | string_flow.rb:144:10:144:10 | c [element] : | semmle.label | c [element] : | | string_flow.rb:144:10:144:13 | ...[...] | semmle.label | ...[...] | +| string_flow.rb:148:5:148:5 | a : | semmle.label | a : | | string_flow.rb:148:9:148:18 | call to source : | semmle.label | call to source : | | string_flow.rb:149:10:149:10 | a : | semmle.label | a : | | string_flow.rb:149:10:149:26 | call to encode | semmle.label | call to encode | @@ -428,13 +525,17 @@ nodes | string_flow.rb:151:10:151:28 | call to unicode_normalize | semmle.label | call to unicode_normalize | | string_flow.rb:152:10:152:10 | a : | semmle.label | a : | | string_flow.rb:152:10:152:29 | call to unicode_normalize! | semmle.label | call to unicode_normalize! | +| string_flow.rb:156:5:156:5 | a : | semmle.label | a : | | string_flow.rb:156:9:156:18 | call to source : | semmle.label | call to source : | | string_flow.rb:157:10:157:10 | a : | semmle.label | a : | | string_flow.rb:157:10:157:34 | call to force_encoding | semmle.label | call to force_encoding | +| string_flow.rb:161:5:161:5 | a : | semmle.label | a : | | string_flow.rb:161:9:161:18 | call to source : | semmle.label | call to source : | | string_flow.rb:162:10:162:10 | a : | semmle.label | a : | | string_flow.rb:162:10:162:17 | call to freeze | semmle.label | call to freeze | +| string_flow.rb:166:5:166:5 | a : | semmle.label | a : | | string_flow.rb:166:9:166:18 | call to source : | semmle.label | call to source : | +| string_flow.rb:167:5:167:5 | c : | semmle.label | c : | | string_flow.rb:167:9:167:18 | call to source : | semmle.label | call to source : | | string_flow.rb:168:10:168:10 | a : | semmle.label | a : | | string_flow.rb:168:10:168:23 | call to gsub | semmle.label | call to gsub | @@ -448,7 +549,9 @@ nodes | string_flow.rb:171:10:171:10 | a : | semmle.label | a : | | string_flow.rb:171:10:171:44 | call to gsub! | semmle.label | call to gsub! | | string_flow.rb:171:33:171:42 | call to source : | semmle.label | call to source : | +| string_flow.rb:175:5:175:5 | a : | semmle.label | a : | | string_flow.rb:175:9:175:18 | call to source : | semmle.label | call to source : | +| string_flow.rb:176:5:176:5 | c : | semmle.label | c : | | string_flow.rb:176:9:176:18 | call to source : | semmle.label | call to source : | | string_flow.rb:177:10:177:10 | a : | semmle.label | a : | | string_flow.rb:177:10:177:22 | call to sub | semmle.label | call to sub | @@ -462,9 +565,11 @@ nodes | string_flow.rb:180:10:180:10 | a : | semmle.label | a : | | string_flow.rb:180:10:180:43 | call to sub! | semmle.label | call to sub! | | string_flow.rb:180:32:180:41 | call to source : | semmle.label | call to source : | +| string_flow.rb:191:5:191:5 | a : | semmle.label | a : | | string_flow.rb:191:9:191:18 | call to source : | semmle.label | call to source : | | string_flow.rb:192:10:192:10 | a : | semmle.label | a : | | string_flow.rb:192:10:192:18 | call to inspect | semmle.label | call to inspect | +| string_flow.rb:196:5:196:5 | a : | semmle.label | a : | | string_flow.rb:196:9:196:18 | call to source : | semmle.label | call to source : | | string_flow.rb:197:10:197:10 | a : | semmle.label | a : | | string_flow.rb:197:10:197:16 | call to strip | semmle.label | call to strip | @@ -478,6 +583,7 @@ nodes | string_flow.rb:201:10:201:17 | call to rstrip | semmle.label | call to rstrip | | string_flow.rb:202:10:202:10 | a : | semmle.label | a : | | string_flow.rb:202:10:202:18 | call to rstrip! | semmle.label | call to rstrip! | +| string_flow.rb:206:5:206:5 | a : | semmle.label | a : | | string_flow.rb:206:9:206:18 | call to source : | semmle.label | call to source : | | string_flow.rb:207:10:207:10 | a : | semmle.label | a : | | string_flow.rb:207:10:207:15 | call to next | semmle.label | call to next | @@ -487,7 +593,11 @@ nodes | string_flow.rb:209:10:209:15 | call to succ | semmle.label | call to succ | | string_flow.rb:210:10:210:10 | a : | semmle.label | a : | | string_flow.rb:210:10:210:16 | call to succ! | semmle.label | call to succ! | +| string_flow.rb:214:5:214:5 | a : | semmle.label | a : | | string_flow.rb:214:9:214:18 | call to source : | semmle.label | call to source : | +| string_flow.rb:215:5:215:5 | b [element 0] : | semmle.label | b [element 0] : | +| string_flow.rb:215:5:215:5 | b [element 1] : | semmle.label | b [element 1] : | +| string_flow.rb:215:5:215:5 | b [element 2] : | semmle.label | b [element 2] : | | string_flow.rb:215:9:215:9 | a : | semmle.label | a : | | string_flow.rb:215:9:215:24 | call to partition [element 0] : | semmle.label | call to partition [element 0] : | | string_flow.rb:215:9:215:24 | call to partition [element 1] : | semmle.label | call to partition [element 1] : | @@ -498,8 +608,11 @@ nodes | string_flow.rb:217:10:217:13 | ...[...] | semmle.label | ...[...] | | string_flow.rb:218:10:218:10 | b [element 2] : | semmle.label | b [element 2] : | | string_flow.rb:218:10:218:13 | ...[...] | semmle.label | ...[...] | +| string_flow.rb:223:5:223:5 | a : | semmle.label | a : | +| string_flow.rb:223:5:223:5 | a : | semmle.label | a : | | string_flow.rb:223:9:223:18 | call to source : | semmle.label | call to source : | | string_flow.rb:223:9:223:18 | call to source : | semmle.label | call to source : | +| string_flow.rb:224:5:224:5 | b : | semmle.label | b : | | string_flow.rb:224:9:224:18 | call to source : | semmle.label | call to source : | | string_flow.rb:225:10:225:10 | [post] a : | semmle.label | [post] a : | | string_flow.rb:225:10:225:10 | [post] a : | semmle.label | [post] a : | @@ -509,25 +622,29 @@ nodes | string_flow.rb:225:20:225:20 | b : | semmle.label | b : | | string_flow.rb:227:10:227:10 | a | semmle.label | a | | string_flow.rb:227:10:227:10 | a | semmle.label | a | +| string_flow.rb:231:5:231:5 | a : | semmle.label | a : | | string_flow.rb:231:9:231:18 | call to source : | semmle.label | call to source : | | string_flow.rb:232:10:232:10 | a : | semmle.label | a : | | string_flow.rb:232:10:232:18 | call to reverse | semmle.label | call to reverse | +| string_flow.rb:236:5:236:5 | a : | semmle.label | a : | | string_flow.rb:236:9:236:18 | call to source : | semmle.label | call to source : | | string_flow.rb:237:9:237:9 | a : | semmle.label | a : | | string_flow.rb:237:24:237:24 | x : | semmle.label | x : | | string_flow.rb:237:35:237:35 | x | semmle.label | x | +| string_flow.rb:238:5:238:5 | b : | semmle.label | b : | | string_flow.rb:238:9:238:9 | a : | semmle.label | a : | | string_flow.rb:238:9:238:37 | call to scan : | semmle.label | call to scan : | | string_flow.rb:238:27:238:27 | y : | semmle.label | y : | | string_flow.rb:238:35:238:35 | y | semmle.label | y | | string_flow.rb:239:10:239:10 | b | semmle.label | b | +| string_flow.rb:240:5:240:5 | b [element] : | semmle.label | b [element] : | | string_flow.rb:240:9:240:9 | a : | semmle.label | a : | | string_flow.rb:240:9:240:19 | call to scan [element] : | semmle.label | call to scan [element] : | | string_flow.rb:241:10:241:10 | b [element] : | semmle.label | b [element] : | | string_flow.rb:241:10:241:13 | ...[...] | semmle.label | ...[...] | | string_flow.rb:242:10:242:10 | b [element] : | semmle.label | b [element] : | | string_flow.rb:242:10:242:13 | ...[...] | semmle.label | ...[...] | -| string_flow.rb:246:5:246:18 | ... = ... : | semmle.label | ... = ... : | +| string_flow.rb:246:5:246:5 | a : | semmle.label | a : | | string_flow.rb:246:9:246:18 | call to source : | semmle.label | call to source : | | string_flow.rb:247:10:247:10 | a : | semmle.label | a : | | string_flow.rb:247:10:247:21 | call to scrub | semmle.label | call to scrub | @@ -542,26 +659,32 @@ nodes | string_flow.rb:252:10:252:22 | call to scrub! | semmle.label | call to scrub! | | string_flow.rb:253:10:253:22 | call to scrub! | semmle.label | call to scrub! | | string_flow.rb:253:21:253:21 | a : | semmle.label | a : | -| string_flow.rb:255:5:255:18 | ... = ... : | semmle.label | ... = ... : | +| string_flow.rb:255:5:255:5 | a : | semmle.label | a : | | string_flow.rb:255:9:255:18 | call to source : | semmle.label | call to source : | | string_flow.rb:256:5:256:5 | a : | semmle.label | a : | | string_flow.rb:256:17:256:17 | x : | semmle.label | x : | | string_flow.rb:256:25:256:25 | x | semmle.label | x | | string_flow.rb:258:10:258:29 | call to scrub! | semmle.label | call to scrub! | | string_flow.rb:258:27:258:27 | a : | semmle.label | a : | +| string_flow.rb:262:5:262:5 | a : | semmle.label | a : | | string_flow.rb:262:9:262:18 | call to source : | semmle.label | call to source : | | string_flow.rb:263:10:263:10 | a : | semmle.label | a : | | string_flow.rb:263:10:263:22 | call to shellescape | semmle.label | call to shellescape | +| string_flow.rb:267:5:267:5 | a : | semmle.label | a : | | string_flow.rb:267:9:267:18 | call to source : | semmle.label | call to source : | +| string_flow.rb:268:5:268:5 | b [element] : | semmle.label | b [element] : | | string_flow.rb:268:9:268:9 | a : | semmle.label | a : | | string_flow.rb:268:9:268:20 | call to shellsplit [element] : | semmle.label | call to shellsplit [element] : | | string_flow.rb:269:10:269:10 | b [element] : | semmle.label | b [element] : | | string_flow.rb:269:10:269:13 | ...[...] | semmle.label | ...[...] | +| string_flow.rb:273:5:273:5 | a : | semmle.label | a : | | string_flow.rb:273:9:273:18 | call to source : | semmle.label | call to source : | +| string_flow.rb:274:5:274:5 | b : | semmle.label | b : | | string_flow.rb:274:9:274:9 | a : | semmle.label | a : | | string_flow.rb:274:9:274:18 | call to slice : | semmle.label | call to slice : | | string_flow.rb:275:10:275:10 | b : | semmle.label | b : | | string_flow.rb:275:10:275:13 | ...[...] | semmle.label | ...[...] | +| string_flow.rb:277:5:277:5 | b : | semmle.label | b : | | string_flow.rb:277:9:277:9 | [post] a : | semmle.label | [post] a : | | string_flow.rb:277:9:277:9 | [post] a [element 1] : | semmle.label | [post] a [element 1] : | | string_flow.rb:277:9:277:9 | [post] a [element 2] : | semmle.label | [post] a [element 2] : | @@ -570,10 +693,15 @@ nodes | string_flow.rb:277:9:277:19 | call to slice! : | semmle.label | call to slice! : | | string_flow.rb:278:10:278:10 | b : | semmle.label | b : | | string_flow.rb:278:10:278:13 | ...[...] | semmle.label | ...[...] | +| string_flow.rb:280:5:280:5 | b : | semmle.label | b : | | string_flow.rb:280:9:280:9 | a : | semmle.label | a : | | string_flow.rb:280:9:280:20 | call to split : | semmle.label | call to split : | | string_flow.rb:281:10:281:10 | b : | semmle.label | b : | | string_flow.rb:281:10:281:13 | ...[...] | semmle.label | ...[...] | +| string_flow.rb:283:5:283:5 | b : | semmle.label | b : | +| string_flow.rb:283:5:283:5 | b [element 0] : | semmle.label | b [element 0] : | +| string_flow.rb:283:5:283:5 | b [element 1] : | semmle.label | b [element 1] : | +| string_flow.rb:283:5:283:5 | b [element] : | semmle.label | b [element] : | | string_flow.rb:283:9:283:9 | a : | semmle.label | a : | | string_flow.rb:283:9:283:9 | a [element 1] : | semmle.label | a [element 1] : | | string_flow.rb:283:9:283:9 | a [element 2] : | semmle.label | a [element 2] : | @@ -587,6 +715,7 @@ nodes | string_flow.rb:284:10:284:10 | b [element 1] : | semmle.label | b [element 1] : | | string_flow.rb:284:10:284:10 | b [element] : | semmle.label | b [element] : | | string_flow.rb:284:10:284:13 | ...[...] | semmle.label | ...[...] | +| string_flow.rb:288:5:288:5 | a : | semmle.label | a : | | string_flow.rb:288:9:288:18 | call to source : | semmle.label | call to source : | | string_flow.rb:289:10:289:10 | a : | semmle.label | a : | | string_flow.rb:289:10:289:18 | call to squeeze | semmle.label | call to squeeze | @@ -596,11 +725,13 @@ nodes | string_flow.rb:291:10:291:19 | call to squeeze! | semmle.label | call to squeeze! | | string_flow.rb:292:10:292:10 | a : | semmle.label | a : | | string_flow.rb:292:10:292:24 | call to squeeze! | semmle.label | call to squeeze! | +| string_flow.rb:296:5:296:5 | a : | semmle.label | a : | | string_flow.rb:296:9:296:18 | call to source : | semmle.label | call to source : | | string_flow.rb:297:10:297:10 | a : | semmle.label | a : | | string_flow.rb:297:10:297:17 | call to to_str | semmle.label | call to to_str | | string_flow.rb:298:10:298:10 | a : | semmle.label | a : | | string_flow.rb:298:10:298:15 | call to to_s | semmle.label | call to to_s | +| string_flow.rb:302:5:302:5 | a : | semmle.label | a : | | string_flow.rb:302:9:302:18 | call to source : | semmle.label | call to source : | | string_flow.rb:303:10:303:10 | a : | semmle.label | a : | | string_flow.rb:303:10:303:23 | call to tr | semmle.label | call to tr | @@ -618,6 +749,7 @@ nodes | string_flow.rb:309:10:309:26 | call to tr_s! | semmle.label | call to tr_s! | | string_flow.rb:310:10:310:26 | call to tr_s! | semmle.label | call to tr_s! | | string_flow.rb:310:25:310:25 | a : | semmle.label | a : | +| string_flow.rb:314:5:314:5 | a : | semmle.label | a : | | string_flow.rb:314:9:314:18 | call to source : | semmle.label | call to source : | | string_flow.rb:315:5:315:5 | a : | semmle.label | a : | | string_flow.rb:315:20:315:20 | x : | semmle.label | x : | diff --git a/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected b/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected index f916520c8ce..a69c52963cb 100644 --- a/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected +++ b/ruby/ql/test/library-tests/dataflow/summaries/Summaries.expected @@ -1,53 +1,57 @@ failures edges -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:2:6:2:12 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:2:6:2:12 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:4:24:4:30 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:4:24:4:30 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:16:36:16:42 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:16:36:16:42 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:20:25:20:31 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:26:31:26:37 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:30:24:30:30 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:31:27:31:33 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:34:16:34:22 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:34:16:34:22 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:35:16:35:22 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:35:16:35:22 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:36:21:36:27 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:36:21:36:27 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:37:36:37:42 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:37:36:37:42 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:51:24:51:30 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:56:22:56:28 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:57:17:57:23 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:59:27:59:33 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:63:32:63:38 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:65:23:65:29 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:122:16:122:22 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:128:14:128:20 | tainted : | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:131:16:131:22 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:131:16:131:22 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:132:21:132:27 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:132:21:132:27 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:135:26:135:32 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:135:26:135:32 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:137:23:137:29 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:137:23:137:29 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:140:19:140:25 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:140:19:140:25 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:141:19:141:25 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:141:19:141:25 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:145:26:145:32 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:145:26:145:32 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:147:16:147:22 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:147:16:147:22 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:150:39:150:45 | tainted | -| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:150:39:150:45 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:2:6:2:12 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:2:6:2:12 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:4:24:4:30 | tainted : | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:4:24:4:30 | tainted : | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:16:36:16:42 | tainted : | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:16:36:16:42 | tainted : | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:20:25:20:31 | tainted : | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:26:31:26:37 | tainted : | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:30:24:30:30 | tainted : | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:31:27:31:33 | tainted : | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:34:16:34:22 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:34:16:34:22 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:35:16:35:22 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:35:16:35:22 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:36:21:36:27 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:36:21:36:27 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:37:36:37:42 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:37:36:37:42 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:51:24:51:30 | tainted : | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:56:22:56:28 | tainted : | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:57:17:57:23 | tainted : | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:59:27:59:33 | tainted : | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:63:32:63:38 | tainted : | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:65:23:65:29 | tainted : | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:122:16:122:22 | tainted : | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:128:14:128:20 | tainted : | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:131:16:131:22 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:131:16:131:22 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:132:21:132:27 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:132:21:132:27 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:135:26:135:32 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:135:26:135:32 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:137:23:137:29 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:137:23:137:29 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:140:19:140:25 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:140:19:140:25 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:141:19:141:25 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:141:19:141:25 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:145:26:145:32 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:145:26:145:32 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:147:16:147:22 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:147:16:147:22 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:150:39:150:45 | tainted | +| summaries.rb:1:1:1:7 | tainted : | summaries.rb:150:39:150:45 | tainted | +| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:1:1:1:7 | tainted : | +| summaries.rb:1:11:1:36 | call to identity : | summaries.rb:1:1:1:7 | tainted : | | summaries.rb:1:20:1:36 | call to source : | summaries.rb:1:11:1:36 | call to identity : | | summaries.rb:1:20:1:36 | call to source : | summaries.rb:1:11:1:36 | call to identity : | -| summaries.rb:4:12:7:3 | call to apply_block : | summaries.rb:9:6:9:13 | tainted2 | -| summaries.rb:4:12:7:3 | call to apply_block : | summaries.rb:9:6:9:13 | tainted2 | +| summaries.rb:4:1:4:8 | tainted2 : | summaries.rb:9:6:9:13 | tainted2 | +| summaries.rb:4:1:4:8 | tainted2 : | summaries.rb:9:6:9:13 | tainted2 | +| summaries.rb:4:12:7:3 | call to apply_block : | summaries.rb:4:1:4:8 | tainted2 : | +| summaries.rb:4:12:7:3 | call to apply_block : | summaries.rb:4:1:4:8 | tainted2 : | | summaries.rb:4:24:4:30 | tainted : | summaries.rb:4:12:7:3 | call to apply_block : | | summaries.rb:4:24:4:30 | tainted : | summaries.rb:4:12:7:3 | call to apply_block : | | summaries.rb:4:24:4:30 | tainted : | summaries.rb:4:36:4:36 | x : | @@ -56,27 +60,33 @@ edges | summaries.rb:4:36:4:36 | x : | summaries.rb:5:8:5:8 | x | | summaries.rb:11:17:11:17 | x : | summaries.rb:12:8:12:8 | x | | summaries.rb:11:17:11:17 | x : | summaries.rb:12:8:12:8 | x | -| summaries.rb:16:12:16:43 | call to apply_lambda : | summaries.rb:18:6:18:13 | tainted3 | -| summaries.rb:16:12:16:43 | call to apply_lambda : | summaries.rb:18:6:18:13 | tainted3 | +| summaries.rb:16:1:16:8 | tainted3 : | summaries.rb:18:6:18:13 | tainted3 | +| summaries.rb:16:1:16:8 | tainted3 : | summaries.rb:18:6:18:13 | tainted3 | +| summaries.rb:16:12:16:43 | call to apply_lambda : | summaries.rb:16:1:16:8 | tainted3 : | +| summaries.rb:16:12:16:43 | call to apply_lambda : | summaries.rb:16:1:16:8 | tainted3 : | | summaries.rb:16:36:16:42 | tainted : | summaries.rb:11:17:11:17 | x : | | summaries.rb:16:36:16:42 | tainted : | summaries.rb:11:17:11:17 | x : | | summaries.rb:16:36:16:42 | tainted : | summaries.rb:16:12:16:43 | call to apply_lambda : | | summaries.rb:16:36:16:42 | tainted : | summaries.rb:16:12:16:43 | call to apply_lambda : | -| summaries.rb:20:12:20:32 | call to firstArg : | summaries.rb:21:6:21:13 | tainted4 | +| summaries.rb:20:1:20:8 | tainted4 : | summaries.rb:21:6:21:13 | tainted4 | +| summaries.rb:20:12:20:32 | call to firstArg : | summaries.rb:20:1:20:8 | tainted4 : | | summaries.rb:20:25:20:31 | tainted : | summaries.rb:20:12:20:32 | call to firstArg : | -| summaries.rb:26:12:26:38 | call to secondArg : | summaries.rb:27:6:27:13 | tainted5 | +| summaries.rb:26:1:26:8 | tainted5 : | summaries.rb:27:6:27:13 | tainted5 | +| summaries.rb:26:12:26:38 | call to secondArg : | summaries.rb:26:1:26:8 | tainted5 : | | summaries.rb:26:31:26:37 | tainted : | summaries.rb:26:12:26:38 | call to secondArg : | | summaries.rb:30:24:30:30 | tainted : | summaries.rb:30:6:30:42 | call to onlyWithBlock | | summaries.rb:31:27:31:33 | tainted : | summaries.rb:31:6:31:34 | call to onlyWithoutBlock | -| summaries.rb:40:7:40:17 | call to source : | summaries.rb:41:24:41:24 | t : | -| summaries.rb:40:7:40:17 | call to source : | summaries.rb:42:24:42:24 | t : | -| summaries.rb:40:7:40:17 | call to source : | summaries.rb:44:8:44:8 | t : | +| summaries.rb:40:3:40:3 | t : | summaries.rb:41:24:41:24 | t : | +| summaries.rb:40:3:40:3 | t : | summaries.rb:42:24:42:24 | t : | +| summaries.rb:40:3:40:3 | t : | summaries.rb:44:8:44:8 | t : | +| summaries.rb:40:7:40:17 | call to source : | summaries.rb:40:3:40:3 | t : | | summaries.rb:41:24:41:24 | t : | summaries.rb:41:8:41:25 | call to matchedByName | | summaries.rb:42:24:42:24 | t : | summaries.rb:42:8:42:25 | call to matchedByName | | summaries.rb:44:8:44:8 | t : | summaries.rb:44:8:44:27 | call to matchedByNameRcv | | summaries.rb:48:24:48:41 | call to source : | summaries.rb:48:8:48:42 | call to preserveTaint | | summaries.rb:51:24:51:30 | tainted : | summaries.rb:51:6:51:31 | call to namedArg | -| summaries.rb:53:15:53:31 | call to source : | summaries.rb:54:21:54:24 | args [element :foo] : | +| summaries.rb:53:1:53:4 | args [element :foo] : | summaries.rb:54:21:54:24 | args [element :foo] : | +| summaries.rb:53:15:53:31 | call to source : | summaries.rb:53:1:53:4 | args [element :foo] : | | summaries.rb:54:19:54:24 | ** ... [element :foo] : | summaries.rb:54:6:54:25 | call to namedArg | | summaries.rb:54:21:54:24 | args [element :foo] : | summaries.rb:54:19:54:24 | ** ... [element :foo] : | | summaries.rb:56:22:56:28 | tainted : | summaries.rb:56:6:56:29 | call to anyArg | @@ -87,20 +97,24 @@ edges | summaries.rb:65:40:65:40 | x : | summaries.rb:66:8:66:8 | x | | summaries.rb:73:24:73:53 | call to source : | summaries.rb:73:8:73:54 | call to preserveTaint | | summaries.rb:76:26:76:56 | call to source : | summaries.rb:76:8:76:57 | call to preserveTaint | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:82:6:82:6 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:82:6:82:6 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:83:6:83:6 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:83:6:83:6 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:85:6:85:6 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:85:6:85:6 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:87:5:87:5 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:87:5:87:5 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:91:5:91:5 | a [element 1] : | -| summaries.rb:79:15:79:29 | call to source : | summaries.rb:91:5:91:5 | a [element 1] : | -| summaries.rb:79:32:79:46 | call to source : | summaries.rb:86:6:86:6 | a [element 2] : | -| summaries.rb:79:32:79:46 | call to source : | summaries.rb:86:6:86:6 | a [element 2] : | -| summaries.rb:79:32:79:46 | call to source : | summaries.rb:95:1:95:1 | a [element 2] : | -| summaries.rb:79:32:79:46 | call to source : | summaries.rb:95:1:95:1 | a [element 2] : | +| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:82:6:82:6 | a [element 1] : | +| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:82:6:82:6 | a [element 1] : | +| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:83:6:83:6 | a [element 1] : | +| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:83:6:83:6 | a [element 1] : | +| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:85:6:85:6 | a [element 1] : | +| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:85:6:85:6 | a [element 1] : | +| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:87:5:87:5 | a [element 1] : | +| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:87:5:87:5 | a [element 1] : | +| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:91:5:91:5 | a [element 1] : | +| summaries.rb:79:1:79:1 | a [element 1] : | summaries.rb:91:5:91:5 | a [element 1] : | +| summaries.rb:79:1:79:1 | a [element 2] : | summaries.rb:86:6:86:6 | a [element 2] : | +| summaries.rb:79:1:79:1 | a [element 2] : | summaries.rb:86:6:86:6 | a [element 2] : | +| summaries.rb:79:1:79:1 | a [element 2] : | summaries.rb:95:1:95:1 | a [element 2] : | +| summaries.rb:79:1:79:1 | a [element 2] : | summaries.rb:95:1:95:1 | a [element 2] : | +| summaries.rb:79:15:79:29 | call to source : | summaries.rb:79:1:79:1 | a [element 1] : | +| summaries.rb:79:15:79:29 | call to source : | summaries.rb:79:1:79:1 | a [element 1] : | +| summaries.rb:79:32:79:46 | call to source : | summaries.rb:79:1:79:1 | a [element 2] : | +| summaries.rb:79:32:79:46 | call to source : | summaries.rb:79:1:79:1 | a [element 2] : | | summaries.rb:81:1:81:1 | [post] a [element] : | summaries.rb:82:6:82:6 | a [element] : | | summaries.rb:81:1:81:1 | [post] a [element] : | summaries.rb:82:6:82:6 | a [element] : | | summaries.rb:81:1:81:1 | [post] a [element] : | summaries.rb:84:6:84:6 | a [element] : | @@ -131,18 +145,22 @@ edges | summaries.rb:86:6:86:6 | a [element 2] : | summaries.rb:86:6:86:9 | ...[...] | | summaries.rb:86:6:86:6 | a [element] : | summaries.rb:86:6:86:9 | ...[...] | | summaries.rb:86:6:86:6 | a [element] : | summaries.rb:86:6:86:9 | ...[...] | +| summaries.rb:87:1:87:1 | b [element 1] : | summaries.rb:89:6:89:6 | b [element 1] : | +| summaries.rb:87:1:87:1 | b [element 1] : | summaries.rb:89:6:89:6 | b [element 1] : | +| summaries.rb:87:1:87:1 | b [element] : | summaries.rb:88:6:88:6 | b [element] : | +| summaries.rb:87:1:87:1 | b [element] : | summaries.rb:88:6:88:6 | b [element] : | +| summaries.rb:87:1:87:1 | b [element] : | summaries.rb:89:6:89:6 | b [element] : | +| summaries.rb:87:1:87:1 | b [element] : | summaries.rb:89:6:89:6 | b [element] : | +| summaries.rb:87:1:87:1 | b [element] : | summaries.rb:90:6:90:6 | b [element] : | +| summaries.rb:87:1:87:1 | b [element] : | summaries.rb:90:6:90:6 | b [element] : | | summaries.rb:87:5:87:5 | a [element 1] : | summaries.rb:87:5:87:22 | call to withElementOne [element 1] : | | summaries.rb:87:5:87:5 | a [element 1] : | summaries.rb:87:5:87:22 | call to withElementOne [element 1] : | | summaries.rb:87:5:87:5 | a [element] : | summaries.rb:87:5:87:22 | call to withElementOne [element] : | | summaries.rb:87:5:87:5 | a [element] : | summaries.rb:87:5:87:22 | call to withElementOne [element] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element 1] : | summaries.rb:89:6:89:6 | b [element 1] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element 1] : | summaries.rb:89:6:89:6 | b [element 1] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element] : | summaries.rb:88:6:88:6 | b [element] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element] : | summaries.rb:88:6:88:6 | b [element] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element] : | summaries.rb:89:6:89:6 | b [element] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element] : | summaries.rb:89:6:89:6 | b [element] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element] : | summaries.rb:90:6:90:6 | b [element] : | -| summaries.rb:87:5:87:22 | call to withElementOne [element] : | summaries.rb:90:6:90:6 | b [element] : | +| summaries.rb:87:5:87:22 | call to withElementOne [element 1] : | summaries.rb:87:1:87:1 | b [element 1] : | +| summaries.rb:87:5:87:22 | call to withElementOne [element 1] : | summaries.rb:87:1:87:1 | b [element 1] : | +| summaries.rb:87:5:87:22 | call to withElementOne [element] : | summaries.rb:87:1:87:1 | b [element] : | +| summaries.rb:87:5:87:22 | call to withElementOne [element] : | summaries.rb:87:1:87:1 | b [element] : | | summaries.rb:88:6:88:6 | b [element] : | summaries.rb:88:6:88:9 | ...[...] | | summaries.rb:88:6:88:6 | b [element] : | summaries.rb:88:6:88:9 | ...[...] | | summaries.rb:89:6:89:6 | b [element 1] : | summaries.rb:89:6:89:9 | ...[...] | @@ -151,10 +169,12 @@ edges | summaries.rb:89:6:89:6 | b [element] : | summaries.rb:89:6:89:9 | ...[...] | | summaries.rb:90:6:90:6 | b [element] : | summaries.rb:90:6:90:9 | ...[...] | | summaries.rb:90:6:90:6 | b [element] : | summaries.rb:90:6:90:9 | ...[...] | +| summaries.rb:91:1:91:1 | c [element 1] : | summaries.rb:93:6:93:6 | c [element 1] : | +| summaries.rb:91:1:91:1 | c [element 1] : | summaries.rb:93:6:93:6 | c [element 1] : | | summaries.rb:91:5:91:5 | a [element 1] : | summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] : | | summaries.rb:91:5:91:5 | a [element 1] : | summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] : | -| summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] : | summaries.rb:93:6:93:6 | c [element 1] : | -| summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] : | summaries.rb:93:6:93:6 | c [element 1] : | +| summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] : | summaries.rb:91:1:91:1 | c [element 1] : | +| summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] : | summaries.rb:91:1:91:1 | c [element 1] : | | summaries.rb:93:6:93:6 | c [element 1] : | summaries.rb:93:6:93:9 | ...[...] | | summaries.rb:93:6:93:6 | c [element 1] : | summaries.rb:93:6:93:9 | ...[...] | | summaries.rb:95:1:95:1 | [post] a [element 2] : | summaries.rb:98:6:98:6 | a [element 2] : | @@ -219,12 +239,16 @@ edges | summaries.rb:128:1:128:1 | [post] x : | summaries.rb:129:6:129:6 | x | | summaries.rb:128:14:128:20 | tainted : | summaries.rb:128:1:128:1 | [post] x : | nodes +| summaries.rb:1:1:1:7 | tainted : | semmle.label | tainted : | +| summaries.rb:1:1:1:7 | tainted : | semmle.label | tainted : | | summaries.rb:1:11:1:36 | call to identity : | semmle.label | call to identity : | | summaries.rb:1:11:1:36 | call to identity : | semmle.label | call to identity : | | summaries.rb:1:20:1:36 | call to source : | semmle.label | call to source : | | summaries.rb:1:20:1:36 | call to source : | semmle.label | call to source : | | summaries.rb:2:6:2:12 | tainted | semmle.label | tainted | | summaries.rb:2:6:2:12 | tainted | semmle.label | tainted | +| summaries.rb:4:1:4:8 | tainted2 : | semmle.label | tainted2 : | +| summaries.rb:4:1:4:8 | tainted2 : | semmle.label | tainted2 : | | summaries.rb:4:12:7:3 | call to apply_block : | semmle.label | call to apply_block : | | summaries.rb:4:12:7:3 | call to apply_block : | semmle.label | call to apply_block : | | summaries.rb:4:24:4:30 | tainted : | semmle.label | tainted : | @@ -239,15 +263,19 @@ nodes | summaries.rb:11:17:11:17 | x : | semmle.label | x : | | summaries.rb:12:8:12:8 | x | semmle.label | x | | summaries.rb:12:8:12:8 | x | semmle.label | x | +| summaries.rb:16:1:16:8 | tainted3 : | semmle.label | tainted3 : | +| summaries.rb:16:1:16:8 | tainted3 : | semmle.label | tainted3 : | | summaries.rb:16:12:16:43 | call to apply_lambda : | semmle.label | call to apply_lambda : | | summaries.rb:16:12:16:43 | call to apply_lambda : | semmle.label | call to apply_lambda : | | summaries.rb:16:36:16:42 | tainted : | semmle.label | tainted : | | summaries.rb:16:36:16:42 | tainted : | semmle.label | tainted : | | summaries.rb:18:6:18:13 | tainted3 | semmle.label | tainted3 | | summaries.rb:18:6:18:13 | tainted3 | semmle.label | tainted3 | +| summaries.rb:20:1:20:8 | tainted4 : | semmle.label | tainted4 : | | summaries.rb:20:12:20:32 | call to firstArg : | semmle.label | call to firstArg : | | summaries.rb:20:25:20:31 | tainted : | semmle.label | tainted : | | summaries.rb:21:6:21:13 | tainted4 | semmle.label | tainted4 | +| summaries.rb:26:1:26:8 | tainted5 : | semmle.label | tainted5 : | | summaries.rb:26:12:26:38 | call to secondArg : | semmle.label | call to secondArg : | | summaries.rb:26:31:26:37 | tainted : | semmle.label | tainted : | | summaries.rb:27:6:27:13 | tainted5 | semmle.label | tainted5 | @@ -263,6 +291,7 @@ nodes | summaries.rb:36:21:36:27 | tainted | semmle.label | tainted | | summaries.rb:37:36:37:42 | tainted | semmle.label | tainted | | summaries.rb:37:36:37:42 | tainted | semmle.label | tainted | +| summaries.rb:40:3:40:3 | t : | semmle.label | t : | | summaries.rb:40:7:40:17 | call to source : | semmle.label | call to source : | | summaries.rb:41:8:41:25 | call to matchedByName | semmle.label | call to matchedByName | | summaries.rb:41:24:41:24 | t : | semmle.label | t : | @@ -274,6 +303,7 @@ nodes | summaries.rb:48:24:48:41 | call to source : | semmle.label | call to source : | | summaries.rb:51:6:51:31 | call to namedArg | semmle.label | call to namedArg | | summaries.rb:51:24:51:30 | tainted : | semmle.label | tainted : | +| summaries.rb:53:1:53:4 | args [element :foo] : | semmle.label | args [element :foo] : | | summaries.rb:53:15:53:31 | call to source : | semmle.label | call to source : | | summaries.rb:54:6:54:25 | call to namedArg | semmle.label | call to namedArg | | summaries.rb:54:19:54:24 | ** ... [element :foo] : | semmle.label | ** ... [element :foo] : | @@ -293,6 +323,10 @@ nodes | summaries.rb:73:24:73:53 | call to source : | semmle.label | call to source : | | summaries.rb:76:8:76:57 | call to preserveTaint | semmle.label | call to preserveTaint | | summaries.rb:76:26:76:56 | call to source : | semmle.label | call to source : | +| summaries.rb:79:1:79:1 | a [element 1] : | semmle.label | a [element 1] : | +| summaries.rb:79:1:79:1 | a [element 1] : | semmle.label | a [element 1] : | +| summaries.rb:79:1:79:1 | a [element 2] : | semmle.label | a [element 2] : | +| summaries.rb:79:1:79:1 | a [element 2] : | semmle.label | a [element 2] : | | summaries.rb:79:15:79:29 | call to source : | semmle.label | call to source : | | summaries.rb:79:15:79:29 | call to source : | semmle.label | call to source : | | summaries.rb:79:32:79:46 | call to source : | semmle.label | call to source : | @@ -327,6 +361,10 @@ nodes | summaries.rb:86:6:86:6 | a [element] : | semmle.label | a [element] : | | summaries.rb:86:6:86:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:86:6:86:9 | ...[...] | semmle.label | ...[...] | +| summaries.rb:87:1:87:1 | b [element 1] : | semmle.label | b [element 1] : | +| summaries.rb:87:1:87:1 | b [element 1] : | semmle.label | b [element 1] : | +| summaries.rb:87:1:87:1 | b [element] : | semmle.label | b [element] : | +| summaries.rb:87:1:87:1 | b [element] : | semmle.label | b [element] : | | summaries.rb:87:5:87:5 | a [element 1] : | semmle.label | a [element 1] : | | summaries.rb:87:5:87:5 | a [element 1] : | semmle.label | a [element 1] : | | summaries.rb:87:5:87:5 | a [element] : | semmle.label | a [element] : | @@ -349,6 +387,8 @@ nodes | summaries.rb:90:6:90:6 | b [element] : | semmle.label | b [element] : | | summaries.rb:90:6:90:9 | ...[...] | semmle.label | ...[...] | | summaries.rb:90:6:90:9 | ...[...] | semmle.label | ...[...] | +| summaries.rb:91:1:91:1 | c [element 1] : | semmle.label | c [element 1] : | +| summaries.rb:91:1:91:1 | c [element 1] : | semmle.label | c [element 1] : | | summaries.rb:91:5:91:5 | a [element 1] : | semmle.label | a [element 1] : | | summaries.rb:91:5:91:5 | a [element 1] : | semmle.label | a [element 1] : | | summaries.rb:91:5:91:29 | call to withExactlyElementOne [element 1] : | semmle.label | call to withExactlyElementOne [element 1] : | diff --git a/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected b/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected index 0c35a350c41..bc7b35eb941 100644 --- a/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected +++ b/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected @@ -446,7 +446,7 @@ trackEnd | type_tracker.rb:13:11:13:23 | call to new | type_tracker.rb:7:5:9:7 | self (field) | | type_tracker.rb:13:11:13:23 | call to new | type_tracker.rb:7:5:9:7 | self in field | | type_tracker.rb:13:11:13:23 | call to new | type_tracker.rb:8:9:8:14 | self | -| type_tracker.rb:13:11:13:23 | call to new | type_tracker.rb:13:5:13:23 | ... = ... | +| type_tracker.rb:13:11:13:23 | call to new | type_tracker.rb:13:5:13:7 | var | | type_tracker.rb:13:11:13:23 | call to new | type_tracker.rb:13:5:13:23 | ... = ... | | type_tracker.rb:13:11:13:23 | call to new | type_tracker.rb:13:11:13:23 | call to new | | type_tracker.rb:13:11:13:23 | call to new | type_tracker.rb:14:5:14:7 | var | @@ -467,7 +467,7 @@ trackEnd | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:5:14:23 | ... | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:17:14:23 | "hello" | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:17:14:23 | ... = ... | -| type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:17:14:23 | ... = ... | +| type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:17:14:23 | __synth__0 | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:15:10:15:18 | call to field | | type_tracker.rb:14:17:14:23 | __synth__0 | type_tracker.rb:14:17:14:23 | __synth__0 | | type_tracker.rb:15:5:15:18 | call to puts | type_tracker.rb:12:1:16:3 | return return in m | @@ -606,8 +606,8 @@ trackEnd | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:5:39:18 | ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:16:39:18 | ... = ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:16:39:18 | ... = ... | -| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:16:39:18 | ... = ... | -| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:16:39:18 | ... = ... | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:16:39:18 | __synth__0 | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:16:39:18 | __synth__0 | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:16:39:18 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:16:39:18 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:40:5:40:12 | ...[...] | @@ -618,8 +618,8 @@ trackEnd | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:5:43:19 | ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:17:43:19 | ... = ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:17:43:19 | ... = ... | -| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:17:43:19 | ... = ... | -| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:17:43:19 | ... = ... | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:17:43:19 | __synth__0 | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:17:43:19 | __synth__0 | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:17:43:19 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:43:17:43:19 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:44:5:44:13 | ...[...] | @@ -630,8 +630,8 @@ trackEnd | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:5:47:19 | ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:17:47:19 | ... = ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:17:47:19 | ... = ... | -| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:17:47:19 | ... = ... | -| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:17:47:19 | ... = ... | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:17:47:19 | __synth__0 | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:17:47:19 | __synth__0 | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:17:47:19 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:47:17:47:19 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:5:51:13 | __synth__0 | @@ -640,8 +640,8 @@ trackEnd | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:5:51:19 | ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:17:51:19 | ... = ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:17:51:19 | ... = ... | -| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:17:51:19 | ... = ... | -| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:17:51:19 | ... = ... | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:17:51:19 | __synth__0 | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:17:51:19 | __synth__0 | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:17:51:19 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:51:17:51:19 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:52:5:52:13 | ...[...] | @@ -664,7 +664,7 @@ trackEnd | type_tracker.rb:34:26:34:26 | z | type_tracker.rb:52:12:52:12 | z | | type_tracker.rb:35:5:35:7 | tmp | type_tracker.rb:35:5:35:7 | tmp | | type_tracker.rb:35:11:35:15 | Array | type_tracker.rb:35:11:35:15 | Array | -| type_tracker.rb:35:11:35:15 | call to [] | type_tracker.rb:35:5:35:15 | ... = ... | +| type_tracker.rb:35:11:35:15 | call to [] | type_tracker.rb:35:5:35:7 | tmp | | type_tracker.rb:35:11:35:15 | call to [] | type_tracker.rb:35:5:35:15 | ... = ... | | type_tracker.rb:35:11:35:15 | call to [] | type_tracker.rb:35:11:35:15 | call to [] | | type_tracker.rb:35:11:35:15 | call to [] | type_tracker.rb:36:5:36:7 | tmp | @@ -672,7 +672,7 @@ trackEnd | type_tracker.rb:36:9:36:9 | 0 | type_tracker.rb:36:9:36:9 | 0 | | type_tracker.rb:38:5:38:9 | array | type_tracker.rb:38:5:38:9 | array | | type_tracker.rb:38:13:38:25 | Array | type_tracker.rb:38:13:38:25 | Array | -| type_tracker.rb:38:13:38:25 | call to [] | type_tracker.rb:38:5:38:25 | ... = ... | +| type_tracker.rb:38:13:38:25 | call to [] | type_tracker.rb:38:5:38:9 | array | | type_tracker.rb:38:13:38:25 | call to [] | type_tracker.rb:38:5:38:25 | ... = ... | | type_tracker.rb:38:13:38:25 | call to [] | type_tracker.rb:38:13:38:25 | call to [] | | type_tracker.rb:38:13:38:25 | call to [] | type_tracker.rb:39:5:39:9 | array | @@ -692,7 +692,7 @@ trackEnd | type_tracker.rb:40:11:40:11 | 0 | type_tracker.rb:40:11:40:11 | 0 | | type_tracker.rb:42:5:42:10 | array2 | type_tracker.rb:42:5:42:10 | array2 | | type_tracker.rb:42:14:42:26 | Array | type_tracker.rb:42:14:42:26 | Array | -| type_tracker.rb:42:14:42:26 | call to [] | type_tracker.rb:42:5:42:26 | ... = ... | +| type_tracker.rb:42:14:42:26 | call to [] | type_tracker.rb:42:5:42:10 | array2 | | type_tracker.rb:42:14:42:26 | call to [] | type_tracker.rb:42:5:42:26 | ... = ... | | type_tracker.rb:42:14:42:26 | call to [] | type_tracker.rb:42:14:42:26 | call to [] | | type_tracker.rb:42:14:42:26 | call to [] | type_tracker.rb:43:5:43:10 | array2 | @@ -717,7 +717,7 @@ trackEnd | type_tracker.rb:44:5:44:13 | ...[...] | type_tracker.rb:44:5:44:13 | ...[...] | | type_tracker.rb:46:5:46:10 | array3 | type_tracker.rb:46:5:46:10 | array3 | | type_tracker.rb:46:14:46:26 | Array | type_tracker.rb:46:14:46:26 | Array | -| type_tracker.rb:46:14:46:26 | call to [] | type_tracker.rb:46:5:46:26 | ... = ... | +| type_tracker.rb:46:14:46:26 | call to [] | type_tracker.rb:46:5:46:10 | array3 | | type_tracker.rb:46:14:46:26 | call to [] | type_tracker.rb:46:5:46:26 | ... = ... | | type_tracker.rb:46:14:46:26 | call to [] | type_tracker.rb:46:14:46:26 | call to [] | | type_tracker.rb:46:14:46:26 | call to [] | type_tracker.rb:47:5:47:10 | array3 | @@ -738,7 +738,7 @@ trackEnd | type_tracker.rb:48:12:48:12 | 1 | type_tracker.rb:48:12:48:12 | 1 | | type_tracker.rb:50:5:50:10 | array4 | type_tracker.rb:50:5:50:10 | array4 | | type_tracker.rb:50:14:50:26 | Array | type_tracker.rb:50:14:50:26 | Array | -| type_tracker.rb:50:14:50:26 | call to [] | type_tracker.rb:50:5:50:26 | ... = ... | +| type_tracker.rb:50:14:50:26 | call to [] | type_tracker.rb:50:5:50:10 | array4 | | type_tracker.rb:50:14:50:26 | call to [] | type_tracker.rb:50:5:50:26 | ... = ... | | type_tracker.rb:50:14:50:26 | call to [] | type_tracker.rb:50:14:50:26 | call to [] | | type_tracker.rb:50:14:50:26 | call to [] | type_tracker.rb:51:5:51:10 | array4 | diff --git a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected index 918bd5c19ea..0374a54c0c1 100644 --- a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected +++ b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected @@ -20,10 +20,10 @@ activeRecordInstances | ActiveRecord.rb:76:5:76:66 | call to create | | ActiveRecord.rb:80:5:80:68 | call to create | | ActiveRecord.rb:84:5:84:16 | call to create | -| associations.rb:19:1:19:20 | ... = ... | +| associations.rb:19:1:19:7 | author1 | | associations.rb:19:1:19:20 | ... = ... | | associations.rb:19:11:19:20 | call to new | -| associations.rb:21:1:21:28 | ... = ... | +| associations.rb:21:1:21:5 | post1 | | associations.rb:21:1:21:28 | ... = ... | | associations.rb:21:9:21:15 | author1 | | associations.rb:21:9:21:21 | call to posts | @@ -32,11 +32,11 @@ activeRecordInstances | associations.rb:23:12:23:16 | post1 | | associations.rb:23:12:23:25 | call to comments | | associations.rb:23:12:23:32 | call to create | -| associations.rb:25:1:25:22 | ... = ... | +| associations.rb:25:1:25:7 | author2 | | associations.rb:25:1:25:22 | ... = ... | | associations.rb:25:11:25:15 | post1 | | associations.rb:25:11:25:22 | call to author | -| associations.rb:27:1:27:28 | ... = ... | +| associations.rb:27:1:27:5 | post2 | | associations.rb:27:1:27:28 | ... = ... | | associations.rb:27:9:27:15 | author2 | | associations.rb:27:9:27:21 | call to posts | @@ -50,7 +50,7 @@ activeRecordInstances | associations.rb:31:1:31:12 | call to author= | | associations.rb:31:1:31:22 | ... | | associations.rb:31:16:31:22 | ... = ... | -| associations.rb:31:16:31:22 | ... = ... | +| associations.rb:31:16:31:22 | __synth__0 | | associations.rb:31:16:31:22 | author2 | | associations.rb:35:1:35:5 | post2 | | associations.rb:35:1:35:14 | call to comments | diff --git a/ruby/ql/test/library-tests/frameworks/active_resource/ActiveResource.expected b/ruby/ql/test/library-tests/frameworks/active_resource/ActiveResource.expected index 3cb31c4c12c..a55946c1852 100644 --- a/ruby/ql/test/library-tests/frameworks/active_resource/ActiveResource.expected +++ b/ruby/ql/test/library-tests/frameworks/active_resource/ActiveResource.expected @@ -11,11 +11,11 @@ modelClassMethodCalls | active_resource.rb:24:10:24:26 | call to find | | active_resource.rb:30:3:30:11 | call to site= | modelInstances -| active_resource.rb:5:1:5:33 | ... = ... | +| active_resource.rb:5:1:5:5 | alice | | active_resource.rb:5:1:5:33 | ... = ... | | active_resource.rb:5:9:5:33 | call to new | | active_resource.rb:6:1:6:5 | alice | -| active_resource.rb:8:1:8:22 | ... = ... | +| active_resource.rb:8:1:8:5 | alice | | active_resource.rb:8:1:8:22 | ... = ... | | active_resource.rb:8:9:8:22 | call to find | | active_resource.rb:9:1:9:5 | alice | @@ -25,10 +25,10 @@ modelInstances | active_resource.rb:17:1:17:5 | alice | | active_resource.rb:18:1:18:22 | call to get | | active_resource.rb:19:1:19:5 | alice | -| active_resource.rb:24:1:24:26 | ... = ... | +| active_resource.rb:24:1:24:6 | people | | active_resource.rb:24:1:24:26 | ... = ... | | active_resource.rb:24:10:24:26 | call to find | -| active_resource.rb:26:1:26:20 | ... = ... | +| active_resource.rb:26:1:26:5 | alice | | active_resource.rb:26:1:26:20 | ... = ... | | active_resource.rb:26:9:26:14 | people | | active_resource.rb:26:9:26:20 | call to first | @@ -46,7 +46,7 @@ modelInstanceMethodCalls collections | active_resource.rb:23:1:23:19 | ... = ... | | active_resource.rb:23:10:23:19 | call to all | -| active_resource.rb:24:1:24:26 | ... = ... | +| active_resource.rb:24:1:24:6 | people | | active_resource.rb:24:1:24:26 | ... = ... | | active_resource.rb:24:10:24:26 | call to find | | active_resource.rb:26:9:26:14 | people | diff --git a/ruby/ql/test/library-tests/frameworks/active_storage/ActiveStorage.expected b/ruby/ql/test/library-tests/frameworks/active_storage/ActiveStorage.expected index 8c788bda20d..cd2c9c57cc7 100644 --- a/ruby/ql/test/library-tests/frameworks/active_storage/ActiveStorage.expected +++ b/ruby/ql/test/library-tests/frameworks/active_storage/ActiveStorage.expected @@ -1,12 +1,12 @@ attachmentInstances -| active_storage.rb:11:1:11:25 | ... = ... | +| active_storage.rb:11:1:11:11 | user_avatar | | active_storage.rb:11:1:11:25 | ... = ... | | active_storage.rb:11:15:11:25 | call to avatar | | active_storage.rb:13:1:13:11 | user_avatar | | active_storage.rb:14:1:14:11 | user_avatar | | active_storage.rb:15:1:15:11 | user_avatar | | active_storage.rb:17:1:17:11 | call to avatar | -| active_storage.rb:19:1:19:42 | ... = ... | +| active_storage.rb:19:1:19:10 | attachment | | active_storage.rb:19:1:19:42 | ... = ... | | active_storage.rb:19:14:19:42 | call to new | | active_storage.rb:23:11:23:20 | attachment | diff --git a/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected b/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected index b84d576ad19..e10e038a7cc 100644 --- a/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected +++ b/ruby/ql/test/library-tests/frameworks/active_support/ActiveSupportDataFlow.expected @@ -1,122 +1,178 @@ failures | hash_extensions.rb:126:10:126:19 | call to sole | Unexpected result: hasValueFlow=b | edges -| active_support.rb:10:9:10:18 | call to source : | active_support.rb:11:10:11:10 | x : | +| active_support.rb:10:5:10:5 | x : | active_support.rb:11:10:11:10 | x : | +| active_support.rb:10:9:10:18 | call to source : | active_support.rb:10:5:10:5 | x : | | active_support.rb:11:10:11:10 | x : | active_support.rb:11:10:11:19 | call to at | -| active_support.rb:15:9:15:18 | call to source : | active_support.rb:16:10:16:10 | x : | +| active_support.rb:15:5:15:5 | x : | active_support.rb:16:10:16:10 | x : | +| active_support.rb:15:9:15:18 | call to source : | active_support.rb:15:5:15:5 | x : | | active_support.rb:16:10:16:10 | x : | active_support.rb:16:10:16:19 | call to camelize | -| active_support.rb:20:9:20:18 | call to source : | active_support.rb:21:10:21:10 | x : | +| active_support.rb:20:5:20:5 | x : | active_support.rb:21:10:21:10 | x : | +| active_support.rb:20:9:20:18 | call to source : | active_support.rb:20:5:20:5 | x : | | active_support.rb:21:10:21:10 | x : | active_support.rb:21:10:21:20 | call to camelcase | -| active_support.rb:25:9:25:18 | call to source : | active_support.rb:26:10:26:10 | x : | +| active_support.rb:25:5:25:5 | x : | active_support.rb:26:10:26:10 | x : | +| active_support.rb:25:9:25:18 | call to source : | active_support.rb:25:5:25:5 | x : | | active_support.rb:26:10:26:10 | x : | active_support.rb:26:10:26:19 | call to classify | -| active_support.rb:30:9:30:18 | call to source : | active_support.rb:31:10:31:10 | x : | +| active_support.rb:30:5:30:5 | x : | active_support.rb:31:10:31:10 | x : | +| active_support.rb:30:9:30:18 | call to source : | active_support.rb:30:5:30:5 | x : | | active_support.rb:31:10:31:10 | x : | active_support.rb:31:10:31:20 | call to dasherize | -| active_support.rb:35:9:35:18 | call to source : | active_support.rb:36:10:36:10 | x : | +| active_support.rb:35:5:35:5 | x : | active_support.rb:36:10:36:10 | x : | +| active_support.rb:35:9:35:18 | call to source : | active_support.rb:35:5:35:5 | x : | | active_support.rb:36:10:36:10 | x : | active_support.rb:36:10:36:24 | call to deconstantize | -| active_support.rb:40:9:40:18 | call to source : | active_support.rb:41:10:41:10 | x : | +| active_support.rb:40:5:40:5 | x : | active_support.rb:41:10:41:10 | x : | +| active_support.rb:40:9:40:18 | call to source : | active_support.rb:40:5:40:5 | x : | | active_support.rb:41:10:41:10 | x : | active_support.rb:41:10:41:21 | call to demodulize | -| active_support.rb:45:9:45:18 | call to source : | active_support.rb:46:10:46:10 | x : | +| active_support.rb:45:5:45:5 | x : | active_support.rb:46:10:46:10 | x : | +| active_support.rb:45:9:45:18 | call to source : | active_support.rb:45:5:45:5 | x : | | active_support.rb:46:10:46:10 | x : | active_support.rb:46:10:46:19 | call to first | -| active_support.rb:50:9:50:18 | call to source : | active_support.rb:51:10:51:10 | x : | +| active_support.rb:50:5:50:5 | x : | active_support.rb:51:10:51:10 | x : | +| active_support.rb:50:9:50:18 | call to source : | active_support.rb:50:5:50:5 | x : | | active_support.rb:51:10:51:10 | x : | active_support.rb:51:10:51:22 | call to foreign_key | -| active_support.rb:55:9:55:18 | call to source : | active_support.rb:56:10:56:10 | x : | +| active_support.rb:55:5:55:5 | x : | active_support.rb:56:10:56:10 | x : | +| active_support.rb:55:9:55:18 | call to source : | active_support.rb:55:5:55:5 | x : | | active_support.rb:56:10:56:10 | x : | active_support.rb:56:10:56:18 | call to from | -| active_support.rb:60:9:60:18 | call to source : | active_support.rb:61:10:61:10 | x : | +| active_support.rb:60:5:60:5 | x : | active_support.rb:61:10:61:10 | x : | +| active_support.rb:60:9:60:18 | call to source : | active_support.rb:60:5:60:5 | x : | | active_support.rb:61:10:61:10 | x : | active_support.rb:61:10:61:20 | call to html_safe | -| active_support.rb:65:9:65:18 | call to source : | active_support.rb:66:10:66:10 | x : | +| active_support.rb:65:5:65:5 | x : | active_support.rb:66:10:66:10 | x : | +| active_support.rb:65:9:65:18 | call to source : | active_support.rb:65:5:65:5 | x : | | active_support.rb:66:10:66:10 | x : | active_support.rb:66:10:66:19 | call to humanize | -| active_support.rb:70:9:70:18 | call to source : | active_support.rb:71:10:71:10 | x : | +| active_support.rb:70:5:70:5 | x : | active_support.rb:71:10:71:10 | x : | +| active_support.rb:70:9:70:18 | call to source : | active_support.rb:70:5:70:5 | x : | | active_support.rb:71:10:71:10 | x : | active_support.rb:71:10:71:20 | call to indent | -| active_support.rb:75:9:75:18 | call to source : | active_support.rb:76:10:76:10 | x : | +| active_support.rb:75:5:75:5 | x : | active_support.rb:76:10:76:10 | x : | +| active_support.rb:75:9:75:18 | call to source : | active_support.rb:75:5:75:5 | x : | | active_support.rb:76:10:76:10 | x : | active_support.rb:76:10:76:21 | call to indent! | -| active_support.rb:80:9:80:18 | call to source : | active_support.rb:81:10:81:10 | x : | +| active_support.rb:80:5:80:5 | x : | active_support.rb:81:10:81:10 | x : | +| active_support.rb:80:9:80:18 | call to source : | active_support.rb:80:5:80:5 | x : | | active_support.rb:81:10:81:10 | x : | active_support.rb:81:10:81:18 | call to inquiry | -| active_support.rb:85:9:85:18 | call to source : | active_support.rb:86:10:86:10 | x : | +| active_support.rb:85:5:85:5 | x : | active_support.rb:86:10:86:10 | x : | +| active_support.rb:85:9:85:18 | call to source : | active_support.rb:85:5:85:5 | x : | | active_support.rb:86:10:86:10 | x : | active_support.rb:86:10:86:18 | call to last | -| active_support.rb:90:9:90:18 | call to source : | active_support.rb:91:10:91:10 | x : | +| active_support.rb:90:5:90:5 | x : | active_support.rb:91:10:91:10 | x : | +| active_support.rb:90:9:90:18 | call to source : | active_support.rb:90:5:90:5 | x : | | active_support.rb:91:10:91:10 | x : | active_support.rb:91:10:91:19 | call to mb_chars | -| active_support.rb:95:9:95:18 | call to source : | active_support.rb:96:10:96:10 | x : | +| active_support.rb:95:5:95:5 | x : | active_support.rb:96:10:96:10 | x : | +| active_support.rb:95:9:95:18 | call to source : | active_support.rb:95:5:95:5 | x : | | active_support.rb:96:10:96:10 | x : | active_support.rb:96:10:96:23 | call to parameterize | -| active_support.rb:100:9:100:18 | call to source : | active_support.rb:101:10:101:10 | x : | +| active_support.rb:100:5:100:5 | x : | active_support.rb:101:10:101:10 | x : | +| active_support.rb:100:9:100:18 | call to source : | active_support.rb:100:5:100:5 | x : | | active_support.rb:101:10:101:10 | x : | active_support.rb:101:10:101:20 | call to pluralize | -| active_support.rb:105:9:105:18 | call to source : | active_support.rb:106:10:106:10 | x : | +| active_support.rb:105:5:105:5 | x : | active_support.rb:106:10:106:10 | x : | +| active_support.rb:105:9:105:18 | call to source : | active_support.rb:105:5:105:5 | x : | | active_support.rb:106:10:106:10 | x : | active_support.rb:106:10:106:24 | call to remove | -| active_support.rb:110:9:110:18 | call to source : | active_support.rb:111:10:111:10 | x : | +| active_support.rb:110:5:110:5 | x : | active_support.rb:111:10:111:10 | x : | +| active_support.rb:110:9:110:18 | call to source : | active_support.rb:110:5:110:5 | x : | | active_support.rb:111:10:111:10 | x : | active_support.rb:111:10:111:25 | call to remove! | -| active_support.rb:115:9:115:18 | call to source : | active_support.rb:116:10:116:10 | x : | +| active_support.rb:115:5:115:5 | x : | active_support.rb:116:10:116:10 | x : | +| active_support.rb:115:9:115:18 | call to source : | active_support.rb:115:5:115:5 | x : | | active_support.rb:116:10:116:10 | x : | active_support.rb:116:10:116:22 | call to singularize | -| active_support.rb:120:9:120:18 | call to source : | active_support.rb:121:10:121:10 | x : | +| active_support.rb:120:5:120:5 | x : | active_support.rb:121:10:121:10 | x : | +| active_support.rb:120:9:120:18 | call to source : | active_support.rb:120:5:120:5 | x : | | active_support.rb:121:10:121:10 | x : | active_support.rb:121:10:121:17 | call to squish | -| active_support.rb:125:9:125:18 | call to source : | active_support.rb:126:10:126:10 | x : | +| active_support.rb:125:5:125:5 | x : | active_support.rb:126:10:126:10 | x : | +| active_support.rb:125:9:125:18 | call to source : | active_support.rb:125:5:125:5 | x : | | active_support.rb:126:10:126:10 | x : | active_support.rb:126:10:126:18 | call to squish! | -| active_support.rb:130:9:130:18 | call to source : | active_support.rb:131:10:131:10 | x : | +| active_support.rb:130:5:130:5 | x : | active_support.rb:131:10:131:10 | x : | +| active_support.rb:130:9:130:18 | call to source : | active_support.rb:130:5:130:5 | x : | | active_support.rb:131:10:131:10 | x : | active_support.rb:131:10:131:24 | call to strip_heredoc | -| active_support.rb:135:9:135:18 | call to source : | active_support.rb:136:10:136:10 | x : | +| active_support.rb:135:5:135:5 | x : | active_support.rb:136:10:136:10 | x : | +| active_support.rb:135:9:135:18 | call to source : | active_support.rb:135:5:135:5 | x : | | active_support.rb:136:10:136:10 | x : | active_support.rb:136:10:136:19 | call to tableize | -| active_support.rb:140:9:140:18 | call to source : | active_support.rb:141:10:141:10 | x : | +| active_support.rb:140:5:140:5 | x : | active_support.rb:141:10:141:10 | x : | +| active_support.rb:140:9:140:18 | call to source : | active_support.rb:140:5:140:5 | x : | | active_support.rb:141:10:141:10 | x : | active_support.rb:141:10:141:20 | call to titlecase | -| active_support.rb:145:9:145:18 | call to source : | active_support.rb:146:10:146:10 | x : | +| active_support.rb:145:5:145:5 | x : | active_support.rb:146:10:146:10 | x : | +| active_support.rb:145:9:145:18 | call to source : | active_support.rb:145:5:145:5 | x : | | active_support.rb:146:10:146:10 | x : | active_support.rb:146:10:146:19 | call to titleize | -| active_support.rb:150:9:150:18 | call to source : | active_support.rb:151:10:151:10 | x : | +| active_support.rb:150:5:150:5 | x : | active_support.rb:151:10:151:10 | x : | +| active_support.rb:150:9:150:18 | call to source : | active_support.rb:150:5:150:5 | x : | | active_support.rb:151:10:151:10 | x : | active_support.rb:151:10:151:16 | call to to | -| active_support.rb:155:9:155:18 | call to source : | active_support.rb:156:10:156:10 | x : | +| active_support.rb:155:5:155:5 | x : | active_support.rb:156:10:156:10 | x : | +| active_support.rb:155:9:155:18 | call to source : | active_support.rb:155:5:155:5 | x : | | active_support.rb:156:10:156:10 | x : | active_support.rb:156:10:156:22 | call to truncate | -| active_support.rb:160:9:160:18 | call to source : | active_support.rb:161:10:161:10 | x : | +| active_support.rb:160:5:160:5 | x : | active_support.rb:161:10:161:10 | x : | +| active_support.rb:160:9:160:18 | call to source : | active_support.rb:160:5:160:5 | x : | | active_support.rb:161:10:161:10 | x : | active_support.rb:161:10:161:28 | call to truncate_bytes | -| active_support.rb:165:9:165:18 | call to source : | active_support.rb:166:10:166:10 | x : | +| active_support.rb:165:5:165:5 | x : | active_support.rb:166:10:166:10 | x : | +| active_support.rb:165:9:165:18 | call to source : | active_support.rb:165:5:165:5 | x : | | active_support.rb:166:10:166:10 | x : | active_support.rb:166:10:166:28 | call to truncate_words | -| active_support.rb:170:9:170:18 | call to source : | active_support.rb:171:10:171:10 | x : | +| active_support.rb:170:5:170:5 | x : | active_support.rb:171:10:171:10 | x : | +| active_support.rb:170:9:170:18 | call to source : | active_support.rb:170:5:170:5 | x : | | active_support.rb:171:10:171:10 | x : | active_support.rb:171:10:171:21 | call to underscore | -| active_support.rb:175:9:175:18 | call to source : | active_support.rb:176:10:176:10 | x : | +| active_support.rb:175:5:175:5 | x : | active_support.rb:176:10:176:10 | x : | +| active_support.rb:175:9:175:18 | call to source : | active_support.rb:175:5:175:5 | x : | | active_support.rb:176:10:176:10 | x : | active_support.rb:176:10:176:23 | call to upcase_first | -| active_support.rb:180:10:180:17 | call to source : | active_support.rb:181:9:181:9 | x [element 0] : | -| active_support.rb:180:10:180:17 | call to source : | active_support.rb:181:9:181:9 | x [element 0] : | +| active_support.rb:180:5:180:5 | x [element 0] : | active_support.rb:181:9:181:9 | x [element 0] : | +| active_support.rb:180:5:180:5 | x [element 0] : | active_support.rb:181:9:181:9 | x [element 0] : | +| active_support.rb:180:10:180:17 | call to source : | active_support.rb:180:5:180:5 | x [element 0] : | +| active_support.rb:180:10:180:17 | call to source : | active_support.rb:180:5:180:5 | x [element 0] : | +| active_support.rb:181:5:181:5 | y [element] : | active_support.rb:182:10:182:10 | y [element] : | +| active_support.rb:181:5:181:5 | y [element] : | active_support.rb:182:10:182:10 | y [element] : | | active_support.rb:181:9:181:9 | x [element 0] : | active_support.rb:181:9:181:23 | call to compact_blank [element] : | | active_support.rb:181:9:181:9 | x [element 0] : | active_support.rb:181:9:181:23 | call to compact_blank [element] : | -| active_support.rb:181:9:181:23 | call to compact_blank [element] : | active_support.rb:182:10:182:10 | y [element] : | -| active_support.rb:181:9:181:23 | call to compact_blank [element] : | active_support.rb:182:10:182:10 | y [element] : | +| active_support.rb:181:9:181:23 | call to compact_blank [element] : | active_support.rb:181:5:181:5 | y [element] : | +| active_support.rb:181:9:181:23 | call to compact_blank [element] : | active_support.rb:181:5:181:5 | y [element] : | | active_support.rb:182:10:182:10 | y [element] : | active_support.rb:182:10:182:13 | ...[...] | | active_support.rb:182:10:182:10 | y [element] : | active_support.rb:182:10:182:13 | ...[...] | -| active_support.rb:186:10:186:18 | call to source : | active_support.rb:187:9:187:9 | x [element 0] : | -| active_support.rb:186:10:186:18 | call to source : | active_support.rb:187:9:187:9 | x [element 0] : | +| active_support.rb:186:5:186:5 | x [element 0] : | active_support.rb:187:9:187:9 | x [element 0] : | +| active_support.rb:186:5:186:5 | x [element 0] : | active_support.rb:187:9:187:9 | x [element 0] : | +| active_support.rb:186:10:186:18 | call to source : | active_support.rb:186:5:186:5 | x [element 0] : | +| active_support.rb:186:10:186:18 | call to source : | active_support.rb:186:5:186:5 | x [element 0] : | +| active_support.rb:187:5:187:5 | y [element] : | active_support.rb:188:10:188:10 | y [element] : | +| active_support.rb:187:5:187:5 | y [element] : | active_support.rb:188:10:188:10 | y [element] : | | active_support.rb:187:9:187:9 | x [element 0] : | active_support.rb:187:9:187:21 | call to excluding [element] : | | active_support.rb:187:9:187:9 | x [element 0] : | active_support.rb:187:9:187:21 | call to excluding [element] : | -| active_support.rb:187:9:187:21 | call to excluding [element] : | active_support.rb:188:10:188:10 | y [element] : | -| active_support.rb:187:9:187:21 | call to excluding [element] : | active_support.rb:188:10:188:10 | y [element] : | +| active_support.rb:187:9:187:21 | call to excluding [element] : | active_support.rb:187:5:187:5 | y [element] : | +| active_support.rb:187:9:187:21 | call to excluding [element] : | active_support.rb:187:5:187:5 | y [element] : | | active_support.rb:188:10:188:10 | y [element] : | active_support.rb:188:10:188:13 | ...[...] | | active_support.rb:188:10:188:10 | y [element] : | active_support.rb:188:10:188:13 | ...[...] | -| active_support.rb:192:10:192:18 | call to source : | active_support.rb:193:9:193:9 | x [element 0] : | -| active_support.rb:192:10:192:18 | call to source : | active_support.rb:193:9:193:9 | x [element 0] : | +| active_support.rb:192:5:192:5 | x [element 0] : | active_support.rb:193:9:193:9 | x [element 0] : | +| active_support.rb:192:5:192:5 | x [element 0] : | active_support.rb:193:9:193:9 | x [element 0] : | +| active_support.rb:192:10:192:18 | call to source : | active_support.rb:192:5:192:5 | x [element 0] : | +| active_support.rb:192:10:192:18 | call to source : | active_support.rb:192:5:192:5 | x [element 0] : | +| active_support.rb:193:5:193:5 | y [element] : | active_support.rb:194:10:194:10 | y [element] : | +| active_support.rb:193:5:193:5 | y [element] : | active_support.rb:194:10:194:10 | y [element] : | | active_support.rb:193:9:193:9 | x [element 0] : | active_support.rb:193:9:193:19 | call to without [element] : | | active_support.rb:193:9:193:9 | x [element 0] : | active_support.rb:193:9:193:19 | call to without [element] : | -| active_support.rb:193:9:193:19 | call to without [element] : | active_support.rb:194:10:194:10 | y [element] : | -| active_support.rb:193:9:193:19 | call to without [element] : | active_support.rb:194:10:194:10 | y [element] : | +| active_support.rb:193:9:193:19 | call to without [element] : | active_support.rb:193:5:193:5 | y [element] : | +| active_support.rb:193:9:193:19 | call to without [element] : | active_support.rb:193:5:193:5 | y [element] : | | active_support.rb:194:10:194:10 | y [element] : | active_support.rb:194:10:194:13 | ...[...] | | active_support.rb:194:10:194:10 | y [element] : | active_support.rb:194:10:194:13 | ...[...] | -| active_support.rb:198:10:198:18 | call to source : | active_support.rb:199:9:199:9 | x [element 0] : | -| active_support.rb:198:10:198:18 | call to source : | active_support.rb:199:9:199:9 | x [element 0] : | +| active_support.rb:198:5:198:5 | x [element 0] : | active_support.rb:199:9:199:9 | x [element 0] : | +| active_support.rb:198:5:198:5 | x [element 0] : | active_support.rb:199:9:199:9 | x [element 0] : | +| active_support.rb:198:10:198:18 | call to source : | active_support.rb:198:5:198:5 | x [element 0] : | +| active_support.rb:198:10:198:18 | call to source : | active_support.rb:198:5:198:5 | x [element 0] : | +| active_support.rb:199:5:199:5 | y [element] : | active_support.rb:200:10:200:10 | y [element] : | +| active_support.rb:199:5:199:5 | y [element] : | active_support.rb:200:10:200:10 | y [element] : | | active_support.rb:199:9:199:9 | x [element 0] : | active_support.rb:199:9:199:37 | call to in_order_of [element] : | | active_support.rb:199:9:199:9 | x [element 0] : | active_support.rb:199:9:199:37 | call to in_order_of [element] : | -| active_support.rb:199:9:199:37 | call to in_order_of [element] : | active_support.rb:200:10:200:10 | y [element] : | -| active_support.rb:199:9:199:37 | call to in_order_of [element] : | active_support.rb:200:10:200:10 | y [element] : | +| active_support.rb:199:9:199:37 | call to in_order_of [element] : | active_support.rb:199:5:199:5 | y [element] : | +| active_support.rb:199:9:199:37 | call to in_order_of [element] : | active_support.rb:199:5:199:5 | y [element] : | | active_support.rb:200:10:200:10 | y [element] : | active_support.rb:200:10:200:13 | ...[...] | | active_support.rb:200:10:200:10 | y [element] : | active_support.rb:200:10:200:13 | ...[...] | -| active_support.rb:204:10:204:18 | call to source : | active_support.rb:205:9:205:9 | a [element 0] : | -| active_support.rb:204:10:204:18 | call to source : | active_support.rb:205:9:205:9 | a [element 0] : | -| active_support.rb:204:10:204:18 | call to source : | active_support.rb:206:10:206:10 | a [element 0] : | -| active_support.rb:204:10:204:18 | call to source : | active_support.rb:206:10:206:10 | a [element 0] : | +| active_support.rb:204:5:204:5 | a [element 0] : | active_support.rb:205:9:205:9 | a [element 0] : | +| active_support.rb:204:5:204:5 | a [element 0] : | active_support.rb:205:9:205:9 | a [element 0] : | +| active_support.rb:204:5:204:5 | a [element 0] : | active_support.rb:206:10:206:10 | a [element 0] : | +| active_support.rb:204:5:204:5 | a [element 0] : | active_support.rb:206:10:206:10 | a [element 0] : | +| active_support.rb:204:10:204:18 | call to source : | active_support.rb:204:5:204:5 | a [element 0] : | +| active_support.rb:204:10:204:18 | call to source : | active_support.rb:204:5:204:5 | a [element 0] : | +| active_support.rb:205:5:205:5 | b [element 0] : | active_support.rb:208:10:208:10 | b [element 0] : | +| active_support.rb:205:5:205:5 | b [element 0] : | active_support.rb:208:10:208:10 | b [element 0] : | +| active_support.rb:205:5:205:5 | b [element] : | active_support.rb:208:10:208:10 | b [element] : | +| active_support.rb:205:5:205:5 | b [element] : | active_support.rb:208:10:208:10 | b [element] : | +| active_support.rb:205:5:205:5 | b [element] : | active_support.rb:209:10:209:10 | b [element] : | +| active_support.rb:205:5:205:5 | b [element] : | active_support.rb:209:10:209:10 | b [element] : | +| active_support.rb:205:5:205:5 | b [element] : | active_support.rb:210:10:210:10 | b [element] : | +| active_support.rb:205:5:205:5 | b [element] : | active_support.rb:210:10:210:10 | b [element] : | +| active_support.rb:205:5:205:5 | b [element] : | active_support.rb:211:10:211:10 | b [element] : | +| active_support.rb:205:5:205:5 | b [element] : | active_support.rb:211:10:211:10 | b [element] : | | active_support.rb:205:9:205:9 | a [element 0] : | active_support.rb:205:9:205:41 | call to including [element 0] : | | active_support.rb:205:9:205:9 | a [element 0] : | active_support.rb:205:9:205:41 | call to including [element 0] : | -| active_support.rb:205:9:205:41 | call to including [element 0] : | active_support.rb:208:10:208:10 | b [element 0] : | -| active_support.rb:205:9:205:41 | call to including [element 0] : | active_support.rb:208:10:208:10 | b [element 0] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:208:10:208:10 | b [element] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:208:10:208:10 | b [element] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:209:10:209:10 | b [element] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:209:10:209:10 | b [element] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:210:10:210:10 | b [element] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:210:10:210:10 | b [element] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:211:10:211:10 | b [element] : | -| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:211:10:211:10 | b [element] : | +| active_support.rb:205:9:205:41 | call to including [element 0] : | active_support.rb:205:5:205:5 | b [element 0] : | +| active_support.rb:205:9:205:41 | call to including [element 0] : | active_support.rb:205:5:205:5 | b [element 0] : | +| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:205:5:205:5 | b [element] : | +| active_support.rb:205:9:205:41 | call to including [element] : | active_support.rb:205:5:205:5 | b [element] : | | active_support.rb:205:21:205:29 | call to source : | active_support.rb:205:9:205:41 | call to including [element] : | | active_support.rb:205:21:205:29 | call to source : | active_support.rb:205:9:205:41 | call to including [element] : | | active_support.rb:205:32:205:40 | call to source : | active_support.rb:205:9:205:41 | call to including [element] : | @@ -133,130 +189,202 @@ edges | active_support.rb:210:10:210:10 | b [element] : | active_support.rb:210:10:210:13 | ...[...] | | active_support.rb:211:10:211:10 | b [element] : | active_support.rb:211:10:211:13 | ...[...] | | active_support.rb:211:10:211:10 | b [element] : | active_support.rb:211:10:211:13 | ...[...] | -| active_support.rb:215:7:215:16 | call to source : | active_support.rb:216:34:216:34 | x : | -| active_support.rb:216:7:216:35 | call to new : | active_support.rb:217:8:217:8 | y | +| active_support.rb:215:3:215:3 | x : | active_support.rb:216:34:216:34 | x : | +| active_support.rb:215:7:215:16 | call to source : | active_support.rb:215:3:215:3 | x : | +| active_support.rb:216:3:216:3 | y : | active_support.rb:217:8:217:8 | y | +| active_support.rb:216:7:216:35 | call to new : | active_support.rb:216:3:216:3 | y : | | active_support.rb:216:34:216:34 | x : | active_support.rb:216:7:216:35 | call to new : | -| active_support.rb:222:7:222:16 | call to source : | active_support.rb:223:21:223:21 | b : | -| active_support.rb:223:7:223:22 | call to safe_concat : | active_support.rb:224:8:224:8 | y | +| active_support.rb:222:3:222:3 | b : | active_support.rb:223:21:223:21 | b : | +| active_support.rb:222:7:222:16 | call to source : | active_support.rb:222:3:222:3 | b : | +| active_support.rb:223:3:223:3 | y : | active_support.rb:224:8:224:8 | y | +| active_support.rb:223:7:223:22 | call to safe_concat : | active_support.rb:223:3:223:3 | y : | | active_support.rb:223:21:223:21 | b : | active_support.rb:223:7:223:22 | call to safe_concat : | -| active_support.rb:229:7:229:16 | call to source : | active_support.rb:230:17:230:17 | b : | +| active_support.rb:229:3:229:3 | b : | active_support.rb:230:17:230:17 | b : | +| active_support.rb:229:7:229:16 | call to source : | active_support.rb:229:3:229:3 | b : | | active_support.rb:230:3:230:3 | [post] x : | active_support.rb:231:8:231:8 | x | | active_support.rb:230:17:230:17 | b : | active_support.rb:230:3:230:3 | [post] x : | -| active_support.rb:235:7:235:16 | call to source : | active_support.rb:237:34:237:34 | a : | -| active_support.rb:237:7:237:35 | call to new : | active_support.rb:238:7:238:7 | x : | +| active_support.rb:235:3:235:3 | a : | active_support.rb:237:34:237:34 | a : | +| active_support.rb:235:7:235:16 | call to source : | active_support.rb:235:3:235:3 | a : | +| active_support.rb:237:3:237:3 | x : | active_support.rb:238:7:238:7 | x : | +| active_support.rb:237:7:237:35 | call to new : | active_support.rb:237:3:237:3 | x : | | active_support.rb:237:34:237:34 | a : | active_support.rb:237:7:237:35 | call to new : | +| active_support.rb:238:3:238:3 | y : | active_support.rb:239:8:239:8 | y | | active_support.rb:238:7:238:7 | x : | active_support.rb:238:7:238:17 | call to concat : | -| active_support.rb:238:7:238:17 | call to concat : | active_support.rb:239:8:239:8 | y | -| active_support.rb:243:7:243:16 | call to source : | active_support.rb:245:34:245:34 | a : | -| active_support.rb:245:7:245:35 | call to new : | active_support.rb:246:7:246:7 | x : | +| active_support.rb:238:7:238:17 | call to concat : | active_support.rb:238:3:238:3 | y : | +| active_support.rb:243:3:243:3 | a : | active_support.rb:245:34:245:34 | a : | +| active_support.rb:243:7:243:16 | call to source : | active_support.rb:243:3:243:3 | a : | +| active_support.rb:245:3:245:3 | x : | active_support.rb:246:7:246:7 | x : | +| active_support.rb:245:7:245:35 | call to new : | active_support.rb:245:3:245:3 | x : | | active_support.rb:245:34:245:34 | a : | active_support.rb:245:7:245:35 | call to new : | +| active_support.rb:246:3:246:3 | y : | active_support.rb:247:8:247:8 | y | | active_support.rb:246:7:246:7 | x : | active_support.rb:246:7:246:20 | call to insert : | -| active_support.rb:246:7:246:20 | call to insert : | active_support.rb:247:8:247:8 | y | -| active_support.rb:251:7:251:16 | call to source : | active_support.rb:253:34:253:34 | a : | -| active_support.rb:253:7:253:35 | call to new : | active_support.rb:254:7:254:7 | x : | +| active_support.rb:246:7:246:20 | call to insert : | active_support.rb:246:3:246:3 | y : | +| active_support.rb:251:3:251:3 | a : | active_support.rb:253:34:253:34 | a : | +| active_support.rb:251:7:251:16 | call to source : | active_support.rb:251:3:251:3 | a : | +| active_support.rb:253:3:253:3 | x : | active_support.rb:254:7:254:7 | x : | +| active_support.rb:253:7:253:35 | call to new : | active_support.rb:253:3:253:3 | x : | | active_support.rb:253:34:253:34 | a : | active_support.rb:253:7:253:35 | call to new : | +| active_support.rb:254:3:254:3 | y : | active_support.rb:255:8:255:8 | y | | active_support.rb:254:7:254:7 | x : | active_support.rb:254:7:254:18 | call to prepend : | -| active_support.rb:254:7:254:18 | call to prepend : | active_support.rb:255:8:255:8 | y | -| active_support.rb:259:7:259:16 | call to source : | active_support.rb:260:34:260:34 | a : | -| active_support.rb:260:7:260:35 | call to new : | active_support.rb:261:7:261:7 | x : | +| active_support.rb:254:7:254:18 | call to prepend : | active_support.rb:254:3:254:3 | y : | +| active_support.rb:259:3:259:3 | a : | active_support.rb:260:34:260:34 | a : | +| active_support.rb:259:7:259:16 | call to source : | active_support.rb:259:3:259:3 | a : | +| active_support.rb:260:3:260:3 | x : | active_support.rb:261:7:261:7 | x : | +| active_support.rb:260:7:260:35 | call to new : | active_support.rb:260:3:260:3 | x : | | active_support.rb:260:34:260:34 | a : | active_support.rb:260:7:260:35 | call to new : | +| active_support.rb:261:3:261:3 | y : | active_support.rb:262:8:262:8 | y | | active_support.rb:261:7:261:7 | x : | active_support.rb:261:7:261:12 | call to to_s : | -| active_support.rb:261:7:261:12 | call to to_s : | active_support.rb:262:8:262:8 | y | -| active_support.rb:266:7:266:16 | call to source : | active_support.rb:267:34:267:34 | a : | -| active_support.rb:267:7:267:35 | call to new : | active_support.rb:268:7:268:7 | x : | +| active_support.rb:261:7:261:12 | call to to_s : | active_support.rb:261:3:261:3 | y : | +| active_support.rb:266:3:266:3 | a : | active_support.rb:267:34:267:34 | a : | +| active_support.rb:266:7:266:16 | call to source : | active_support.rb:266:3:266:3 | a : | +| active_support.rb:267:3:267:3 | x : | active_support.rb:268:7:268:7 | x : | +| active_support.rb:267:7:267:35 | call to new : | active_support.rb:267:3:267:3 | x : | | active_support.rb:267:34:267:34 | a : | active_support.rb:267:7:267:35 | call to new : | +| active_support.rb:268:3:268:3 | y : | active_support.rb:269:8:269:8 | y | | active_support.rb:268:7:268:7 | x : | active_support.rb:268:7:268:16 | call to to_param : | -| active_support.rb:268:7:268:16 | call to to_param : | active_support.rb:269:8:269:8 | y | -| active_support.rb:273:7:273:16 | call to source : | active_support.rb:274:20:274:20 | a : | -| active_support.rb:274:7:274:21 | call to new : | active_support.rb:275:7:275:7 | x : | +| active_support.rb:268:7:268:16 | call to to_param : | active_support.rb:268:3:268:3 | y : | +| active_support.rb:273:3:273:3 | a : | active_support.rb:274:20:274:20 | a : | +| active_support.rb:273:7:273:16 | call to source : | active_support.rb:273:3:273:3 | a : | +| active_support.rb:274:3:274:3 | x : | active_support.rb:275:7:275:7 | x : | +| active_support.rb:274:7:274:21 | call to new : | active_support.rb:274:3:274:3 | x : | | active_support.rb:274:20:274:20 | a : | active_support.rb:274:7:274:21 | call to new : | +| active_support.rb:275:3:275:3 | y : | active_support.rb:276:8:276:8 | y | +| active_support.rb:275:3:275:3 | y : | active_support.rb:277:7:277:7 | y : | | active_support.rb:275:7:275:7 | x : | active_support.rb:275:7:275:17 | call to existence : | -| active_support.rb:275:7:275:17 | call to existence : | active_support.rb:276:8:276:8 | y | -| active_support.rb:275:7:275:17 | call to existence : | active_support.rb:277:7:277:7 | y : | +| active_support.rb:275:7:275:17 | call to existence : | active_support.rb:275:3:275:3 | y : | +| active_support.rb:277:3:277:3 | z : | active_support.rb:278:8:278:8 | z | | active_support.rb:277:7:277:7 | y : | active_support.rb:277:7:277:17 | call to existence : | -| active_support.rb:277:7:277:17 | call to existence : | active_support.rb:278:8:278:8 | z | -| active_support.rb:282:7:282:16 | call to source : | active_support.rb:283:8:283:8 | x : | -| active_support.rb:282:7:282:16 | call to source : | active_support.rb:283:8:283:8 | x : | +| active_support.rb:277:7:277:17 | call to existence : | active_support.rb:277:3:277:3 | z : | +| active_support.rb:282:3:282:3 | x : | active_support.rb:283:8:283:8 | x : | +| active_support.rb:282:3:282:3 | x : | active_support.rb:283:8:283:8 | x : | +| active_support.rb:282:7:282:16 | call to source : | active_support.rb:282:3:282:3 | x : | +| active_support.rb:282:7:282:16 | call to source : | active_support.rb:282:3:282:3 | x : | | active_support.rb:283:8:283:8 | x : | active_support.rb:283:8:283:17 | call to presence | | active_support.rb:283:8:283:8 | x : | active_support.rb:283:8:283:17 | call to presence | -| active_support.rb:285:7:285:16 | call to source : | active_support.rb:286:8:286:8 | y : | -| active_support.rb:285:7:285:16 | call to source : | active_support.rb:286:8:286:8 | y : | +| active_support.rb:285:3:285:3 | y : | active_support.rb:286:8:286:8 | y : | +| active_support.rb:285:3:285:3 | y : | active_support.rb:286:8:286:8 | y : | +| active_support.rb:285:7:285:16 | call to source : | active_support.rb:285:3:285:3 | y : | +| active_support.rb:285:7:285:16 | call to source : | active_support.rb:285:3:285:3 | y : | | active_support.rb:286:8:286:8 | y : | active_support.rb:286:8:286:17 | call to presence | | active_support.rb:286:8:286:8 | y : | active_support.rb:286:8:286:17 | call to presence | -| active_support.rb:290:7:290:16 | call to source : | active_support.rb:291:8:291:8 | x : | -| active_support.rb:290:7:290:16 | call to source : | active_support.rb:291:8:291:8 | x : | +| active_support.rb:290:3:290:3 | x : | active_support.rb:291:8:291:8 | x : | +| active_support.rb:290:3:290:3 | x : | active_support.rb:291:8:291:8 | x : | +| active_support.rb:290:7:290:16 | call to source : | active_support.rb:290:3:290:3 | x : | +| active_support.rb:290:7:290:16 | call to source : | active_support.rb:290:3:290:3 | x : | | active_support.rb:291:8:291:8 | x : | active_support.rb:291:8:291:17 | call to deep_dup | | active_support.rb:291:8:291:8 | x : | active_support.rb:291:8:291:17 | call to deep_dup | -| active_support.rb:303:7:303:16 | call to source : | active_support.rb:304:19:304:19 | a : | -| active_support.rb:304:7:304:19 | call to json_escape : | active_support.rb:305:8:305:8 | b | +| active_support.rb:303:3:303:3 | a : | active_support.rb:304:19:304:19 | a : | +| active_support.rb:303:7:303:16 | call to source : | active_support.rb:303:3:303:3 | a : | +| active_support.rb:304:3:304:3 | b : | active_support.rb:305:8:305:8 | b | +| active_support.rb:304:7:304:19 | call to json_escape : | active_support.rb:304:3:304:3 | b : | | active_support.rb:304:19:304:19 | a : | active_support.rb:304:7:304:19 | call to json_escape : | -| active_support.rb:309:9:309:18 | call to source : | active_support.rb:310:37:310:37 | x : | +| active_support.rb:309:5:309:5 | x : | active_support.rb:310:37:310:37 | x : | +| active_support.rb:309:9:309:18 | call to source : | active_support.rb:309:5:309:5 | x : | | active_support.rb:310:37:310:37 | x : | active_support.rb:310:10:310:38 | call to encode | -| active_support.rb:314:9:314:18 | call to source : | active_support.rb:315:37:315:37 | x : | +| active_support.rb:314:5:314:5 | x : | active_support.rb:315:37:315:37 | x : | +| active_support.rb:314:9:314:18 | call to source : | active_support.rb:314:5:314:5 | x : | | active_support.rb:315:37:315:37 | x : | active_support.rb:315:10:315:38 | call to decode | -| active_support.rb:319:9:319:18 | call to source : | active_support.rb:320:35:320:35 | x : | +| active_support.rb:319:5:319:5 | x : | active_support.rb:320:35:320:35 | x : | +| active_support.rb:319:9:319:18 | call to source : | active_support.rb:319:5:319:5 | x : | | active_support.rb:320:35:320:35 | x : | active_support.rb:320:10:320:36 | call to dump | -| active_support.rb:324:9:324:18 | call to source : | active_support.rb:325:35:325:35 | x : | +| active_support.rb:324:5:324:5 | x : | active_support.rb:325:35:325:35 | x : | +| active_support.rb:324:9:324:18 | call to source : | active_support.rb:324:5:324:5 | x : | | active_support.rb:325:35:325:35 | x : | active_support.rb:325:10:325:36 | call to load | -| active_support.rb:329:9:329:18 | call to source : | active_support.rb:330:10:330:10 | x : | -| active_support.rb:329:9:329:18 | call to source : | active_support.rb:331:10:331:10 | x : | -| active_support.rb:330:10:330:10 | x : | active_support.rb:332:10:332:10 | y [element 0] : | +| active_support.rb:329:5:329:5 | x : | active_support.rb:330:10:330:10 | x : | +| active_support.rb:329:5:329:5 | x : | active_support.rb:331:10:331:10 | x : | +| active_support.rb:329:9:329:18 | call to source : | active_support.rb:329:5:329:5 | x : | +| active_support.rb:330:5:330:5 | y [element 0] : | active_support.rb:332:10:332:10 | y [element 0] : | +| active_support.rb:330:10:330:10 | x : | active_support.rb:330:5:330:5 | y [element 0] : | | active_support.rb:331:10:331:10 | x : | active_support.rb:331:10:331:18 | call to to_json | | active_support.rb:332:10:332:10 | y [element 0] : | active_support.rb:332:10:332:18 | call to to_json | -| hash_extensions.rb:2:14:2:24 | call to source : | hash_extensions.rb:3:9:3:9 | h [element :a] : | -| hash_extensions.rb:2:14:2:24 | call to source : | hash_extensions.rb:3:9:3:9 | h [element :a] : | +| hash_extensions.rb:2:5:2:5 | h [element :a] : | hash_extensions.rb:3:9:3:9 | h [element :a] : | +| hash_extensions.rb:2:5:2:5 | h [element :a] : | hash_extensions.rb:3:9:3:9 | h [element :a] : | +| hash_extensions.rb:2:14:2:24 | call to source : | hash_extensions.rb:2:5:2:5 | h [element :a] : | +| hash_extensions.rb:2:14:2:24 | call to source : | hash_extensions.rb:2:5:2:5 | h [element :a] : | +| hash_extensions.rb:3:5:3:5 | x [element] : | hash_extensions.rb:4:10:4:10 | x [element] : | +| hash_extensions.rb:3:5:3:5 | x [element] : | hash_extensions.rb:4:10:4:10 | x [element] : | | hash_extensions.rb:3:9:3:9 | h [element :a] : | hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] : | | hash_extensions.rb:3:9:3:9 | h [element :a] : | hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] : | -| hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] : | hash_extensions.rb:4:10:4:10 | x [element] : | -| hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] : | hash_extensions.rb:4:10:4:10 | x [element] : | +| hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] : | hash_extensions.rb:3:5:3:5 | x [element] : | +| hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] : | hash_extensions.rb:3:5:3:5 | x [element] : | | hash_extensions.rb:4:10:4:10 | x [element] : | hash_extensions.rb:4:10:4:14 | ...[...] | | hash_extensions.rb:4:10:4:10 | x [element] : | hash_extensions.rb:4:10:4:14 | ...[...] | -| hash_extensions.rb:10:14:10:24 | call to source : | hash_extensions.rb:11:9:11:9 | h [element :a] : | -| hash_extensions.rb:10:14:10:24 | call to source : | hash_extensions.rb:11:9:11:9 | h [element :a] : | +| hash_extensions.rb:10:5:10:5 | h [element :a] : | hash_extensions.rb:11:9:11:9 | h [element :a] : | +| hash_extensions.rb:10:5:10:5 | h [element :a] : | hash_extensions.rb:11:9:11:9 | h [element :a] : | +| hash_extensions.rb:10:14:10:24 | call to source : | hash_extensions.rb:10:5:10:5 | h [element :a] : | +| hash_extensions.rb:10:14:10:24 | call to source : | hash_extensions.rb:10:5:10:5 | h [element :a] : | +| hash_extensions.rb:11:5:11:5 | x [element] : | hash_extensions.rb:12:10:12:10 | x [element] : | +| hash_extensions.rb:11:5:11:5 | x [element] : | hash_extensions.rb:12:10:12:10 | x [element] : | | hash_extensions.rb:11:9:11:9 | h [element :a] : | hash_extensions.rb:11:9:11:20 | call to to_options [element] : | | hash_extensions.rb:11:9:11:9 | h [element :a] : | hash_extensions.rb:11:9:11:20 | call to to_options [element] : | -| hash_extensions.rb:11:9:11:20 | call to to_options [element] : | hash_extensions.rb:12:10:12:10 | x [element] : | -| hash_extensions.rb:11:9:11:20 | call to to_options [element] : | hash_extensions.rb:12:10:12:10 | x [element] : | +| hash_extensions.rb:11:9:11:20 | call to to_options [element] : | hash_extensions.rb:11:5:11:5 | x [element] : | +| hash_extensions.rb:11:9:11:20 | call to to_options [element] : | hash_extensions.rb:11:5:11:5 | x [element] : | | hash_extensions.rb:12:10:12:10 | x [element] : | hash_extensions.rb:12:10:12:14 | ...[...] | | hash_extensions.rb:12:10:12:10 | x [element] : | hash_extensions.rb:12:10:12:14 | ...[...] | -| hash_extensions.rb:18:14:18:24 | call to source : | hash_extensions.rb:19:9:19:9 | h [element :a] : | -| hash_extensions.rb:18:14:18:24 | call to source : | hash_extensions.rb:19:9:19:9 | h [element :a] : | +| hash_extensions.rb:18:5:18:5 | h [element :a] : | hash_extensions.rb:19:9:19:9 | h [element :a] : | +| hash_extensions.rb:18:5:18:5 | h [element :a] : | hash_extensions.rb:19:9:19:9 | h [element :a] : | +| hash_extensions.rb:18:14:18:24 | call to source : | hash_extensions.rb:18:5:18:5 | h [element :a] : | +| hash_extensions.rb:18:14:18:24 | call to source : | hash_extensions.rb:18:5:18:5 | h [element :a] : | +| hash_extensions.rb:19:5:19:5 | x [element] : | hash_extensions.rb:20:10:20:10 | x [element] : | +| hash_extensions.rb:19:5:19:5 | x [element] : | hash_extensions.rb:20:10:20:10 | x [element] : | | hash_extensions.rb:19:9:19:9 | h [element :a] : | hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] : | | hash_extensions.rb:19:9:19:9 | h [element :a] : | hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] : | -| hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] : | hash_extensions.rb:20:10:20:10 | x [element] : | -| hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] : | hash_extensions.rb:20:10:20:10 | x [element] : | +| hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] : | hash_extensions.rb:19:5:19:5 | x [element] : | +| hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] : | hash_extensions.rb:19:5:19:5 | x [element] : | | hash_extensions.rb:20:10:20:10 | x [element] : | hash_extensions.rb:20:10:20:14 | ...[...] | | hash_extensions.rb:20:10:20:10 | x [element] : | hash_extensions.rb:20:10:20:14 | ...[...] | -| hash_extensions.rb:26:14:26:24 | call to source : | hash_extensions.rb:27:9:27:9 | h [element :a] : | -| hash_extensions.rb:26:14:26:24 | call to source : | hash_extensions.rb:27:9:27:9 | h [element :a] : | +| hash_extensions.rb:26:5:26:5 | h [element :a] : | hash_extensions.rb:27:9:27:9 | h [element :a] : | +| hash_extensions.rb:26:5:26:5 | h [element :a] : | hash_extensions.rb:27:9:27:9 | h [element :a] : | +| hash_extensions.rb:26:14:26:24 | call to source : | hash_extensions.rb:26:5:26:5 | h [element :a] : | +| hash_extensions.rb:26:14:26:24 | call to source : | hash_extensions.rb:26:5:26:5 | h [element :a] : | +| hash_extensions.rb:27:5:27:5 | x [element] : | hash_extensions.rb:28:10:28:10 | x [element] : | +| hash_extensions.rb:27:5:27:5 | x [element] : | hash_extensions.rb:28:10:28:10 | x [element] : | | hash_extensions.rb:27:9:27:9 | h [element :a] : | hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] : | | hash_extensions.rb:27:9:27:9 | h [element :a] : | hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] : | -| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] : | hash_extensions.rb:28:10:28:10 | x [element] : | -| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] : | hash_extensions.rb:28:10:28:10 | x [element] : | +| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] : | hash_extensions.rb:27:5:27:5 | x [element] : | +| hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] : | hash_extensions.rb:27:5:27:5 | x [element] : | | hash_extensions.rb:28:10:28:10 | x [element] : | hash_extensions.rb:28:10:28:14 | ...[...] | | hash_extensions.rb:28:10:28:10 | x [element] : | hash_extensions.rb:28:10:28:14 | ...[...] | -| hash_extensions.rb:34:14:34:24 | call to source : | hash_extensions.rb:35:9:35:9 | h [element :a] : | -| hash_extensions.rb:34:14:34:24 | call to source : | hash_extensions.rb:35:9:35:9 | h [element :a] : | +| hash_extensions.rb:34:5:34:5 | h [element :a] : | hash_extensions.rb:35:9:35:9 | h [element :a] : | +| hash_extensions.rb:34:5:34:5 | h [element :a] : | hash_extensions.rb:35:9:35:9 | h [element :a] : | +| hash_extensions.rb:34:14:34:24 | call to source : | hash_extensions.rb:34:5:34:5 | h [element :a] : | +| hash_extensions.rb:34:14:34:24 | call to source : | hash_extensions.rb:34:5:34:5 | h [element :a] : | +| hash_extensions.rb:35:5:35:5 | x [element] : | hash_extensions.rb:36:10:36:10 | x [element] : | +| hash_extensions.rb:35:5:35:5 | x [element] : | hash_extensions.rb:36:10:36:10 | x [element] : | | hash_extensions.rb:35:9:35:9 | h [element :a] : | hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] : | | hash_extensions.rb:35:9:35:9 | h [element :a] : | hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] : | -| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] : | hash_extensions.rb:36:10:36:10 | x [element] : | -| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] : | hash_extensions.rb:36:10:36:10 | x [element] : | +| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] : | hash_extensions.rb:35:5:35:5 | x [element] : | +| hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] : | hash_extensions.rb:35:5:35:5 | x [element] : | | hash_extensions.rb:36:10:36:10 | x [element] : | hash_extensions.rb:36:10:36:14 | ...[...] | | hash_extensions.rb:36:10:36:10 | x [element] : | hash_extensions.rb:36:10:36:14 | ...[...] | -| hash_extensions.rb:42:14:42:24 | call to source : | hash_extensions.rb:43:9:43:9 | h [element :a] : | -| hash_extensions.rb:42:14:42:24 | call to source : | hash_extensions.rb:43:9:43:9 | h [element :a] : | +| hash_extensions.rb:42:5:42:5 | h [element :a] : | hash_extensions.rb:43:9:43:9 | h [element :a] : | +| hash_extensions.rb:42:5:42:5 | h [element :a] : | hash_extensions.rb:43:9:43:9 | h [element :a] : | +| hash_extensions.rb:42:14:42:24 | call to source : | hash_extensions.rb:42:5:42:5 | h [element :a] : | +| hash_extensions.rb:42:14:42:24 | call to source : | hash_extensions.rb:42:5:42:5 | h [element :a] : | +| hash_extensions.rb:43:5:43:5 | x [element] : | hash_extensions.rb:44:10:44:10 | x [element] : | +| hash_extensions.rb:43:5:43:5 | x [element] : | hash_extensions.rb:44:10:44:10 | x [element] : | | hash_extensions.rb:43:9:43:9 | h [element :a] : | hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] : | | hash_extensions.rb:43:9:43:9 | h [element :a] : | hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] : | -| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] : | hash_extensions.rb:44:10:44:10 | x [element] : | -| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] : | hash_extensions.rb:44:10:44:10 | x [element] : | +| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] : | hash_extensions.rb:43:5:43:5 | x [element] : | +| hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] : | hash_extensions.rb:43:5:43:5 | x [element] : | | hash_extensions.rb:44:10:44:10 | x [element] : | hash_extensions.rb:44:10:44:14 | ...[...] | | hash_extensions.rb:44:10:44:10 | x [element] : | hash_extensions.rb:44:10:44:14 | ...[...] | -| hash_extensions.rb:50:14:50:23 | call to taint : | hash_extensions.rb:51:9:51:9 | h [element :a] : | -| hash_extensions.rb:50:14:50:23 | call to taint : | hash_extensions.rb:51:9:51:9 | h [element :a] : | -| hash_extensions.rb:50:29:50:38 | call to taint : | hash_extensions.rb:51:9:51:9 | h [element :b] : | -| hash_extensions.rb:50:29:50:38 | call to taint : | hash_extensions.rb:51:9:51:9 | h [element :b] : | -| hash_extensions.rb:50:52:50:61 | call to taint : | hash_extensions.rb:51:9:51:9 | h [element :d] : | -| hash_extensions.rb:50:52:50:61 | call to taint : | hash_extensions.rb:51:9:51:9 | h [element :d] : | +| hash_extensions.rb:50:5:50:5 | h [element :a] : | hash_extensions.rb:51:9:51:9 | h [element :a] : | +| hash_extensions.rb:50:5:50:5 | h [element :a] : | hash_extensions.rb:51:9:51:9 | h [element :a] : | +| hash_extensions.rb:50:5:50:5 | h [element :b] : | hash_extensions.rb:51:9:51:9 | h [element :b] : | +| hash_extensions.rb:50:5:50:5 | h [element :b] : | hash_extensions.rb:51:9:51:9 | h [element :b] : | +| hash_extensions.rb:50:5:50:5 | h [element :d] : | hash_extensions.rb:51:9:51:9 | h [element :d] : | +| hash_extensions.rb:50:5:50:5 | h [element :d] : | hash_extensions.rb:51:9:51:9 | h [element :d] : | +| hash_extensions.rb:50:14:50:23 | call to taint : | hash_extensions.rb:50:5:50:5 | h [element :a] : | +| hash_extensions.rb:50:14:50:23 | call to taint : | hash_extensions.rb:50:5:50:5 | h [element :a] : | +| hash_extensions.rb:50:29:50:38 | call to taint : | hash_extensions.rb:50:5:50:5 | h [element :b] : | +| hash_extensions.rb:50:29:50:38 | call to taint : | hash_extensions.rb:50:5:50:5 | h [element :b] : | +| hash_extensions.rb:50:52:50:61 | call to taint : | hash_extensions.rb:50:5:50:5 | h [element :d] : | +| hash_extensions.rb:50:52:50:61 | call to taint : | hash_extensions.rb:50:5:50:5 | h [element :d] : | +| hash_extensions.rb:51:5:51:5 | x [element :a] : | hash_extensions.rb:58:10:58:10 | x [element :a] : | +| hash_extensions.rb:51:5:51:5 | x [element :a] : | hash_extensions.rb:58:10:58:10 | x [element :a] : | +| hash_extensions.rb:51:5:51:5 | x [element :b] : | hash_extensions.rb:59:10:59:10 | x [element :b] : | +| hash_extensions.rb:51:5:51:5 | x [element :b] : | hash_extensions.rb:59:10:59:10 | x [element :b] : | | hash_extensions.rb:51:9:51:9 | [post] h [element :d] : | hash_extensions.rb:56:10:56:10 | h [element :d] : | | hash_extensions.rb:51:9:51:9 | [post] h [element :d] : | hash_extensions.rb:56:10:56:10 | h [element :d] : | | hash_extensions.rb:51:9:51:9 | h [element :a] : | hash_extensions.rb:51:9:51:29 | call to extract! [element :a] : | @@ -265,22 +393,32 @@ edges | hash_extensions.rb:51:9:51:9 | h [element :b] : | hash_extensions.rb:51:9:51:29 | call to extract! [element :b] : | | hash_extensions.rb:51:9:51:9 | h [element :d] : | hash_extensions.rb:51:9:51:9 | [post] h [element :d] : | | hash_extensions.rb:51:9:51:9 | h [element :d] : | hash_extensions.rb:51:9:51:9 | [post] h [element :d] : | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :a] : | hash_extensions.rb:58:10:58:10 | x [element :a] : | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :a] : | hash_extensions.rb:58:10:58:10 | x [element :a] : | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] : | hash_extensions.rb:59:10:59:10 | x [element :b] : | -| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] : | hash_extensions.rb:59:10:59:10 | x [element :b] : | +| hash_extensions.rb:51:9:51:29 | call to extract! [element :a] : | hash_extensions.rb:51:5:51:5 | x [element :a] : | +| hash_extensions.rb:51:9:51:29 | call to extract! [element :a] : | hash_extensions.rb:51:5:51:5 | x [element :a] : | +| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] : | hash_extensions.rb:51:5:51:5 | x [element :b] : | +| hash_extensions.rb:51:9:51:29 | call to extract! [element :b] : | hash_extensions.rb:51:5:51:5 | x [element :b] : | | hash_extensions.rb:56:10:56:10 | h [element :d] : | hash_extensions.rb:56:10:56:14 | ...[...] | | hash_extensions.rb:56:10:56:10 | h [element :d] : | hash_extensions.rb:56:10:56:14 | ...[...] | | hash_extensions.rb:58:10:58:10 | x [element :a] : | hash_extensions.rb:58:10:58:14 | ...[...] | | hash_extensions.rb:58:10:58:10 | x [element :a] : | hash_extensions.rb:58:10:58:14 | ...[...] | | hash_extensions.rb:59:10:59:10 | x [element :b] : | hash_extensions.rb:59:10:59:14 | ...[...] | | hash_extensions.rb:59:10:59:10 | x [element :b] : | hash_extensions.rb:59:10:59:14 | ...[...] | -| hash_extensions.rb:67:15:67:25 | call to source : | hash_extensions.rb:68:9:68:14 | values [element 0] : | -| hash_extensions.rb:67:15:67:25 | call to source : | hash_extensions.rb:68:9:68:14 | values [element 0] : | -| hash_extensions.rb:67:28:67:38 | call to source : | hash_extensions.rb:68:9:68:14 | values [element 1] : | -| hash_extensions.rb:67:28:67:38 | call to source : | hash_extensions.rb:68:9:68:14 | values [element 1] : | -| hash_extensions.rb:67:41:67:51 | call to source : | hash_extensions.rb:68:9:68:14 | values [element 2] : | -| hash_extensions.rb:67:41:67:51 | call to source : | hash_extensions.rb:68:9:68:14 | values [element 2] : | +| hash_extensions.rb:67:5:67:10 | values [element 0] : | hash_extensions.rb:68:9:68:14 | values [element 0] : | +| hash_extensions.rb:67:5:67:10 | values [element 0] : | hash_extensions.rb:68:9:68:14 | values [element 0] : | +| hash_extensions.rb:67:5:67:10 | values [element 1] : | hash_extensions.rb:68:9:68:14 | values [element 1] : | +| hash_extensions.rb:67:5:67:10 | values [element 1] : | hash_extensions.rb:68:9:68:14 | values [element 1] : | +| hash_extensions.rb:67:5:67:10 | values [element 2] : | hash_extensions.rb:68:9:68:14 | values [element 2] : | +| hash_extensions.rb:67:5:67:10 | values [element 2] : | hash_extensions.rb:68:9:68:14 | values [element 2] : | +| hash_extensions.rb:67:15:67:25 | call to source : | hash_extensions.rb:67:5:67:10 | values [element 0] : | +| hash_extensions.rb:67:15:67:25 | call to source : | hash_extensions.rb:67:5:67:10 | values [element 0] : | +| hash_extensions.rb:67:28:67:38 | call to source : | hash_extensions.rb:67:5:67:10 | values [element 1] : | +| hash_extensions.rb:67:28:67:38 | call to source : | hash_extensions.rb:67:5:67:10 | values [element 1] : | +| hash_extensions.rb:67:41:67:51 | call to source : | hash_extensions.rb:67:5:67:10 | values [element 2] : | +| hash_extensions.rb:67:41:67:51 | call to source : | hash_extensions.rb:67:5:67:10 | values [element 2] : | +| hash_extensions.rb:68:5:68:5 | h [element] : | hash_extensions.rb:73:10:73:10 | h [element] : | +| hash_extensions.rb:68:5:68:5 | h [element] : | hash_extensions.rb:73:10:73:10 | h [element] : | +| hash_extensions.rb:68:5:68:5 | h [element] : | hash_extensions.rb:74:10:74:10 | h [element] : | +| hash_extensions.rb:68:5:68:5 | h [element] : | hash_extensions.rb:74:10:74:10 | h [element] : | | hash_extensions.rb:68:9:68:14 | values [element 0] : | hash_extensions.rb:68:9:71:7 | call to index_by [element] : | | hash_extensions.rb:68:9:68:14 | values [element 0] : | hash_extensions.rb:68:9:71:7 | call to index_by [element] : | | hash_extensions.rb:68:9:68:14 | values [element 0] : | hash_extensions.rb:68:29:68:33 | value : | @@ -293,32 +431,38 @@ edges | hash_extensions.rb:68:9:68:14 | values [element 2] : | hash_extensions.rb:68:9:71:7 | call to index_by [element] : | | hash_extensions.rb:68:9:68:14 | values [element 2] : | hash_extensions.rb:68:29:68:33 | value : | | hash_extensions.rb:68:9:68:14 | values [element 2] : | hash_extensions.rb:68:29:68:33 | value : | -| hash_extensions.rb:68:9:71:7 | call to index_by [element] : | hash_extensions.rb:73:10:73:10 | h [element] : | -| hash_extensions.rb:68:9:71:7 | call to index_by [element] : | hash_extensions.rb:73:10:73:10 | h [element] : | -| hash_extensions.rb:68:9:71:7 | call to index_by [element] : | hash_extensions.rb:74:10:74:10 | h [element] : | -| hash_extensions.rb:68:9:71:7 | call to index_by [element] : | hash_extensions.rb:74:10:74:10 | h [element] : | +| hash_extensions.rb:68:9:71:7 | call to index_by [element] : | hash_extensions.rb:68:5:68:5 | h [element] : | +| hash_extensions.rb:68:9:71:7 | call to index_by [element] : | hash_extensions.rb:68:5:68:5 | h [element] : | | hash_extensions.rb:68:29:68:33 | value : | hash_extensions.rb:69:14:69:18 | value | | hash_extensions.rb:68:29:68:33 | value : | hash_extensions.rb:69:14:69:18 | value | | hash_extensions.rb:73:10:73:10 | h [element] : | hash_extensions.rb:73:10:73:16 | ...[...] | | hash_extensions.rb:73:10:73:10 | h [element] : | hash_extensions.rb:73:10:73:16 | ...[...] | | hash_extensions.rb:74:10:74:10 | h [element] : | hash_extensions.rb:74:10:74:16 | ...[...] | | hash_extensions.rb:74:10:74:10 | h [element] : | hash_extensions.rb:74:10:74:16 | ...[...] | -| hash_extensions.rb:80:15:80:25 | call to source : | hash_extensions.rb:81:9:81:14 | values [element 0] : | -| hash_extensions.rb:80:15:80:25 | call to source : | hash_extensions.rb:81:9:81:14 | values [element 0] : | -| hash_extensions.rb:80:28:80:38 | call to source : | hash_extensions.rb:81:9:81:14 | values [element 1] : | -| hash_extensions.rb:80:28:80:38 | call to source : | hash_extensions.rb:81:9:81:14 | values [element 1] : | -| hash_extensions.rb:80:41:80:51 | call to source : | hash_extensions.rb:81:9:81:14 | values [element 2] : | -| hash_extensions.rb:80:41:80:51 | call to source : | hash_extensions.rb:81:9:81:14 | values [element 2] : | +| hash_extensions.rb:80:5:80:10 | values [element 0] : | hash_extensions.rb:81:9:81:14 | values [element 0] : | +| hash_extensions.rb:80:5:80:10 | values [element 0] : | hash_extensions.rb:81:9:81:14 | values [element 0] : | +| hash_extensions.rb:80:5:80:10 | values [element 1] : | hash_extensions.rb:81:9:81:14 | values [element 1] : | +| hash_extensions.rb:80:5:80:10 | values [element 1] : | hash_extensions.rb:81:9:81:14 | values [element 1] : | +| hash_extensions.rb:80:5:80:10 | values [element 2] : | hash_extensions.rb:81:9:81:14 | values [element 2] : | +| hash_extensions.rb:80:5:80:10 | values [element 2] : | hash_extensions.rb:81:9:81:14 | values [element 2] : | +| hash_extensions.rb:80:15:80:25 | call to source : | hash_extensions.rb:80:5:80:10 | values [element 0] : | +| hash_extensions.rb:80:15:80:25 | call to source : | hash_extensions.rb:80:5:80:10 | values [element 0] : | +| hash_extensions.rb:80:28:80:38 | call to source : | hash_extensions.rb:80:5:80:10 | values [element 1] : | +| hash_extensions.rb:80:28:80:38 | call to source : | hash_extensions.rb:80:5:80:10 | values [element 1] : | +| hash_extensions.rb:80:41:80:51 | call to source : | hash_extensions.rb:80:5:80:10 | values [element 2] : | +| hash_extensions.rb:80:41:80:51 | call to source : | hash_extensions.rb:80:5:80:10 | values [element 2] : | +| hash_extensions.rb:81:5:81:5 | h [element] : | hash_extensions.rb:86:10:86:10 | h [element] : | +| hash_extensions.rb:81:5:81:5 | h [element] : | hash_extensions.rb:86:10:86:10 | h [element] : | +| hash_extensions.rb:81:5:81:5 | h [element] : | hash_extensions.rb:87:10:87:10 | h [element] : | +| hash_extensions.rb:81:5:81:5 | h [element] : | hash_extensions.rb:87:10:87:10 | h [element] : | | hash_extensions.rb:81:9:81:14 | values [element 0] : | hash_extensions.rb:81:31:81:33 | key : | | hash_extensions.rb:81:9:81:14 | values [element 0] : | hash_extensions.rb:81:31:81:33 | key : | | hash_extensions.rb:81:9:81:14 | values [element 1] : | hash_extensions.rb:81:31:81:33 | key : | | hash_extensions.rb:81:9:81:14 | values [element 1] : | hash_extensions.rb:81:31:81:33 | key : | | hash_extensions.rb:81:9:81:14 | values [element 2] : | hash_extensions.rb:81:31:81:33 | key : | | hash_extensions.rb:81:9:81:14 | values [element 2] : | hash_extensions.rb:81:31:81:33 | key : | -| hash_extensions.rb:81:9:84:7 | call to index_with [element] : | hash_extensions.rb:86:10:86:10 | h [element] : | -| hash_extensions.rb:81:9:84:7 | call to index_with [element] : | hash_extensions.rb:86:10:86:10 | h [element] : | -| hash_extensions.rb:81:9:84:7 | call to index_with [element] : | hash_extensions.rb:87:10:87:10 | h [element] : | -| hash_extensions.rb:81:9:84:7 | call to index_with [element] : | hash_extensions.rb:87:10:87:10 | h [element] : | +| hash_extensions.rb:81:9:84:7 | call to index_with [element] : | hash_extensions.rb:81:5:81:5 | h [element] : | +| hash_extensions.rb:81:9:84:7 | call to index_with [element] : | hash_extensions.rb:81:5:81:5 | h [element] : | | hash_extensions.rb:81:31:81:33 | key : | hash_extensions.rb:82:14:82:16 | key | | hash_extensions.rb:81:31:81:33 | key : | hash_extensions.rb:82:14:82:16 | key | | hash_extensions.rb:83:9:83:19 | call to source : | hash_extensions.rb:81:9:84:7 | call to index_with [element] : | @@ -327,28 +471,34 @@ edges | hash_extensions.rb:86:10:86:10 | h [element] : | hash_extensions.rb:86:10:86:16 | ...[...] | | hash_extensions.rb:87:10:87:10 | h [element] : | hash_extensions.rb:87:10:87:16 | ...[...] | | hash_extensions.rb:87:10:87:10 | h [element] : | hash_extensions.rb:87:10:87:16 | ...[...] | -| hash_extensions.rb:89:9:89:38 | call to index_with [element] : | hash_extensions.rb:91:10:91:10 | j [element] : | -| hash_extensions.rb:89:9:89:38 | call to index_with [element] : | hash_extensions.rb:91:10:91:10 | j [element] : | -| hash_extensions.rb:89:9:89:38 | call to index_with [element] : | hash_extensions.rb:92:10:92:10 | j [element] : | -| hash_extensions.rb:89:9:89:38 | call to index_with [element] : | hash_extensions.rb:92:10:92:10 | j [element] : | +| hash_extensions.rb:89:5:89:5 | j [element] : | hash_extensions.rb:91:10:91:10 | j [element] : | +| hash_extensions.rb:89:5:89:5 | j [element] : | hash_extensions.rb:91:10:91:10 | j [element] : | +| hash_extensions.rb:89:5:89:5 | j [element] : | hash_extensions.rb:92:10:92:10 | j [element] : | +| hash_extensions.rb:89:5:89:5 | j [element] : | hash_extensions.rb:92:10:92:10 | j [element] : | +| hash_extensions.rb:89:9:89:38 | call to index_with [element] : | hash_extensions.rb:89:5:89:5 | j [element] : | +| hash_extensions.rb:89:9:89:38 | call to index_with [element] : | hash_extensions.rb:89:5:89:5 | j [element] : | | hash_extensions.rb:89:27:89:37 | call to source : | hash_extensions.rb:89:9:89:38 | call to index_with [element] : | | hash_extensions.rb:89:27:89:37 | call to source : | hash_extensions.rb:89:9:89:38 | call to index_with [element] : | | hash_extensions.rb:91:10:91:10 | j [element] : | hash_extensions.rb:91:10:91:16 | ...[...] | | hash_extensions.rb:91:10:91:10 | j [element] : | hash_extensions.rb:91:10:91:16 | ...[...] | | hash_extensions.rb:92:10:92:10 | j [element] : | hash_extensions.rb:92:10:92:16 | ...[...] | | hash_extensions.rb:92:10:92:10 | j [element] : | hash_extensions.rb:92:10:92:16 | ...[...] | -| hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:101:10:101:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:101:10:101:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:104:10:104:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:104:10:104:15 | values [element 0, element :id] : | -| hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] : | -| hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] : | -| hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:102:10:102:15 | values [element 0, element :name] : | -| hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:102:10:102:15 | values [element 0, element :name] : | -| hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:103:10:103:15 | values [element 0, element :name] : | -| hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:103:10:103:15 | values [element 0, element :name] : | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] : | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] : | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | hash_extensions.rb:101:10:101:15 | values [element 0, element :id] : | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | hash_extensions.rb:101:10:101:15 | values [element 0, element :id] : | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | hash_extensions.rb:104:10:104:15 | values [element 0, element :id] : | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | hash_extensions.rb:104:10:104:15 | values [element 0, element :id] : | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] : | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] : | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | hash_extensions.rb:102:10:102:15 | values [element 0, element :name] : | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | hash_extensions.rb:102:10:102:15 | values [element 0, element :name] : | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | hash_extensions.rb:103:10:103:15 | values [element 0, element :name] : | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | hash_extensions.rb:103:10:103:15 | values [element 0, element :name] : | +| hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | +| hash_extensions.rb:98:21:98:31 | call to source : | hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | +| hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | +| hash_extensions.rb:98:40:98:54 | call to source : | hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] : | hash_extensions.rb:99:10:99:25 | call to pick | | hash_extensions.rb:99:10:99:15 | values [element 0, element :id] : | hash_extensions.rb:99:10:99:25 | call to pick | | hash_extensions.rb:100:10:100:15 | values [element 0, element :name] : | hash_extensions.rb:100:10:100:27 | call to pick | @@ -369,26 +519,34 @@ edges | hash_extensions.rb:104:10:104:15 | values [element 0, element :id] : | hash_extensions.rb:104:10:104:32 | call to pick [element 1] : | | hash_extensions.rb:104:10:104:32 | call to pick [element 1] : | hash_extensions.rb:104:10:104:35 | ...[...] | | hash_extensions.rb:104:10:104:32 | call to pick [element 1] : | hash_extensions.rb:104:10:104:35 | ...[...] | -| hash_extensions.rb:110:21:110:31 | call to source : | hash_extensions.rb:112:10:112:15 | values [element 0, element :id] : | -| hash_extensions.rb:110:21:110:31 | call to source : | hash_extensions.rb:112:10:112:15 | values [element 0, element :id] : | -| hash_extensions.rb:110:21:110:31 | call to source : | hash_extensions.rb:115:10:115:15 | values [element 0, element :id] : | -| hash_extensions.rb:110:21:110:31 | call to source : | hash_extensions.rb:115:10:115:15 | values [element 0, element :id] : | -| hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:113:10:113:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:113:10:113:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:114:10:114:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:114:10:114:15 | values [element 0, element :name] : | -| hash_extensions.rb:110:65:110:75 | call to source : | hash_extensions.rb:112:10:112:15 | values [element 1, element :id] : | -| hash_extensions.rb:110:65:110:75 | call to source : | hash_extensions.rb:112:10:112:15 | values [element 1, element :id] : | -| hash_extensions.rb:110:65:110:75 | call to source : | hash_extensions.rb:115:10:115:15 | values [element 1, element :id] : | -| hash_extensions.rb:110:65:110:75 | call to source : | hash_extensions.rb:115:10:115:15 | values [element 1, element :id] : | -| hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] : | -| hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] : | -| hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:113:10:113:15 | values [element 1, element :name] : | -| hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:113:10:113:15 | values [element 1, element :name] : | -| hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:114:10:114:15 | values [element 1, element :name] : | -| hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:114:10:114:15 | values [element 1, element :name] : | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] : | hash_extensions.rb:112:10:112:15 | values [element 0, element :id] : | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] : | hash_extensions.rb:112:10:112:15 | values [element 0, element :id] : | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] : | hash_extensions.rb:115:10:115:15 | values [element 0, element :id] : | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] : | hash_extensions.rb:115:10:115:15 | values [element 0, element :id] : | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] : | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] : | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | hash_extensions.rb:113:10:113:15 | values [element 0, element :name] : | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | hash_extensions.rb:113:10:113:15 | values [element 0, element :name] : | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | hash_extensions.rb:114:10:114:15 | values [element 0, element :name] : | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | hash_extensions.rb:114:10:114:15 | values [element 0, element :name] : | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] : | hash_extensions.rb:112:10:112:15 | values [element 1, element :id] : | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] : | hash_extensions.rb:112:10:112:15 | values [element 1, element :id] : | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] : | hash_extensions.rb:115:10:115:15 | values [element 1, element :id] : | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] : | hash_extensions.rb:115:10:115:15 | values [element 1, element :id] : | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] : | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] : | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | hash_extensions.rb:113:10:113:15 | values [element 1, element :name] : | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | hash_extensions.rb:113:10:113:15 | values [element 1, element :name] : | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | hash_extensions.rb:114:10:114:15 | values [element 1, element :name] : | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | hash_extensions.rb:114:10:114:15 | values [element 1, element :name] : | +| hash_extensions.rb:110:21:110:31 | call to source : | hash_extensions.rb:110:5:110:10 | values [element 0, element :id] : | +| hash_extensions.rb:110:21:110:31 | call to source : | hash_extensions.rb:110:5:110:10 | values [element 0, element :id] : | +| hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | +| hash_extensions.rb:110:40:110:54 | call to source : | hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | +| hash_extensions.rb:110:65:110:75 | call to source : | hash_extensions.rb:110:5:110:10 | values [element 1, element :id] : | +| hash_extensions.rb:110:65:110:75 | call to source : | hash_extensions.rb:110:5:110:10 | values [element 1, element :id] : | +| hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | +| hash_extensions.rb:110:84:110:99 | call to source : | hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] : | hash_extensions.rb:111:10:111:28 | call to pluck [element] : | | hash_extensions.rb:111:10:111:15 | values [element 0, element :name] : | hash_extensions.rb:111:10:111:28 | call to pluck [element] : | | hash_extensions.rb:111:10:111:15 | values [element 1, element :name] : | hash_extensions.rb:111:10:111:28 | call to pluck [element] : | @@ -427,119 +585,161 @@ edges | hash_extensions.rb:115:10:115:33 | call to pluck [element, element 1] : | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] : | | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] : | hash_extensions.rb:115:10:115:39 | ...[...] | | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] : | hash_extensions.rb:115:10:115:39 | ...[...] | -| hash_extensions.rb:122:15:122:25 | call to source : | hash_extensions.rb:125:10:125:15 | single [element 0] : | -| hash_extensions.rb:122:15:122:25 | call to source : | hash_extensions.rb:125:10:125:15 | single [element 0] : | -| hash_extensions.rb:123:14:123:24 | call to source : | hash_extensions.rb:126:10:126:14 | multi [element 0] : | -| hash_extensions.rb:123:14:123:24 | call to source : | hash_extensions.rb:126:10:126:14 | multi [element 0] : | +| hash_extensions.rb:122:5:122:10 | single [element 0] : | hash_extensions.rb:125:10:125:15 | single [element 0] : | +| hash_extensions.rb:122:5:122:10 | single [element 0] : | hash_extensions.rb:125:10:125:15 | single [element 0] : | +| hash_extensions.rb:122:15:122:25 | call to source : | hash_extensions.rb:122:5:122:10 | single [element 0] : | +| hash_extensions.rb:122:15:122:25 | call to source : | hash_extensions.rb:122:5:122:10 | single [element 0] : | +| hash_extensions.rb:123:5:123:9 | multi [element 0] : | hash_extensions.rb:126:10:126:14 | multi [element 0] : | +| hash_extensions.rb:123:5:123:9 | multi [element 0] : | hash_extensions.rb:126:10:126:14 | multi [element 0] : | +| hash_extensions.rb:123:14:123:24 | call to source : | hash_extensions.rb:123:5:123:9 | multi [element 0] : | +| hash_extensions.rb:123:14:123:24 | call to source : | hash_extensions.rb:123:5:123:9 | multi [element 0] : | | hash_extensions.rb:125:10:125:15 | single [element 0] : | hash_extensions.rb:125:10:125:20 | call to sole | | hash_extensions.rb:125:10:125:15 | single [element 0] : | hash_extensions.rb:125:10:125:20 | call to sole | | hash_extensions.rb:126:10:126:14 | multi [element 0] : | hash_extensions.rb:126:10:126:19 | call to sole | | hash_extensions.rb:126:10:126:14 | multi [element 0] : | hash_extensions.rb:126:10:126:19 | call to sole | nodes +| active_support.rb:10:5:10:5 | x : | semmle.label | x : | | active_support.rb:10:9:10:18 | call to source : | semmle.label | call to source : | | active_support.rb:11:10:11:10 | x : | semmle.label | x : | | active_support.rb:11:10:11:19 | call to at | semmle.label | call to at | +| active_support.rb:15:5:15:5 | x : | semmle.label | x : | | active_support.rb:15:9:15:18 | call to source : | semmle.label | call to source : | | active_support.rb:16:10:16:10 | x : | semmle.label | x : | | active_support.rb:16:10:16:19 | call to camelize | semmle.label | call to camelize | +| active_support.rb:20:5:20:5 | x : | semmle.label | x : | | active_support.rb:20:9:20:18 | call to source : | semmle.label | call to source : | | active_support.rb:21:10:21:10 | x : | semmle.label | x : | | active_support.rb:21:10:21:20 | call to camelcase | semmle.label | call to camelcase | +| active_support.rb:25:5:25:5 | x : | semmle.label | x : | | active_support.rb:25:9:25:18 | call to source : | semmle.label | call to source : | | active_support.rb:26:10:26:10 | x : | semmle.label | x : | | active_support.rb:26:10:26:19 | call to classify | semmle.label | call to classify | +| active_support.rb:30:5:30:5 | x : | semmle.label | x : | | active_support.rb:30:9:30:18 | call to source : | semmle.label | call to source : | | active_support.rb:31:10:31:10 | x : | semmle.label | x : | | active_support.rb:31:10:31:20 | call to dasherize | semmle.label | call to dasherize | +| active_support.rb:35:5:35:5 | x : | semmle.label | x : | | active_support.rb:35:9:35:18 | call to source : | semmle.label | call to source : | | active_support.rb:36:10:36:10 | x : | semmle.label | x : | | active_support.rb:36:10:36:24 | call to deconstantize | semmle.label | call to deconstantize | +| active_support.rb:40:5:40:5 | x : | semmle.label | x : | | active_support.rb:40:9:40:18 | call to source : | semmle.label | call to source : | | active_support.rb:41:10:41:10 | x : | semmle.label | x : | | active_support.rb:41:10:41:21 | call to demodulize | semmle.label | call to demodulize | +| active_support.rb:45:5:45:5 | x : | semmle.label | x : | | active_support.rb:45:9:45:18 | call to source : | semmle.label | call to source : | | active_support.rb:46:10:46:10 | x : | semmle.label | x : | | active_support.rb:46:10:46:19 | call to first | semmle.label | call to first | +| active_support.rb:50:5:50:5 | x : | semmle.label | x : | | active_support.rb:50:9:50:18 | call to source : | semmle.label | call to source : | | active_support.rb:51:10:51:10 | x : | semmle.label | x : | | active_support.rb:51:10:51:22 | call to foreign_key | semmle.label | call to foreign_key | +| active_support.rb:55:5:55:5 | x : | semmle.label | x : | | active_support.rb:55:9:55:18 | call to source : | semmle.label | call to source : | | active_support.rb:56:10:56:10 | x : | semmle.label | x : | | active_support.rb:56:10:56:18 | call to from | semmle.label | call to from | +| active_support.rb:60:5:60:5 | x : | semmle.label | x : | | active_support.rb:60:9:60:18 | call to source : | semmle.label | call to source : | | active_support.rb:61:10:61:10 | x : | semmle.label | x : | | active_support.rb:61:10:61:20 | call to html_safe | semmle.label | call to html_safe | +| active_support.rb:65:5:65:5 | x : | semmle.label | x : | | active_support.rb:65:9:65:18 | call to source : | semmle.label | call to source : | | active_support.rb:66:10:66:10 | x : | semmle.label | x : | | active_support.rb:66:10:66:19 | call to humanize | semmle.label | call to humanize | +| active_support.rb:70:5:70:5 | x : | semmle.label | x : | | active_support.rb:70:9:70:18 | call to source : | semmle.label | call to source : | | active_support.rb:71:10:71:10 | x : | semmle.label | x : | | active_support.rb:71:10:71:20 | call to indent | semmle.label | call to indent | +| active_support.rb:75:5:75:5 | x : | semmle.label | x : | | active_support.rb:75:9:75:18 | call to source : | semmle.label | call to source : | | active_support.rb:76:10:76:10 | x : | semmle.label | x : | | active_support.rb:76:10:76:21 | call to indent! | semmle.label | call to indent! | +| active_support.rb:80:5:80:5 | x : | semmle.label | x : | | active_support.rb:80:9:80:18 | call to source : | semmle.label | call to source : | | active_support.rb:81:10:81:10 | x : | semmle.label | x : | | active_support.rb:81:10:81:18 | call to inquiry | semmle.label | call to inquiry | +| active_support.rb:85:5:85:5 | x : | semmle.label | x : | | active_support.rb:85:9:85:18 | call to source : | semmle.label | call to source : | | active_support.rb:86:10:86:10 | x : | semmle.label | x : | | active_support.rb:86:10:86:18 | call to last | semmle.label | call to last | +| active_support.rb:90:5:90:5 | x : | semmle.label | x : | | active_support.rb:90:9:90:18 | call to source : | semmle.label | call to source : | | active_support.rb:91:10:91:10 | x : | semmle.label | x : | | active_support.rb:91:10:91:19 | call to mb_chars | semmle.label | call to mb_chars | +| active_support.rb:95:5:95:5 | x : | semmle.label | x : | | active_support.rb:95:9:95:18 | call to source : | semmle.label | call to source : | | active_support.rb:96:10:96:10 | x : | semmle.label | x : | | active_support.rb:96:10:96:23 | call to parameterize | semmle.label | call to parameterize | +| active_support.rb:100:5:100:5 | x : | semmle.label | x : | | active_support.rb:100:9:100:18 | call to source : | semmle.label | call to source : | | active_support.rb:101:10:101:10 | x : | semmle.label | x : | | active_support.rb:101:10:101:20 | call to pluralize | semmle.label | call to pluralize | +| active_support.rb:105:5:105:5 | x : | semmle.label | x : | | active_support.rb:105:9:105:18 | call to source : | semmle.label | call to source : | | active_support.rb:106:10:106:10 | x : | semmle.label | x : | | active_support.rb:106:10:106:24 | call to remove | semmle.label | call to remove | +| active_support.rb:110:5:110:5 | x : | semmle.label | x : | | active_support.rb:110:9:110:18 | call to source : | semmle.label | call to source : | | active_support.rb:111:10:111:10 | x : | semmle.label | x : | | active_support.rb:111:10:111:25 | call to remove! | semmle.label | call to remove! | +| active_support.rb:115:5:115:5 | x : | semmle.label | x : | | active_support.rb:115:9:115:18 | call to source : | semmle.label | call to source : | | active_support.rb:116:10:116:10 | x : | semmle.label | x : | | active_support.rb:116:10:116:22 | call to singularize | semmle.label | call to singularize | +| active_support.rb:120:5:120:5 | x : | semmle.label | x : | | active_support.rb:120:9:120:18 | call to source : | semmle.label | call to source : | | active_support.rb:121:10:121:10 | x : | semmle.label | x : | | active_support.rb:121:10:121:17 | call to squish | semmle.label | call to squish | +| active_support.rb:125:5:125:5 | x : | semmle.label | x : | | active_support.rb:125:9:125:18 | call to source : | semmle.label | call to source : | | active_support.rb:126:10:126:10 | x : | semmle.label | x : | | active_support.rb:126:10:126:18 | call to squish! | semmle.label | call to squish! | +| active_support.rb:130:5:130:5 | x : | semmle.label | x : | | active_support.rb:130:9:130:18 | call to source : | semmle.label | call to source : | | active_support.rb:131:10:131:10 | x : | semmle.label | x : | | active_support.rb:131:10:131:24 | call to strip_heredoc | semmle.label | call to strip_heredoc | +| active_support.rb:135:5:135:5 | x : | semmle.label | x : | | active_support.rb:135:9:135:18 | call to source : | semmle.label | call to source : | | active_support.rb:136:10:136:10 | x : | semmle.label | x : | | active_support.rb:136:10:136:19 | call to tableize | semmle.label | call to tableize | +| active_support.rb:140:5:140:5 | x : | semmle.label | x : | | active_support.rb:140:9:140:18 | call to source : | semmle.label | call to source : | | active_support.rb:141:10:141:10 | x : | semmle.label | x : | | active_support.rb:141:10:141:20 | call to titlecase | semmle.label | call to titlecase | +| active_support.rb:145:5:145:5 | x : | semmle.label | x : | | active_support.rb:145:9:145:18 | call to source : | semmle.label | call to source : | | active_support.rb:146:10:146:10 | x : | semmle.label | x : | | active_support.rb:146:10:146:19 | call to titleize | semmle.label | call to titleize | +| active_support.rb:150:5:150:5 | x : | semmle.label | x : | | active_support.rb:150:9:150:18 | call to source : | semmle.label | call to source : | | active_support.rb:151:10:151:10 | x : | semmle.label | x : | | active_support.rb:151:10:151:16 | call to to | semmle.label | call to to | +| active_support.rb:155:5:155:5 | x : | semmle.label | x : | | active_support.rb:155:9:155:18 | call to source : | semmle.label | call to source : | | active_support.rb:156:10:156:10 | x : | semmle.label | x : | | active_support.rb:156:10:156:22 | call to truncate | semmle.label | call to truncate | +| active_support.rb:160:5:160:5 | x : | semmle.label | x : | | active_support.rb:160:9:160:18 | call to source : | semmle.label | call to source : | | active_support.rb:161:10:161:10 | x : | semmle.label | x : | | active_support.rb:161:10:161:28 | call to truncate_bytes | semmle.label | call to truncate_bytes | +| active_support.rb:165:5:165:5 | x : | semmle.label | x : | | active_support.rb:165:9:165:18 | call to source : | semmle.label | call to source : | | active_support.rb:166:10:166:10 | x : | semmle.label | x : | | active_support.rb:166:10:166:28 | call to truncate_words | semmle.label | call to truncate_words | +| active_support.rb:170:5:170:5 | x : | semmle.label | x : | | active_support.rb:170:9:170:18 | call to source : | semmle.label | call to source : | | active_support.rb:171:10:171:10 | x : | semmle.label | x : | | active_support.rb:171:10:171:21 | call to underscore | semmle.label | call to underscore | +| active_support.rb:175:5:175:5 | x : | semmle.label | x : | | active_support.rb:175:9:175:18 | call to source : | semmle.label | call to source : | | active_support.rb:176:10:176:10 | x : | semmle.label | x : | | active_support.rb:176:10:176:23 | call to upcase_first | semmle.label | call to upcase_first | +| active_support.rb:180:5:180:5 | x [element 0] : | semmle.label | x [element 0] : | +| active_support.rb:180:5:180:5 | x [element 0] : | semmle.label | x [element 0] : | | active_support.rb:180:10:180:17 | call to source : | semmle.label | call to source : | | active_support.rb:180:10:180:17 | call to source : | semmle.label | call to source : | +| active_support.rb:181:5:181:5 | y [element] : | semmle.label | y [element] : | +| active_support.rb:181:5:181:5 | y [element] : | semmle.label | y [element] : | | active_support.rb:181:9:181:9 | x [element 0] : | semmle.label | x [element 0] : | | active_support.rb:181:9:181:9 | x [element 0] : | semmle.label | x [element 0] : | | active_support.rb:181:9:181:23 | call to compact_blank [element] : | semmle.label | call to compact_blank [element] : | @@ -548,8 +748,12 @@ nodes | active_support.rb:182:10:182:10 | y [element] : | semmle.label | y [element] : | | active_support.rb:182:10:182:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:182:10:182:13 | ...[...] | semmle.label | ...[...] | +| active_support.rb:186:5:186:5 | x [element 0] : | semmle.label | x [element 0] : | +| active_support.rb:186:5:186:5 | x [element 0] : | semmle.label | x [element 0] : | | active_support.rb:186:10:186:18 | call to source : | semmle.label | call to source : | | active_support.rb:186:10:186:18 | call to source : | semmle.label | call to source : | +| active_support.rb:187:5:187:5 | y [element] : | semmle.label | y [element] : | +| active_support.rb:187:5:187:5 | y [element] : | semmle.label | y [element] : | | active_support.rb:187:9:187:9 | x [element 0] : | semmle.label | x [element 0] : | | active_support.rb:187:9:187:9 | x [element 0] : | semmle.label | x [element 0] : | | active_support.rb:187:9:187:21 | call to excluding [element] : | semmle.label | call to excluding [element] : | @@ -558,8 +762,12 @@ nodes | active_support.rb:188:10:188:10 | y [element] : | semmle.label | y [element] : | | active_support.rb:188:10:188:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:188:10:188:13 | ...[...] | semmle.label | ...[...] | +| active_support.rb:192:5:192:5 | x [element 0] : | semmle.label | x [element 0] : | +| active_support.rb:192:5:192:5 | x [element 0] : | semmle.label | x [element 0] : | | active_support.rb:192:10:192:18 | call to source : | semmle.label | call to source : | | active_support.rb:192:10:192:18 | call to source : | semmle.label | call to source : | +| active_support.rb:193:5:193:5 | y [element] : | semmle.label | y [element] : | +| active_support.rb:193:5:193:5 | y [element] : | semmle.label | y [element] : | | active_support.rb:193:9:193:9 | x [element 0] : | semmle.label | x [element 0] : | | active_support.rb:193:9:193:9 | x [element 0] : | semmle.label | x [element 0] : | | active_support.rb:193:9:193:19 | call to without [element] : | semmle.label | call to without [element] : | @@ -568,8 +776,12 @@ nodes | active_support.rb:194:10:194:10 | y [element] : | semmle.label | y [element] : | | active_support.rb:194:10:194:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:194:10:194:13 | ...[...] | semmle.label | ...[...] | +| active_support.rb:198:5:198:5 | x [element 0] : | semmle.label | x [element 0] : | +| active_support.rb:198:5:198:5 | x [element 0] : | semmle.label | x [element 0] : | | active_support.rb:198:10:198:18 | call to source : | semmle.label | call to source : | | active_support.rb:198:10:198:18 | call to source : | semmle.label | call to source : | +| active_support.rb:199:5:199:5 | y [element] : | semmle.label | y [element] : | +| active_support.rb:199:5:199:5 | y [element] : | semmle.label | y [element] : | | active_support.rb:199:9:199:9 | x [element 0] : | semmle.label | x [element 0] : | | active_support.rb:199:9:199:9 | x [element 0] : | semmle.label | x [element 0] : | | active_support.rb:199:9:199:37 | call to in_order_of [element] : | semmle.label | call to in_order_of [element] : | @@ -578,8 +790,14 @@ nodes | active_support.rb:200:10:200:10 | y [element] : | semmle.label | y [element] : | | active_support.rb:200:10:200:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:200:10:200:13 | ...[...] | semmle.label | ...[...] | +| active_support.rb:204:5:204:5 | a [element 0] : | semmle.label | a [element 0] : | +| active_support.rb:204:5:204:5 | a [element 0] : | semmle.label | a [element 0] : | | active_support.rb:204:10:204:18 | call to source : | semmle.label | call to source : | | active_support.rb:204:10:204:18 | call to source : | semmle.label | call to source : | +| active_support.rb:205:5:205:5 | b [element 0] : | semmle.label | b [element 0] : | +| active_support.rb:205:5:205:5 | b [element 0] : | semmle.label | b [element 0] : | +| active_support.rb:205:5:205:5 | b [element] : | semmle.label | b [element] : | +| active_support.rb:205:5:205:5 | b [element] : | semmle.label | b [element] : | | active_support.rb:205:9:205:9 | a [element 0] : | semmle.label | a [element 0] : | | active_support.rb:205:9:205:9 | a [element 0] : | semmle.label | a [element 0] : | | active_support.rb:205:9:205:41 | call to including [element 0] : | semmle.label | call to including [element 0] : | @@ -612,99 +830,141 @@ nodes | active_support.rb:211:10:211:10 | b [element] : | semmle.label | b [element] : | | active_support.rb:211:10:211:13 | ...[...] | semmle.label | ...[...] | | active_support.rb:211:10:211:13 | ...[...] | semmle.label | ...[...] | +| active_support.rb:215:3:215:3 | x : | semmle.label | x : | | active_support.rb:215:7:215:16 | call to source : | semmle.label | call to source : | +| active_support.rb:216:3:216:3 | y : | semmle.label | y : | | active_support.rb:216:7:216:35 | call to new : | semmle.label | call to new : | | active_support.rb:216:34:216:34 | x : | semmle.label | x : | | active_support.rb:217:8:217:8 | y | semmle.label | y | +| active_support.rb:222:3:222:3 | b : | semmle.label | b : | | active_support.rb:222:7:222:16 | call to source : | semmle.label | call to source : | +| active_support.rb:223:3:223:3 | y : | semmle.label | y : | | active_support.rb:223:7:223:22 | call to safe_concat : | semmle.label | call to safe_concat : | | active_support.rb:223:21:223:21 | b : | semmle.label | b : | | active_support.rb:224:8:224:8 | y | semmle.label | y | +| active_support.rb:229:3:229:3 | b : | semmle.label | b : | | active_support.rb:229:7:229:16 | call to source : | semmle.label | call to source : | | active_support.rb:230:3:230:3 | [post] x : | semmle.label | [post] x : | | active_support.rb:230:17:230:17 | b : | semmle.label | b : | | active_support.rb:231:8:231:8 | x | semmle.label | x | +| active_support.rb:235:3:235:3 | a : | semmle.label | a : | | active_support.rb:235:7:235:16 | call to source : | semmle.label | call to source : | +| active_support.rb:237:3:237:3 | x : | semmle.label | x : | | active_support.rb:237:7:237:35 | call to new : | semmle.label | call to new : | | active_support.rb:237:34:237:34 | a : | semmle.label | a : | +| active_support.rb:238:3:238:3 | y : | semmle.label | y : | | active_support.rb:238:7:238:7 | x : | semmle.label | x : | | active_support.rb:238:7:238:17 | call to concat : | semmle.label | call to concat : | | active_support.rb:239:8:239:8 | y | semmle.label | y | +| active_support.rb:243:3:243:3 | a : | semmle.label | a : | | active_support.rb:243:7:243:16 | call to source : | semmle.label | call to source : | +| active_support.rb:245:3:245:3 | x : | semmle.label | x : | | active_support.rb:245:7:245:35 | call to new : | semmle.label | call to new : | | active_support.rb:245:34:245:34 | a : | semmle.label | a : | +| active_support.rb:246:3:246:3 | y : | semmle.label | y : | | active_support.rb:246:7:246:7 | x : | semmle.label | x : | | active_support.rb:246:7:246:20 | call to insert : | semmle.label | call to insert : | | active_support.rb:247:8:247:8 | y | semmle.label | y | +| active_support.rb:251:3:251:3 | a : | semmle.label | a : | | active_support.rb:251:7:251:16 | call to source : | semmle.label | call to source : | +| active_support.rb:253:3:253:3 | x : | semmle.label | x : | | active_support.rb:253:7:253:35 | call to new : | semmle.label | call to new : | | active_support.rb:253:34:253:34 | a : | semmle.label | a : | +| active_support.rb:254:3:254:3 | y : | semmle.label | y : | | active_support.rb:254:7:254:7 | x : | semmle.label | x : | | active_support.rb:254:7:254:18 | call to prepend : | semmle.label | call to prepend : | | active_support.rb:255:8:255:8 | y | semmle.label | y | +| active_support.rb:259:3:259:3 | a : | semmle.label | a : | | active_support.rb:259:7:259:16 | call to source : | semmle.label | call to source : | +| active_support.rb:260:3:260:3 | x : | semmle.label | x : | | active_support.rb:260:7:260:35 | call to new : | semmle.label | call to new : | | active_support.rb:260:34:260:34 | a : | semmle.label | a : | +| active_support.rb:261:3:261:3 | y : | semmle.label | y : | | active_support.rb:261:7:261:7 | x : | semmle.label | x : | | active_support.rb:261:7:261:12 | call to to_s : | semmle.label | call to to_s : | | active_support.rb:262:8:262:8 | y | semmle.label | y | +| active_support.rb:266:3:266:3 | a : | semmle.label | a : | | active_support.rb:266:7:266:16 | call to source : | semmle.label | call to source : | +| active_support.rb:267:3:267:3 | x : | semmle.label | x : | | active_support.rb:267:7:267:35 | call to new : | semmle.label | call to new : | | active_support.rb:267:34:267:34 | a : | semmle.label | a : | +| active_support.rb:268:3:268:3 | y : | semmle.label | y : | | active_support.rb:268:7:268:7 | x : | semmle.label | x : | | active_support.rb:268:7:268:16 | call to to_param : | semmle.label | call to to_param : | | active_support.rb:269:8:269:8 | y | semmle.label | y | +| active_support.rb:273:3:273:3 | a : | semmle.label | a : | | active_support.rb:273:7:273:16 | call to source : | semmle.label | call to source : | +| active_support.rb:274:3:274:3 | x : | semmle.label | x : | | active_support.rb:274:7:274:21 | call to new : | semmle.label | call to new : | | active_support.rb:274:20:274:20 | a : | semmle.label | a : | +| active_support.rb:275:3:275:3 | y : | semmle.label | y : | | active_support.rb:275:7:275:7 | x : | semmle.label | x : | | active_support.rb:275:7:275:17 | call to existence : | semmle.label | call to existence : | | active_support.rb:276:8:276:8 | y | semmle.label | y | +| active_support.rb:277:3:277:3 | z : | semmle.label | z : | | active_support.rb:277:7:277:7 | y : | semmle.label | y : | | active_support.rb:277:7:277:17 | call to existence : | semmle.label | call to existence : | | active_support.rb:278:8:278:8 | z | semmle.label | z | +| active_support.rb:282:3:282:3 | x : | semmle.label | x : | +| active_support.rb:282:3:282:3 | x : | semmle.label | x : | | active_support.rb:282:7:282:16 | call to source : | semmle.label | call to source : | | active_support.rb:282:7:282:16 | call to source : | semmle.label | call to source : | | active_support.rb:283:8:283:8 | x : | semmle.label | x : | | active_support.rb:283:8:283:8 | x : | semmle.label | x : | | active_support.rb:283:8:283:17 | call to presence | semmle.label | call to presence | | active_support.rb:283:8:283:17 | call to presence | semmle.label | call to presence | +| active_support.rb:285:3:285:3 | y : | semmle.label | y : | +| active_support.rb:285:3:285:3 | y : | semmle.label | y : | | active_support.rb:285:7:285:16 | call to source : | semmle.label | call to source : | | active_support.rb:285:7:285:16 | call to source : | semmle.label | call to source : | | active_support.rb:286:8:286:8 | y : | semmle.label | y : | | active_support.rb:286:8:286:8 | y : | semmle.label | y : | | active_support.rb:286:8:286:17 | call to presence | semmle.label | call to presence | | active_support.rb:286:8:286:17 | call to presence | semmle.label | call to presence | +| active_support.rb:290:3:290:3 | x : | semmle.label | x : | +| active_support.rb:290:3:290:3 | x : | semmle.label | x : | | active_support.rb:290:7:290:16 | call to source : | semmle.label | call to source : | | active_support.rb:290:7:290:16 | call to source : | semmle.label | call to source : | | active_support.rb:291:8:291:8 | x : | semmle.label | x : | | active_support.rb:291:8:291:8 | x : | semmle.label | x : | | active_support.rb:291:8:291:17 | call to deep_dup | semmle.label | call to deep_dup | | active_support.rb:291:8:291:17 | call to deep_dup | semmle.label | call to deep_dup | +| active_support.rb:303:3:303:3 | a : | semmle.label | a : | | active_support.rb:303:7:303:16 | call to source : | semmle.label | call to source : | +| active_support.rb:304:3:304:3 | b : | semmle.label | b : | | active_support.rb:304:7:304:19 | call to json_escape : | semmle.label | call to json_escape : | | active_support.rb:304:19:304:19 | a : | semmle.label | a : | | active_support.rb:305:8:305:8 | b | semmle.label | b | +| active_support.rb:309:5:309:5 | x : | semmle.label | x : | | active_support.rb:309:9:309:18 | call to source : | semmle.label | call to source : | | active_support.rb:310:10:310:38 | call to encode | semmle.label | call to encode | | active_support.rb:310:37:310:37 | x : | semmle.label | x : | +| active_support.rb:314:5:314:5 | x : | semmle.label | x : | | active_support.rb:314:9:314:18 | call to source : | semmle.label | call to source : | | active_support.rb:315:10:315:38 | call to decode | semmle.label | call to decode | | active_support.rb:315:37:315:37 | x : | semmle.label | x : | +| active_support.rb:319:5:319:5 | x : | semmle.label | x : | | active_support.rb:319:9:319:18 | call to source : | semmle.label | call to source : | | active_support.rb:320:10:320:36 | call to dump | semmle.label | call to dump | | active_support.rb:320:35:320:35 | x : | semmle.label | x : | +| active_support.rb:324:5:324:5 | x : | semmle.label | x : | | active_support.rb:324:9:324:18 | call to source : | semmle.label | call to source : | | active_support.rb:325:10:325:36 | call to load | semmle.label | call to load | | active_support.rb:325:35:325:35 | x : | semmle.label | x : | +| active_support.rb:329:5:329:5 | x : | semmle.label | x : | | active_support.rb:329:9:329:18 | call to source : | semmle.label | call to source : | +| active_support.rb:330:5:330:5 | y [element 0] : | semmle.label | y [element 0] : | | active_support.rb:330:10:330:10 | x : | semmle.label | x : | | active_support.rb:331:10:331:10 | x : | semmle.label | x : | | active_support.rb:331:10:331:18 | call to to_json | semmle.label | call to to_json | | active_support.rb:332:10:332:10 | y [element 0] : | semmle.label | y [element 0] : | | active_support.rb:332:10:332:18 | call to to_json | semmle.label | call to to_json | +| hash_extensions.rb:2:5:2:5 | h [element :a] : | semmle.label | h [element :a] : | +| hash_extensions.rb:2:5:2:5 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:2:14:2:24 | call to source : | semmle.label | call to source : | | hash_extensions.rb:2:14:2:24 | call to source : | semmle.label | call to source : | +| hash_extensions.rb:3:5:3:5 | x [element] : | semmle.label | x [element] : | +| hash_extensions.rb:3:5:3:5 | x [element] : | semmle.label | x [element] : | | hash_extensions.rb:3:9:3:9 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:3:9:3:9 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:3:9:3:24 | call to stringify_keys [element] : | semmle.label | call to stringify_keys [element] : | @@ -713,8 +973,12 @@ nodes | hash_extensions.rb:4:10:4:10 | x [element] : | semmle.label | x [element] : | | hash_extensions.rb:4:10:4:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:4:10:4:14 | ...[...] | semmle.label | ...[...] | +| hash_extensions.rb:10:5:10:5 | h [element :a] : | semmle.label | h [element :a] : | +| hash_extensions.rb:10:5:10:5 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:10:14:10:24 | call to source : | semmle.label | call to source : | | hash_extensions.rb:10:14:10:24 | call to source : | semmle.label | call to source : | +| hash_extensions.rb:11:5:11:5 | x [element] : | semmle.label | x [element] : | +| hash_extensions.rb:11:5:11:5 | x [element] : | semmle.label | x [element] : | | hash_extensions.rb:11:9:11:9 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:11:9:11:9 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:11:9:11:20 | call to to_options [element] : | semmle.label | call to to_options [element] : | @@ -723,8 +987,12 @@ nodes | hash_extensions.rb:12:10:12:10 | x [element] : | semmle.label | x [element] : | | hash_extensions.rb:12:10:12:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:12:10:12:14 | ...[...] | semmle.label | ...[...] | +| hash_extensions.rb:18:5:18:5 | h [element :a] : | semmle.label | h [element :a] : | +| hash_extensions.rb:18:5:18:5 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:18:14:18:24 | call to source : | semmle.label | call to source : | | hash_extensions.rb:18:14:18:24 | call to source : | semmle.label | call to source : | +| hash_extensions.rb:19:5:19:5 | x [element] : | semmle.label | x [element] : | +| hash_extensions.rb:19:5:19:5 | x [element] : | semmle.label | x [element] : | | hash_extensions.rb:19:9:19:9 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:19:9:19:9 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:19:9:19:24 | call to symbolize_keys [element] : | semmle.label | call to symbolize_keys [element] : | @@ -733,8 +1001,12 @@ nodes | hash_extensions.rb:20:10:20:10 | x [element] : | semmle.label | x [element] : | | hash_extensions.rb:20:10:20:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:20:10:20:14 | ...[...] | semmle.label | ...[...] | +| hash_extensions.rb:26:5:26:5 | h [element :a] : | semmle.label | h [element :a] : | +| hash_extensions.rb:26:5:26:5 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:26:14:26:24 | call to source : | semmle.label | call to source : | | hash_extensions.rb:26:14:26:24 | call to source : | semmle.label | call to source : | +| hash_extensions.rb:27:5:27:5 | x [element] : | semmle.label | x [element] : | +| hash_extensions.rb:27:5:27:5 | x [element] : | semmle.label | x [element] : | | hash_extensions.rb:27:9:27:9 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:27:9:27:9 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:27:9:27:29 | call to deep_stringify_keys [element] : | semmle.label | call to deep_stringify_keys [element] : | @@ -743,8 +1015,12 @@ nodes | hash_extensions.rb:28:10:28:10 | x [element] : | semmle.label | x [element] : | | hash_extensions.rb:28:10:28:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:28:10:28:14 | ...[...] | semmle.label | ...[...] | +| hash_extensions.rb:34:5:34:5 | h [element :a] : | semmle.label | h [element :a] : | +| hash_extensions.rb:34:5:34:5 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:34:14:34:24 | call to source : | semmle.label | call to source : | | hash_extensions.rb:34:14:34:24 | call to source : | semmle.label | call to source : | +| hash_extensions.rb:35:5:35:5 | x [element] : | semmle.label | x [element] : | +| hash_extensions.rb:35:5:35:5 | x [element] : | semmle.label | x [element] : | | hash_extensions.rb:35:9:35:9 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:35:9:35:9 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:35:9:35:29 | call to deep_symbolize_keys [element] : | semmle.label | call to deep_symbolize_keys [element] : | @@ -753,8 +1029,12 @@ nodes | hash_extensions.rb:36:10:36:10 | x [element] : | semmle.label | x [element] : | | hash_extensions.rb:36:10:36:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:36:10:36:14 | ...[...] | semmle.label | ...[...] | +| hash_extensions.rb:42:5:42:5 | h [element :a] : | semmle.label | h [element :a] : | +| hash_extensions.rb:42:5:42:5 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:42:14:42:24 | call to source : | semmle.label | call to source : | | hash_extensions.rb:42:14:42:24 | call to source : | semmle.label | call to source : | +| hash_extensions.rb:43:5:43:5 | x [element] : | semmle.label | x [element] : | +| hash_extensions.rb:43:5:43:5 | x [element] : | semmle.label | x [element] : | | hash_extensions.rb:43:9:43:9 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:43:9:43:9 | h [element :a] : | semmle.label | h [element :a] : | | hash_extensions.rb:43:9:43:33 | call to with_indifferent_access [element] : | semmle.label | call to with_indifferent_access [element] : | @@ -763,12 +1043,22 @@ nodes | hash_extensions.rb:44:10:44:10 | x [element] : | semmle.label | x [element] : | | hash_extensions.rb:44:10:44:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:44:10:44:14 | ...[...] | semmle.label | ...[...] | +| hash_extensions.rb:50:5:50:5 | h [element :a] : | semmle.label | h [element :a] : | +| hash_extensions.rb:50:5:50:5 | h [element :a] : | semmle.label | h [element :a] : | +| hash_extensions.rb:50:5:50:5 | h [element :b] : | semmle.label | h [element :b] : | +| hash_extensions.rb:50:5:50:5 | h [element :b] : | semmle.label | h [element :b] : | +| hash_extensions.rb:50:5:50:5 | h [element :d] : | semmle.label | h [element :d] : | +| hash_extensions.rb:50:5:50:5 | h [element :d] : | semmle.label | h [element :d] : | | hash_extensions.rb:50:14:50:23 | call to taint : | semmle.label | call to taint : | | hash_extensions.rb:50:14:50:23 | call to taint : | semmle.label | call to taint : | | hash_extensions.rb:50:29:50:38 | call to taint : | semmle.label | call to taint : | | hash_extensions.rb:50:29:50:38 | call to taint : | semmle.label | call to taint : | | hash_extensions.rb:50:52:50:61 | call to taint : | semmle.label | call to taint : | | hash_extensions.rb:50:52:50:61 | call to taint : | semmle.label | call to taint : | +| hash_extensions.rb:51:5:51:5 | x [element :a] : | semmle.label | x [element :a] : | +| hash_extensions.rb:51:5:51:5 | x [element :a] : | semmle.label | x [element :a] : | +| hash_extensions.rb:51:5:51:5 | x [element :b] : | semmle.label | x [element :b] : | +| hash_extensions.rb:51:5:51:5 | x [element :b] : | semmle.label | x [element :b] : | | hash_extensions.rb:51:9:51:9 | [post] h [element :d] : | semmle.label | [post] h [element :d] : | | hash_extensions.rb:51:9:51:9 | [post] h [element :d] : | semmle.label | [post] h [element :d] : | | hash_extensions.rb:51:9:51:9 | h [element :a] : | semmle.label | h [element :a] : | @@ -793,12 +1083,20 @@ nodes | hash_extensions.rb:59:10:59:10 | x [element :b] : | semmle.label | x [element :b] : | | hash_extensions.rb:59:10:59:14 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:59:10:59:14 | ...[...] | semmle.label | ...[...] | +| hash_extensions.rb:67:5:67:10 | values [element 0] : | semmle.label | values [element 0] : | +| hash_extensions.rb:67:5:67:10 | values [element 0] : | semmle.label | values [element 0] : | +| hash_extensions.rb:67:5:67:10 | values [element 1] : | semmle.label | values [element 1] : | +| hash_extensions.rb:67:5:67:10 | values [element 1] : | semmle.label | values [element 1] : | +| hash_extensions.rb:67:5:67:10 | values [element 2] : | semmle.label | values [element 2] : | +| hash_extensions.rb:67:5:67:10 | values [element 2] : | semmle.label | values [element 2] : | | hash_extensions.rb:67:15:67:25 | call to source : | semmle.label | call to source : | | hash_extensions.rb:67:15:67:25 | call to source : | semmle.label | call to source : | | hash_extensions.rb:67:28:67:38 | call to source : | semmle.label | call to source : | | hash_extensions.rb:67:28:67:38 | call to source : | semmle.label | call to source : | | hash_extensions.rb:67:41:67:51 | call to source : | semmle.label | call to source : | | hash_extensions.rb:67:41:67:51 | call to source : | semmle.label | call to source : | +| hash_extensions.rb:68:5:68:5 | h [element] : | semmle.label | h [element] : | +| hash_extensions.rb:68:5:68:5 | h [element] : | semmle.label | h [element] : | | hash_extensions.rb:68:9:68:14 | values [element 0] : | semmle.label | values [element 0] : | | hash_extensions.rb:68:9:68:14 | values [element 0] : | semmle.label | values [element 0] : | | hash_extensions.rb:68:9:68:14 | values [element 1] : | semmle.label | values [element 1] : | @@ -819,12 +1117,20 @@ nodes | hash_extensions.rb:74:10:74:10 | h [element] : | semmle.label | h [element] : | | hash_extensions.rb:74:10:74:16 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:74:10:74:16 | ...[...] | semmle.label | ...[...] | +| hash_extensions.rb:80:5:80:10 | values [element 0] : | semmle.label | values [element 0] : | +| hash_extensions.rb:80:5:80:10 | values [element 0] : | semmle.label | values [element 0] : | +| hash_extensions.rb:80:5:80:10 | values [element 1] : | semmle.label | values [element 1] : | +| hash_extensions.rb:80:5:80:10 | values [element 1] : | semmle.label | values [element 1] : | +| hash_extensions.rb:80:5:80:10 | values [element 2] : | semmle.label | values [element 2] : | +| hash_extensions.rb:80:5:80:10 | values [element 2] : | semmle.label | values [element 2] : | | hash_extensions.rb:80:15:80:25 | call to source : | semmle.label | call to source : | | hash_extensions.rb:80:15:80:25 | call to source : | semmle.label | call to source : | | hash_extensions.rb:80:28:80:38 | call to source : | semmle.label | call to source : | | hash_extensions.rb:80:28:80:38 | call to source : | semmle.label | call to source : | | hash_extensions.rb:80:41:80:51 | call to source : | semmle.label | call to source : | | hash_extensions.rb:80:41:80:51 | call to source : | semmle.label | call to source : | +| hash_extensions.rb:81:5:81:5 | h [element] : | semmle.label | h [element] : | +| hash_extensions.rb:81:5:81:5 | h [element] : | semmle.label | h [element] : | | hash_extensions.rb:81:9:81:14 | values [element 0] : | semmle.label | values [element 0] : | | hash_extensions.rb:81:9:81:14 | values [element 0] : | semmle.label | values [element 0] : | | hash_extensions.rb:81:9:81:14 | values [element 1] : | semmle.label | values [element 1] : | @@ -847,6 +1153,8 @@ nodes | hash_extensions.rb:87:10:87:10 | h [element] : | semmle.label | h [element] : | | hash_extensions.rb:87:10:87:16 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:87:10:87:16 | ...[...] | semmle.label | ...[...] | +| hash_extensions.rb:89:5:89:5 | j [element] : | semmle.label | j [element] : | +| hash_extensions.rb:89:5:89:5 | j [element] : | semmle.label | j [element] : | | hash_extensions.rb:89:9:89:38 | call to index_with [element] : | semmle.label | call to index_with [element] : | | hash_extensions.rb:89:9:89:38 | call to index_with [element] : | semmle.label | call to index_with [element] : | | hash_extensions.rb:89:27:89:37 | call to source : | semmle.label | call to source : | @@ -859,6 +1167,10 @@ nodes | hash_extensions.rb:92:10:92:10 | j [element] : | semmle.label | j [element] : | | hash_extensions.rb:92:10:92:16 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:92:10:92:16 | ...[...] | semmle.label | ...[...] | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | +| hash_extensions.rb:98:5:98:10 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | | hash_extensions.rb:98:21:98:31 | call to source : | semmle.label | call to source : | | hash_extensions.rb:98:21:98:31 | call to source : | semmle.label | call to source : | | hash_extensions.rb:98:40:98:54 | call to source : | semmle.label | call to source : | @@ -895,6 +1207,14 @@ nodes | hash_extensions.rb:104:10:104:32 | call to pick [element 1] : | semmle.label | call to pick [element 1] : | | hash_extensions.rb:104:10:104:35 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:104:10:104:35 | ...[...] | semmle.label | ...[...] | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :id] : | semmle.label | values [element 0, element :id] : | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | +| hash_extensions.rb:110:5:110:10 | values [element 0, element :name] : | semmle.label | values [element 0, element :name] : | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] : | semmle.label | values [element 1, element :id] : | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :id] : | semmle.label | values [element 1, element :id] : | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | semmle.label | values [element 1, element :name] : | +| hash_extensions.rb:110:5:110:10 | values [element 1, element :name] : | semmle.label | values [element 1, element :name] : | | hash_extensions.rb:110:21:110:31 | call to source : | semmle.label | call to source : | | hash_extensions.rb:110:21:110:31 | call to source : | semmle.label | call to source : | | hash_extensions.rb:110:40:110:54 | call to source : | semmle.label | call to source : | @@ -951,8 +1271,12 @@ nodes | hash_extensions.rb:115:10:115:36 | ...[...] [element 1] : | semmle.label | ...[...] [element 1] : | | hash_extensions.rb:115:10:115:39 | ...[...] | semmle.label | ...[...] | | hash_extensions.rb:115:10:115:39 | ...[...] | semmle.label | ...[...] | +| hash_extensions.rb:122:5:122:10 | single [element 0] : | semmle.label | single [element 0] : | +| hash_extensions.rb:122:5:122:10 | single [element 0] : | semmle.label | single [element 0] : | | hash_extensions.rb:122:15:122:25 | call to source : | semmle.label | call to source : | | hash_extensions.rb:122:15:122:25 | call to source : | semmle.label | call to source : | +| hash_extensions.rb:123:5:123:9 | multi [element 0] : | semmle.label | multi [element 0] : | +| hash_extensions.rb:123:5:123:9 | multi [element 0] : | semmle.label | multi [element 0] : | | hash_extensions.rb:123:14:123:24 | call to source : | semmle.label | call to source : | | hash_extensions.rb:123:14:123:24 | call to source : | semmle.label | call to source : | | hash_extensions.rb:125:10:125:15 | single [element 0] : | semmle.label | single [element 0] : | diff --git a/ruby/ql/test/library-tests/frameworks/files/Files.expected b/ruby/ql/test/library-tests/frameworks/files/Files.expected index bebb93ef371..b75acc54c5b 100644 --- a/ruby/ql/test/library-tests/frameworks/files/Files.expected +++ b/ruby/ql/test/library-tests/frameworks/files/Files.expected @@ -1,8 +1,8 @@ fileInstances -| Files.rb:2:1:2:36 | ... = ... | +| Files.rb:2:1:2:8 | foo_file | | 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:10 | foo_file_2 | | Files.rb:3:1:3:21 | ... = ... | | Files.rb:3:14:3:21 | foo_file | | Files.rb:4:1:4:8 | foo_file | @@ -18,17 +18,17 @@ fileInstances | Files.rb:40:1:40:8 | foo_file | | Files.rb:41:1:41:26 | call to open | ioInstances -| Files.rb:2:1:2:36 | ... = ... | +| Files.rb:2:1:2:8 | foo_file | | 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:10 | foo_file_2 | | Files.rb:3:1:3:21 | ... = ... | | Files.rb:3:14:3:21 | foo_file | | Files.rb:4:1:4:8 | foo_file | | Files.rb:7:13:7:22 | foo_file_2 | | Files.rb:10:6:10:13 | foo_file | | Files.rb:11:6:11:13 | foo_file | -| Files.rb:17:1:17:50 | ... = ... | +| Files.rb:17:1:17:4 | rand | | Files.rb:17:1:17:50 | ... = ... | | Files.rb:17:8:17:50 | call to new | | Files.rb:18:1:18:13 | ... = ... | @@ -44,7 +44,7 @@ ioInstances | 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:7 | io_file | | Files.rb:44:1:44:45 | ... = ... | | Files.rb:44:11:44:45 | call to open | | Files.rb:48:1:48:7 | io_file | diff --git a/ruby/ql/test/library-tests/frameworks/pathname/Pathname.expected b/ruby/ql/test/library-tests/frameworks/pathname/Pathname.expected index c69247ae5f8..d082076be69 100644 --- a/ruby/ql/test/library-tests/frameworks/pathname/Pathname.expected +++ b/ruby/ql/test/library-tests/frameworks/pathname/Pathname.expected @@ -1,21 +1,21 @@ pathnameInstances -| Pathname.rb:2:1:2:33 | ... = ... | +| Pathname.rb:2:1:2:8 | foo_path | | Pathname.rb:2:1:2:33 | ... = ... | | Pathname.rb:2:12:2:33 | call to new | | Pathname.rb:3:1:3:20 | ... = ... | | Pathname.rb:3:13:3:20 | foo_path | | Pathname.rb:4:1:4:8 | foo_path | -| Pathname.rb:6:1:6:29 | ... = ... | +| Pathname.rb:6:1:6:8 | bar_path | | Pathname.rb:6:1:6:29 | ... = ... | | Pathname.rb:6:12:6:29 | call to new | -| Pathname.rb:9:1:9:21 | ... = ... | +| Pathname.rb:9:1:9:4 | pwd1 | | Pathname.rb:9:1:9:21 | ... = ... | | Pathname.rb:9:8:9:21 | call to getwd | | Pathname.rb:10:1:10:21 | ... = ... | | Pathname.rb:10:7:10:10 | pwd1 | | Pathname.rb:10:7:10:21 | ... + ... | | Pathname.rb:10:14:10:21 | foo_path | -| Pathname.rb:11:1:11:21 | ... = ... | +| Pathname.rb:11:1:11:3 | p01 | | Pathname.rb:11:1:11:21 | ... = ... | | Pathname.rb:11:7:11:10 | pwd1 | | Pathname.rb:11:7:11:21 | ... / ... | @@ -38,7 +38,7 @@ pathnameInstances | Pathname.rb:17:1:17:59 | ... = ... | | Pathname.rb:17:7:17:33 | call to new | | Pathname.rb:17:7:17:59 | call to relative_path_from | -| Pathname.rb:18:1:18:33 | ... = ... | +| Pathname.rb:18:1:18:3 | p08 | | Pathname.rb:18:1:18:33 | ... = ... | | Pathname.rb:18:7:18:10 | pwd1 | | Pathname.rb:18:7:18:33 | call to sub | @@ -75,23 +75,23 @@ fileSystemAccesses | Pathname.rb:35:1:35:23 | call to write | Pathname.rb:35:1:35:8 | foo_path | | Pathname.rb:39:12:39:34 | call to open | Pathname.rb:39:12:39:19 | foo_path | fileNameSources -| Pathname.rb:2:1:2:33 | ... = ... | +| Pathname.rb:2:1:2:8 | foo_path | | Pathname.rb:2:1:2:33 | ... = ... | | Pathname.rb:2:12:2:33 | call to new | | Pathname.rb:3:1:3:20 | ... = ... | | Pathname.rb:3:13:3:20 | foo_path | | Pathname.rb:4:1:4:8 | foo_path | -| Pathname.rb:6:1:6:29 | ... = ... | +| Pathname.rb:6:1:6:8 | bar_path | | Pathname.rb:6:1:6:29 | ... = ... | | Pathname.rb:6:12:6:29 | call to new | -| Pathname.rb:9:1:9:21 | ... = ... | +| Pathname.rb:9:1:9:4 | pwd1 | | Pathname.rb:9:1:9:21 | ... = ... | | Pathname.rb:9:8:9:21 | call to getwd | | Pathname.rb:10:1:10:21 | ... = ... | | Pathname.rb:10:7:10:10 | pwd1 | | Pathname.rb:10:7:10:21 | ... + ... | | Pathname.rb:10:14:10:21 | foo_path | -| Pathname.rb:11:1:11:21 | ... = ... | +| Pathname.rb:11:1:11:3 | p01 | | Pathname.rb:11:1:11:21 | ... = ... | | Pathname.rb:11:7:11:10 | pwd1 | | Pathname.rb:11:7:11:21 | ... / ... | @@ -114,7 +114,7 @@ fileNameSources | Pathname.rb:17:1:17:59 | ... = ... | | Pathname.rb:17:7:17:33 | call to new | | Pathname.rb:17:7:17:59 | call to relative_path_from | -| Pathname.rb:18:1:18:33 | ... = ... | +| Pathname.rb:18:1:18:3 | p08 | | Pathname.rb:18:1:18:33 | ... = ... | | Pathname.rb:18:7:18:10 | pwd1 | | Pathname.rb:18:7:18:33 | call to sub | diff --git a/ruby/ql/test/library-tests/variables/ssa.expected b/ruby/ql/test/library-tests/variables/ssa.expected index 2f6d07b9915..a285f5f8cc4 100644 --- a/ruby/ql/test/library-tests/variables/ssa.expected +++ b/ruby/ql/test/library-tests/variables/ssa.expected @@ -22,29 +22,29 @@ definition | instance_variables.rb:38:4:40:6 | self (y) | instance_variables.rb:38:4:40:6 | self | | nested_scopes.rb:1:1:3:3 | self (a) | nested_scopes.rb:1:1:3:3 | self | | nested_scopes.rb:4:1:39:3 | self (C) | nested_scopes.rb:4:1:39:3 | self | -| nested_scopes.rb:5:3:5:7 | ... = ... | nested_scopes.rb:5:3:5:3 | a | +| nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:5:3:5:3 | a | | nested_scopes.rb:6:3:37:5 | self (M) | nested_scopes.rb:6:3:37:5 | self | -| nested_scopes.rb:7:5:7:9 | ... = ... | nested_scopes.rb:7:5:7:5 | a | +| nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:7:5:7:5 | a | | nested_scopes.rb:8:5:35:7 | self (N) | nested_scopes.rb:8:5:35:7 | self | -| nested_scopes.rb:9:7:9:11 | ... = ... | nested_scopes.rb:9:7:9:7 | a | +| nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:9:7:9:7 | a | | nested_scopes.rb:10:7:26:9 | self (D) | nested_scopes.rb:10:7:26:9 | self | -| nested_scopes.rb:11:9:11:13 | ... = ... | nested_scopes.rb:11:9:11:9 | a | +| nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:11:9:11:9 | a | | nested_scopes.rb:12:9:21:11 | self (show_a) | nested_scopes.rb:12:9:21:11 | self | -| nested_scopes.rb:13:11:13:15 | ... = ... | nested_scopes.rb:13:11:13:11 | a | +| nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:13:11:13:11 | a | | nested_scopes.rb:15:23:15:23 | a | nested_scopes.rb:15:23:15:23 | a | -| nested_scopes.rb:17:15:17:19 | ... = ... | nested_scopes.rb:16:29:16:29 | a | +| nested_scopes.rb:17:15:17:15 | a | nested_scopes.rb:16:29:16:29 | a | | nested_scopes.rb:18:23:18:36 | a | nested_scopes.rb:16:29:16:29 | a | | nested_scopes.rb:18:23:18:36 | self | nested_scopes.rb:12:9:21:11 | self | | nested_scopes.rb:22:9:24:11 | self (show_a2) | nested_scopes.rb:22:9:24:11 | self | | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:22:21:22:21 | a | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | | nested_scopes.rb:30:16:30:19 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | -| nested_scopes.rb:31:11:31:16 | ... = ... | nested_scopes.rb:31:11:31:11 | a | -| nested_scopes.rb:40:1:40:18 | ... = ... | nested_scopes.rb:40:1:40:1 | d | +| nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:31:11:31:11 | a | +| nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:40:1:40:1 | d | | parameters.rb:1:1:62:1 | self (parameters.rb) | parameters.rb:1:1:62:1 | self | | parameters.rb:1:9:5:3 | self | parameters.rb:1:1:62:1 | self | | parameters.rb:1:14:1:14 | x | parameters.rb:1:14:1:14 | x | -| parameters.rb:2:4:2:8 | ... = ... | parameters.rb:1:18:1:18 | y | +| parameters.rb:2:4:2:4 | y | parameters.rb:1:18:1:18 | y | | parameters.rb:7:1:13:3 | self (order_pizza) | parameters.rb:7:1:13:3 | self | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | | parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | @@ -64,23 +64,23 @@ definition | parameters.rb:35:1:38:3 | | parameters.rb:35:16:35:16 | b | | parameters.rb:35:1:38:3 | self (multi) | parameters.rb:35:1:38:3 | self | | parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a | -| parameters.rb:35:16:35:20 | ... = ... | parameters.rb:35:16:35:16 | b | +| parameters.rb:35:16:35:16 | b | parameters.rb:35:16:35:16 | b | | parameters.rb:37:3:37:18 | phi | parameters.rb:35:16:35:16 | b | | parameters.rb:40:1:43:3 | | parameters.rb:40:15:40:15 | e | | parameters.rb:40:1:43:3 | self (multi2) | parameters.rb:40:1:43:3 | self | | parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d | -| parameters.rb:40:15:40:19 | ... = ... | parameters.rb:40:15:40:15 | e | +| parameters.rb:40:15:40:15 | e | parameters.rb:40:15:40:15 | e | | parameters.rb:42:3:42:18 | phi | parameters.rb:40:15:40:15 | e | | parameters.rb:45:1:47:3 | self (dup_underscore) | parameters.rb:45:1:47:3 | self | | parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | | parameters.rb:49:1:51:3 | self (tuples) | parameters.rb:49:1:51:3 | self | | parameters.rb:49:13:49:13 | a | parameters.rb:49:13:49:13 | a | | parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b | -| parameters.rb:53:1:53:6 | ... = ... | parameters.rb:53:1:53:1 | x | +| parameters.rb:53:1:53:1 | x | parameters.rb:53:1:53:1 | x | | parameters.rb:54:9:57:3 | self | parameters.rb:1:1:62:1 | self | | parameters.rb:54:9:57:3 | x | parameters.rb:53:1:53:1 | x | | parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | -| parameters.rb:54:19:54:23 | ... = ... | parameters.rb:53:1:53:1 | x | +| parameters.rb:54:19:54:19 | x | parameters.rb:53:1:53:1 | x | | parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | | parameters.rb:59:1:61:3 | self (tuples_nested) | parameters.rb:59:1:61:3 | self | | parameters.rb:59:20:59:20 | a | parameters.rb:59:20:59:20 | a | @@ -88,80 +88,80 @@ definition | parameters.rb:59:25:59:25 | c | parameters.rb:59:25:59:25 | c | | scopes.rb:1:1:49:4 | self (scopes.rb) | scopes.rb:1:1:49:4 | self | | scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | -| scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | -| scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | +| scopes.rb:4:4:4:4 | a | scopes.rb:4:4:4:4 | a | +| scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | | scopes.rb:9:1:18:3 | a | scopes.rb:7:1:7:1 | a | | scopes.rb:9:9:18:3 | a | scopes.rb:7:1:7:1 | a | | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | -| scopes.rb:11:4:11:9 | ... = ... | scopes.rb:7:1:7:1 | a | -| scopes.rb:13:4:13:4 | ... = ... | scopes.rb:7:1:7:1 | a | -| scopes.rb:13:7:13:7 | ... = ... | scopes.rb:13:7:13:7 | b | -| scopes.rb:13:10:13:15 | ... = ... | scopes.rb:13:10:13:15 | __synth__0__1 | -| scopes.rb:13:11:13:11 | ... = ... | scopes.rb:13:11:13:11 | c | -| scopes.rb:13:14:13:14 | ... = ... | scopes.rb:13:14:13:14 | d | -| scopes.rb:13:19:13:32 | ... = ... | scopes.rb:13:4:13:32 | __synth__0 | +| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | +| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | +| scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b | +| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 | +| scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c | +| scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d | +| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | | scopes.rb:26:1:26:12 | self (A) | scopes.rb:26:1:26:12 | self | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | | scopes.rb:28:1:30:3 | self (B) | scopes.rb:28:1:30:3 | self | -| scopes.rb:29:3:29:7 | ... = ... | scopes.rb:29:3:29:3 | x | -| scopes.rb:32:3:32:7 | ... = ... | scopes.rb:32:3:32:3 | x | +| scopes.rb:29:3:29:3 | x | scopes.rb:29:3:29:3 | x | +| scopes.rb:32:3:32:3 | x | scopes.rb:32:3:32:3 | x | | scopes.rb:34:1:36:3 | self (C) | scopes.rb:34:1:36:3 | self | -| scopes.rb:35:3:35:7 | ... = ... | scopes.rb:35:3:35:3 | x | +| scopes.rb:35:3:35:3 | x | scopes.rb:35:3:35:3 | x | | scopes.rb:41:1:49:3 | self (M) | scopes.rb:41:1:49:3 | self | -| scopes.rb:42:2:42:9 | ... = ... | scopes.rb:42:2:42:4 | var | -| scopes.rb:43:2:43:13 | ... = ... | scopes.rb:43:2:43:4 | foo | -| scopes.rb:46:5:46:13 | ... = ... | scopes.rb:46:5:46:8 | var2 | +| scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:4 | var | +| scopes.rb:43:2:43:4 | foo | scopes.rb:43:2:43:4 | foo | +| scopes.rb:46:5:46:8 | var2 | scopes.rb:46:5:46:8 | var2 | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | | ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b | -| ssa.rb:2:3:2:7 | ... = ... | ssa.rb:2:3:2:3 | i | +| ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:3 | i | | ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | -| ssa.rb:6:5:6:9 | ... = ... | ssa.rb:2:3:2:3 | i | -| ssa.rb:10:5:10:9 | ... = ... | ssa.rb:2:3:2:3 | i | +| ssa.rb:6:5:6:5 | i | ssa.rb:2:3:2:3 | i | +| ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | | ssa.rb:18:8:18:8 | x | ssa.rb:18:8:18:8 | x | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | -| ssa.rb:21:5:21:10 | ... = ... | ssa.rb:18:8:18:8 | x | +| ssa.rb:21:5:21:5 | x | ssa.rb:18:8:18:8 | x | | ssa.rb:25:1:30:3 | | ssa.rb:26:7:26:10 | elem | | ssa.rb:25:1:30:3 | self (m2) | ssa.rb:25:1:30:3 | self | | ssa.rb:25:8:25:15 | elements | ssa.rb:25:8:25:15 | elements | -| ssa.rb:26:3:28:5 | ... = ... | ssa.rb:26:7:26:10 | elem | | ssa.rb:26:3:28:5 | self | ssa.rb:25:1:30:3 | self | | ssa.rb:26:3:28:5 | elem | ssa.rb:26:7:26:10 | elem | | ssa.rb:26:3:28:5 | __synth__0__1 | ssa.rb:26:3:28:5 | __synth__0__1 | +| ssa.rb:26:7:26:10 | elem | ssa.rb:26:7:26:10 | elem | | ssa.rb:32:1:36:3 | self (m3) | ssa.rb:32:1:36:3 | self | | ssa.rb:33:16:35:5 | self | ssa.rb:32:1:36:3 | self | | ssa.rb:33:20:33:20 | x | ssa.rb:33:20:33:20 | x | | ssa.rb:38:1:42:3 | self (m4) | ssa.rb:38:1:42:3 | self | -| ssa.rb:40:3:40:9 | ... = ... | ssa.rb:40:3:40:4 | m3 | +| ssa.rb:40:3:40:4 | m3 | ssa.rb:40:3:40:4 | m3 | | ssa.rb:44:1:47:3 | | ssa.rb:45:3:45:3 | x | | ssa.rb:44:1:47:3 | self (m5) | ssa.rb:44:1:47:3 | self | | ssa.rb:44:8:44:8 | b | ssa.rb:44:8:44:8 | b | -| ssa.rb:45:3:45:7 | ... = ... | ssa.rb:45:3:45:3 | x | +| ssa.rb:45:3:45:3 | x | ssa.rb:45:3:45:3 | x | | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | | ssa.rb:49:1:51:3 | | ssa.rb:49:14:49:14 | y | | ssa.rb:49:1:51:3 | self (m6) | ssa.rb:49:1:51:3 | self | -| ssa.rb:49:14:49:19 | ... = ... | ssa.rb:49:14:49:14 | y | +| ssa.rb:49:14:49:14 | y | ssa.rb:49:14:49:14 | y | | ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | | ssa.rb:53:1:56:3 | self (m7) | ssa.rb:53:1:56:3 | self | | ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo | -| ssa.rb:54:3:54:11 | ... = ... | ssa.rb:54:3:54:3 | x | +| ssa.rb:54:3:54:3 | x | ssa.rb:54:3:54:3 | x | | ssa.rb:58:1:62:3 | self (m8) | ssa.rb:58:1:62:3 | self | -| ssa.rb:59:3:59:8 | ... = ... | ssa.rb:59:3:59:3 | x | -| ssa.rb:60:3:60:9 | ... = ... | ssa.rb:59:3:59:3 | x | +| ssa.rb:59:3:59:3 | x | ssa.rb:59:3:59:3 | x | +| ssa.rb:60:3:60:3 | x | ssa.rb:59:3:59:3 | x | | ssa.rb:64:1:72:3 | self (m9) | ssa.rb:64:1:72:3 | self | | ssa.rb:64:8:64:8 | a | ssa.rb:64:8:64:8 | a | -| ssa.rb:65:3:65:15 | ... = ... | ssa.rb:65:3:65:10 | captured | +| ssa.rb:65:3:65:10 | captured | ssa.rb:65:3:65:10 | captured | | ssa.rb:66:3:70:5 | captured | ssa.rb:65:3:65:10 | captured | | ssa.rb:66:11:70:5 | captured | ssa.rb:65:3:65:10 | captured | | ssa.rb:66:11:70:5 | self | ssa.rb:64:1:72:3 | self | | ssa.rb:66:15:66:15 | a | ssa.rb:66:15:66:15 | a | -| ssa.rb:69:5:69:17 | ... = ... | ssa.rb:65:3:65:10 | captured | +| ssa.rb:69:5:69:12 | captured | ssa.rb:65:3:65:10 | captured | | ssa.rb:74:1:79:3 | self (m10) | ssa.rb:74:1:79:3 | self | -| ssa.rb:75:3:75:14 | ... = ... | ssa.rb:75:3:75:10 | captured | +| ssa.rb:75:3:75:10 | captured | ssa.rb:75:3:75:10 | captured | | ssa.rb:76:7:78:5 | captured | ssa.rb:75:3:75:10 | captured | | ssa.rb:76:7:78:5 | self | ssa.rb:74:1:79:3 | self | | ssa.rb:81:1:88:3 | self (m11) | ssa.rb:81:1:88:3 | self | -| ssa.rb:82:3:82:14 | ... = ... | ssa.rb:82:3:82:10 | captured | +| ssa.rb:82:3:82:10 | captured | ssa.rb:82:3:82:10 | captured | | ssa.rb:83:7:87:5 | self | ssa.rb:81:1:88:3 | self | | ssa.rb:84:10:86:8 | captured | ssa.rb:82:3:82:10 | captured | | ssa.rb:84:10:86:8 | self | ssa.rb:81:1:88:3 | self | @@ -170,7 +170,7 @@ definition | ssa.rb:90:13:90:14 | b2 | ssa.rb:90:13:90:14 | b2 | | ssa.rb:90:17:90:18 | b3 | ssa.rb:90:17:90:18 | b3 | | ssa.rb:90:21:90:22 | b4 | ssa.rb:90:21:90:22 | b4 | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | read | class_variables.rb:1:1:29:4 | self (class_variables.rb) | class_variables.rb:1:1:29:4 | self | class_variables.rb:3:1:3:5 | self | | class_variables.rb:5:1:7:3 | self (print) | class_variables.rb:5:1:7:3 | self | class_variables.rb:6:2:6:6 | self | @@ -199,20 +199,20 @@ read | instance_variables.rb:38:4:40:6 | self (y) | instance_variables.rb:38:4:40:6 | self | instance_variables.rb:39:6:39:7 | self | | nested_scopes.rb:1:1:3:3 | self (a) | nested_scopes.rb:1:1:3:3 | self | nested_scopes.rb:2:3:2:17 | self | | nested_scopes.rb:4:1:39:3 | self (C) | nested_scopes.rb:4:1:39:3 | self | nested_scopes.rb:38:3:38:8 | self | -| nested_scopes.rb:5:3:5:7 | ... = ... | nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:38:8:38:8 | a | +| nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:38:8:38:8 | a | | nested_scopes.rb:6:3:37:5 | self (M) | nested_scopes.rb:6:3:37:5 | self | nested_scopes.rb:36:5:36:10 | self | -| nested_scopes.rb:7:5:7:9 | ... = ... | nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:36:10:36:10 | a | +| nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:36:10:36:10 | a | | nested_scopes.rb:8:5:35:7 | self (N) | nested_scopes.rb:8:5:35:7 | self | nested_scopes.rb:27:11:27:14 | self | | nested_scopes.rb:8:5:35:7 | self (N) | nested_scopes.rb:8:5:35:7 | self | nested_scopes.rb:30:16:30:19 | self | | nested_scopes.rb:8:5:35:7 | self (N) | nested_scopes.rb:8:5:35:7 | self | nested_scopes.rb:34:7:34:12 | self | -| nested_scopes.rb:9:7:9:11 | ... = ... | nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:34:12:34:12 | a | +| nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:34:12:34:12 | a | | nested_scopes.rb:10:7:26:9 | self (D) | nested_scopes.rb:10:7:26:9 | self | nested_scopes.rb:25:9:25:14 | self | -| nested_scopes.rb:11:9:11:13 | ... = ... | nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:25:14:25:14 | a | +| nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:25:14:25:14 | a | | nested_scopes.rb:12:9:21:11 | self (show_a) | nested_scopes.rb:12:9:21:11 | self | nested_scopes.rb:14:11:14:16 | self | -| nested_scopes.rb:13:11:13:15 | ... = ... | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:14:16:14:16 | a | -| nested_scopes.rb:13:11:13:15 | ... = ... | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:15:11:15:11 | a | +| nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:14:16:14:16 | a | +| nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:15:11:15:11 | a | | nested_scopes.rb:15:23:15:23 | a | nested_scopes.rb:15:23:15:23 | a | nested_scopes.rb:16:13:16:13 | a | -| nested_scopes.rb:17:15:17:19 | ... = ... | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:15:18:15 | a | +| nested_scopes.rb:17:15:17:15 | a | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:15:18:15 | a | | nested_scopes.rb:18:23:18:36 | a | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:34:18:34 | a | | nested_scopes.rb:18:23:18:36 | self | nested_scopes.rb:12:9:21:11 | self | nested_scopes.rb:18:29:18:34 | self | | nested_scopes.rb:22:9:24:11 | self (show_a2) | nested_scopes.rb:22:9:24:11 | self | nested_scopes.rb:23:11:23:16 | self | @@ -220,12 +220,12 @@ read | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | nested_scopes.rb:28:11:28:16 | self | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | nested_scopes.rb:28:16:28:16 | self | | nested_scopes.rb:30:16:30:19 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | nested_scopes.rb:32:11:32:16 | self | -| nested_scopes.rb:31:11:31:16 | ... = ... | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:32:16:32:16 | a | -| nested_scopes.rb:40:1:40:18 | ... = ... | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:41:1:41:1 | d | +| nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:32:16:32:16 | a | +| nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:41:1:41:1 | d | | parameters.rb:1:9:5:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:3:4:3:9 | self | | parameters.rb:1:9:5:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:4:4:4:9 | self | | parameters.rb:1:14:1:14 | x | parameters.rb:1:14:1:14 | x | parameters.rb:3:9:3:9 | x | -| parameters.rb:2:4:2:8 | ... = ... | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y | +| parameters.rb:2:4:2:4 | y | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y | | parameters.rb:7:1:13:3 | self (order_pizza) | parameters.rb:7:1:13:3 | self | parameters.rb:9:5:9:33 | self | | parameters.rb:7:1:13:3 | self (order_pizza) | parameters.rb:7:1:13:3 | self | parameters.rb:11:5:11:49 | self | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:9:25:9:30 | client | @@ -269,8 +269,8 @@ read | scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:3:4:3:9 | self | | scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:3:9:3:9 | self | | scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:5:4:5:9 | self | -| scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | -| scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | +| scopes.rb:4:4:4:4 | a | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | +| scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | | scopes.rb:9:9:18:3 | a | scopes.rb:7:1:7:1 | a | scopes.rb:10:9:10:9 | a | | scopes.rb:9:9:18:3 | a | scopes.rb:7:1:7:1 | a | scopes.rb:11:4:11:4 | a | | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:10:4:10:9 | self | @@ -279,24 +279,24 @@ read | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:15:4:15:9 | self | | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:16:4:16:9 | self | | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:17:4:17:9 | self | -| scopes.rb:11:4:11:9 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:12:9:12:9 | a | -| scopes.rb:13:4:13:4 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:14:9:14:9 | a | -| scopes.rb:13:7:13:7 | ... = ... | scopes.rb:13:7:13:7 | b | scopes.rb:15:9:15:9 | b | -| scopes.rb:13:10:13:15 | ... = ... | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:11:13:11 | __synth__0__1 | -| scopes.rb:13:10:13:15 | ... = ... | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:14:13:14 | __synth__0__1 | -| scopes.rb:13:11:13:11 | ... = ... | scopes.rb:13:11:13:11 | c | scopes.rb:16:9:16:9 | c | -| scopes.rb:13:14:13:14 | ... = ... | scopes.rb:13:14:13:14 | d | scopes.rb:17:9:17:9 | d | -| scopes.rb:13:19:13:32 | ... = ... | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:4:13:4 | __synth__0 | -| scopes.rb:13:19:13:32 | ... = ... | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:7:13:7 | __synth__0 | -| scopes.rb:13:19:13:32 | ... = ... | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:10:13:15 | __synth__0 | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:28:8:28:8 | x | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:31:10:31:10 | x | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:34:7:34:7 | x | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:34:14:34:14 | x | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:37:5:37:5 | x | +| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:12:9:12:9 | a | +| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:14:9:14:9 | a | +| scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b | scopes.rb:15:9:15:9 | b | +| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:11:13:11 | __synth__0__1 | +| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:14:13:14 | __synth__0__1 | +| scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c | scopes.rb:16:9:16:9 | c | +| scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d | scopes.rb:17:9:17:9 | d | +| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:4:13:4 | __synth__0 | +| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:7:13:7 | __synth__0 | +| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:10:13:15 | __synth__0 | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:28:8:28:8 | x | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:31:10:31:10 | x | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:34:7:34:7 | x | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:34:14:34:14 | x | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:37:5:37:5 | x | | scopes.rb:41:1:49:3 | self (M) | scopes.rb:41:1:49:3 | self | scopes.rb:45:5:45:7 | self | -| scopes.rb:42:2:42:9 | ... = ... | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var | -| scopes.rb:46:5:46:13 | ... = ... | scopes.rb:46:5:46:8 | var2 | scopes.rb:47:5:47:8 | var2 | +| scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var | +| scopes.rb:46:5:46:8 | var2 | scopes.rb:46:5:46:8 | var2 | scopes.rb:47:5:47:8 | var2 | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:3:3:3:8 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:4:3:4:12 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:7:5:7:10 | self | @@ -305,29 +305,29 @@ read | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:12:5:12:14 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:15:3:15:8 | self | | ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b | ssa.rb:5:6:5:6 | b | -| ssa.rb:2:3:2:7 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:3:8:3:8 | i | -| ssa.rb:2:3:2:7 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:4:8:4:8 | i | +| ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:3 | i | ssa.rb:3:8:3:8 | i | +| ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:3 | i | ssa.rb:4:8:4:8 | i | | ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:15:8:15:8 | i | -| ssa.rb:6:5:6:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:7:10:7:10 | i | -| ssa.rb:6:5:6:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:8:10:8:10 | i | -| ssa.rb:10:5:10:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | -| ssa.rb:10:5:10:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:12:10:12:10 | i | +| ssa.rb:6:5:6:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:7:10:7:10 | i | +| ssa.rb:6:5:6:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:8:10:8:10 | i | +| ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | +| ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:12:10:12:10 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:20:10:20:10 | x | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:21:5:21:5 | x | | ssa.rb:25:1:30:3 | self (m2) | ssa.rb:25:1:30:3 | self | ssa.rb:29:3:29:11 | self | | ssa.rb:25:8:25:15 | elements | ssa.rb:25:8:25:15 | elements | ssa.rb:26:15:26:22 | elements | -| ssa.rb:26:3:28:5 | ... = ... | ssa.rb:26:7:26:10 | elem | ssa.rb:27:10:27:13 | elem | | ssa.rb:26:3:28:5 | self | ssa.rb:25:1:30:3 | self | ssa.rb:27:5:27:13 | self | | ssa.rb:26:3:28:5 | elem | ssa.rb:26:7:26:10 | elem | ssa.rb:29:8:29:11 | elem | | ssa.rb:26:3:28:5 | __synth__0__1 | ssa.rb:26:3:28:5 | __synth__0__1 | ssa.rb:26:3:28:5 | __synth__0__1 | +| ssa.rb:26:7:26:10 | elem | ssa.rb:26:7:26:10 | elem | ssa.rb:27:10:27:13 | elem | | ssa.rb:33:16:35:5 | self | ssa.rb:32:1:36:3 | self | ssa.rb:34:5:34:10 | self | | ssa.rb:33:20:33:20 | x | ssa.rb:33:20:33:20 | x | ssa.rb:34:10:34:10 | x | | ssa.rb:38:1:42:3 | self (m4) | ssa.rb:38:1:42:3 | self | ssa.rb:39:3:39:9 | self | | ssa.rb:38:1:42:3 | self (m4) | ssa.rb:38:1:42:3 | self | ssa.rb:39:8:39:9 | self | | ssa.rb:38:1:42:3 | self (m4) | ssa.rb:38:1:42:3 | self | ssa.rb:41:3:41:13 | self | -| ssa.rb:40:3:40:9 | ... = ... | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 | +| ssa.rb:40:3:40:4 | m3 | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 | | ssa.rb:44:1:47:3 | self (m5) | ssa.rb:44:1:47:3 | self | ssa.rb:46:3:46:8 | self | | ssa.rb:44:8:44:8 | b | ssa.rb:44:8:44:8 | b | ssa.rb:45:12:45:12 | b | | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:46:8:46:8 | x | @@ -335,10 +335,10 @@ read | ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y | | ssa.rb:53:1:56:3 | self (m7) | ssa.rb:53:1:56:3 | self | ssa.rb:55:3:55:8 | self | | ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo | ssa.rb:54:7:54:9 | foo | -| ssa.rb:54:3:54:11 | ... = ... | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x | +| ssa.rb:54:3:54:3 | x | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x | | ssa.rb:58:1:62:3 | self (m8) | ssa.rb:58:1:62:3 | self | ssa.rb:61:3:61:8 | self | -| ssa.rb:59:3:59:8 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x | -| ssa.rb:60:3:60:9 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:61:8:61:8 | x | +| ssa.rb:59:3:59:3 | x | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x | +| ssa.rb:60:3:60:3 | x | ssa.rb:59:3:59:3 | x | ssa.rb:61:8:61:8 | x | | ssa.rb:64:1:72:3 | self (m9) | ssa.rb:64:1:72:3 | self | ssa.rb:71:3:71:15 | self | | ssa.rb:64:8:64:8 | a | ssa.rb:64:8:64:8 | a | ssa.rb:66:3:66:3 | a | | ssa.rb:66:3:70:5 | captured | ssa.rb:65:3:65:10 | captured | ssa.rb:71:8:71:15 | captured | @@ -362,10 +362,10 @@ read | ssa.rb:90:13:90:14 | b2 | ssa.rb:90:13:90:14 | b2 | ssa.rb:94:10:94:11 | b2 | | ssa.rb:90:17:90:18 | b3 | ssa.rb:90:17:90:18 | b3 | ssa.rb:98:7:98:8 | b3 | | ssa.rb:90:21:90:22 | b4 | ssa.rb:90:21:90:22 | b4 | ssa.rb:100:10:100:11 | b4 | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:99:10:99:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:101:10:101:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:99:10:99:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:101:10:101:10 | x | firstRead | class_variables.rb:1:1:29:4 | self (class_variables.rb) | class_variables.rb:1:1:29:4 | self | class_variables.rb:3:1:3:5 | self | | class_variables.rb:5:1:7:3 | self (print) | class_variables.rb:5:1:7:3 | self | class_variables.rb:6:2:6:6 | self | @@ -387,28 +387,28 @@ firstRead | instance_variables.rb:38:4:40:6 | self (y) | instance_variables.rb:38:4:40:6 | self | instance_variables.rb:39:6:39:7 | self | | nested_scopes.rb:1:1:3:3 | self (a) | nested_scopes.rb:1:1:3:3 | self | nested_scopes.rb:2:3:2:17 | self | | nested_scopes.rb:4:1:39:3 | self (C) | nested_scopes.rb:4:1:39:3 | self | nested_scopes.rb:38:3:38:8 | self | -| nested_scopes.rb:5:3:5:7 | ... = ... | nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:38:8:38:8 | a | +| nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:38:8:38:8 | a | | nested_scopes.rb:6:3:37:5 | self (M) | nested_scopes.rb:6:3:37:5 | self | nested_scopes.rb:36:5:36:10 | self | -| nested_scopes.rb:7:5:7:9 | ... = ... | nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:36:10:36:10 | a | +| nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:36:10:36:10 | a | | nested_scopes.rb:8:5:35:7 | self (N) | nested_scopes.rb:8:5:35:7 | self | nested_scopes.rb:27:11:27:14 | self | -| nested_scopes.rb:9:7:9:11 | ... = ... | nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:34:12:34:12 | a | +| nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:34:12:34:12 | a | | nested_scopes.rb:10:7:26:9 | self (D) | nested_scopes.rb:10:7:26:9 | self | nested_scopes.rb:25:9:25:14 | self | -| nested_scopes.rb:11:9:11:13 | ... = ... | nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:25:14:25:14 | a | +| nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:25:14:25:14 | a | | nested_scopes.rb:12:9:21:11 | self (show_a) | nested_scopes.rb:12:9:21:11 | self | nested_scopes.rb:14:11:14:16 | self | -| nested_scopes.rb:13:11:13:15 | ... = ... | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:14:16:14:16 | a | +| nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:14:16:14:16 | a | | nested_scopes.rb:15:23:15:23 | a | nested_scopes.rb:15:23:15:23 | a | nested_scopes.rb:16:13:16:13 | a | -| nested_scopes.rb:17:15:17:19 | ... = ... | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:15:18:15 | a | +| nested_scopes.rb:17:15:17:15 | a | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:15:18:15 | a | | nested_scopes.rb:18:23:18:36 | a | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:34:18:34 | a | | nested_scopes.rb:18:23:18:36 | self | nested_scopes.rb:12:9:21:11 | self | nested_scopes.rb:18:29:18:34 | self | | nested_scopes.rb:22:9:24:11 | self (show_a2) | nested_scopes.rb:22:9:24:11 | self | nested_scopes.rb:23:11:23:16 | self | | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:23:16:23:16 | a | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | nested_scopes.rb:28:11:28:16 | self | | nested_scopes.rb:30:16:30:19 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | nested_scopes.rb:32:11:32:16 | self | -| nested_scopes.rb:31:11:31:16 | ... = ... | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:32:16:32:16 | a | -| nested_scopes.rb:40:1:40:18 | ... = ... | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:41:1:41:1 | d | +| nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:32:16:32:16 | a | +| nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:41:1:41:1 | d | | parameters.rb:1:9:5:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:3:4:3:9 | self | | parameters.rb:1:14:1:14 | x | parameters.rb:1:14:1:14 | x | parameters.rb:3:9:3:9 | x | -| parameters.rb:2:4:2:8 | ... = ... | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y | +| parameters.rb:2:4:2:4 | y | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y | | parameters.rb:7:1:13:3 | self (order_pizza) | parameters.rb:7:1:13:3 | self | parameters.rb:9:5:9:33 | self | | parameters.rb:7:1:13:3 | self (order_pizza) | parameters.rb:7:1:13:3 | self | parameters.rb:11:5:11:49 | self | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:9:25:9:30 | client | @@ -447,39 +447,39 @@ firstRead | parameters.rb:59:25:59:25 | c | parameters.rb:59:25:59:25 | c | parameters.rb:60:21:60:21 | c | | scopes.rb:1:1:49:4 | self (scopes.rb) | scopes.rb:1:1:49:4 | self | scopes.rb:8:1:8:6 | self | | scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:3:4:3:9 | self | -| scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | -| scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | +| scopes.rb:4:4:4:4 | a | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | +| scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | | scopes.rb:9:9:18:3 | a | scopes.rb:7:1:7:1 | a | scopes.rb:10:9:10:9 | a | | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:10:4:10:9 | self | -| scopes.rb:11:4:11:9 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:12:9:12:9 | a | -| scopes.rb:13:4:13:4 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:14:9:14:9 | a | -| scopes.rb:13:7:13:7 | ... = ... | scopes.rb:13:7:13:7 | b | scopes.rb:15:9:15:9 | b | -| scopes.rb:13:10:13:15 | ... = ... | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:11:13:11 | __synth__0__1 | -| scopes.rb:13:11:13:11 | ... = ... | scopes.rb:13:11:13:11 | c | scopes.rb:16:9:16:9 | c | -| scopes.rb:13:14:13:14 | ... = ... | scopes.rb:13:14:13:14 | d | scopes.rb:17:9:17:9 | d | -| scopes.rb:13:19:13:32 | ... = ... | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:4:13:4 | __synth__0 | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:28:8:28:8 | x | +| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:12:9:12:9 | a | +| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:14:9:14:9 | a | +| scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b | scopes.rb:15:9:15:9 | b | +| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:11:13:11 | __synth__0__1 | +| scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c | scopes.rb:16:9:16:9 | c | +| scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d | scopes.rb:17:9:17:9 | d | +| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:4:13:4 | __synth__0 | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:28:8:28:8 | x | | scopes.rb:41:1:49:3 | self (M) | scopes.rb:41:1:49:3 | self | scopes.rb:45:5:45:7 | self | -| scopes.rb:42:2:42:9 | ... = ... | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var | -| scopes.rb:46:5:46:13 | ... = ... | scopes.rb:46:5:46:8 | var2 | scopes.rb:47:5:47:8 | var2 | +| scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var | +| scopes.rb:46:5:46:8 | var2 | scopes.rb:46:5:46:8 | var2 | scopes.rb:47:5:47:8 | var2 | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:3:3:3:8 | self | | ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b | ssa.rb:5:6:5:6 | b | -| ssa.rb:2:3:2:7 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:3:8:3:8 | i | +| ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:3 | i | ssa.rb:3:8:3:8 | i | | ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:15:8:15:8 | i | -| ssa.rb:6:5:6:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:7:10:7:10 | i | -| ssa.rb:10:5:10:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | +| ssa.rb:6:5:6:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:7:10:7:10 | i | +| ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | | ssa.rb:25:1:30:3 | self (m2) | ssa.rb:25:1:30:3 | self | ssa.rb:29:3:29:11 | self | | ssa.rb:25:8:25:15 | elements | ssa.rb:25:8:25:15 | elements | ssa.rb:26:15:26:22 | elements | -| ssa.rb:26:3:28:5 | ... = ... | ssa.rb:26:7:26:10 | elem | ssa.rb:27:10:27:13 | elem | | ssa.rb:26:3:28:5 | self | ssa.rb:25:1:30:3 | self | ssa.rb:27:5:27:13 | self | | ssa.rb:26:3:28:5 | elem | ssa.rb:26:7:26:10 | elem | ssa.rb:29:8:29:11 | elem | | ssa.rb:26:3:28:5 | __synth__0__1 | ssa.rb:26:3:28:5 | __synth__0__1 | ssa.rb:26:3:28:5 | __synth__0__1 | +| ssa.rb:26:7:26:10 | elem | ssa.rb:26:7:26:10 | elem | ssa.rb:27:10:27:13 | elem | | ssa.rb:33:16:35:5 | self | ssa.rb:32:1:36:3 | self | ssa.rb:34:5:34:10 | self | | ssa.rb:33:20:33:20 | x | ssa.rb:33:20:33:20 | x | ssa.rb:34:10:34:10 | x | | ssa.rb:38:1:42:3 | self (m4) | ssa.rb:38:1:42:3 | self | ssa.rb:39:3:39:9 | self | -| ssa.rb:40:3:40:9 | ... = ... | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 | +| ssa.rb:40:3:40:4 | m3 | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 | | ssa.rb:44:1:47:3 | self (m5) | ssa.rb:44:1:47:3 | self | ssa.rb:46:3:46:8 | self | | ssa.rb:44:8:44:8 | b | ssa.rb:44:8:44:8 | b | ssa.rb:45:12:45:12 | b | | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:46:8:46:8 | x | @@ -487,10 +487,10 @@ firstRead | ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y | | ssa.rb:53:1:56:3 | self (m7) | ssa.rb:53:1:56:3 | self | ssa.rb:55:3:55:8 | self | | ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo | ssa.rb:54:7:54:9 | foo | -| ssa.rb:54:3:54:11 | ... = ... | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x | +| ssa.rb:54:3:54:3 | x | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x | | ssa.rb:58:1:62:3 | self (m8) | ssa.rb:58:1:62:3 | self | ssa.rb:61:3:61:8 | self | -| ssa.rb:59:3:59:8 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x | -| ssa.rb:60:3:60:9 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:61:8:61:8 | x | +| ssa.rb:59:3:59:3 | x | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x | +| ssa.rb:60:3:60:3 | x | ssa.rb:59:3:59:3 | x | ssa.rb:61:8:61:8 | x | | ssa.rb:64:1:72:3 | self (m9) | ssa.rb:64:1:72:3 | self | ssa.rb:71:3:71:15 | self | | ssa.rb:64:8:64:8 | a | ssa.rb:64:8:64:8 | a | ssa.rb:66:3:66:3 | a | | ssa.rb:66:3:70:5 | captured | ssa.rb:65:3:65:10 | captured | ssa.rb:71:8:71:15 | captured | @@ -512,10 +512,10 @@ firstRead | ssa.rb:90:13:90:14 | b2 | ssa.rb:90:13:90:14 | b2 | ssa.rb:94:10:94:11 | b2 | | ssa.rb:90:17:90:18 | b3 | ssa.rb:90:17:90:18 | b3 | ssa.rb:98:7:98:8 | b3 | | ssa.rb:90:21:90:22 | b4 | ssa.rb:90:21:90:22 | b4 | ssa.rb:100:10:100:11 | b4 | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:99:10:99:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:101:10:101:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:99:10:99:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:101:10:101:10 | x | lastRead | class_variables.rb:1:1:29:4 | self (class_variables.rb) | class_variables.rb:1:1:29:4 | self | class_variables.rb:3:1:3:5 | self | | class_variables.rb:5:1:7:3 | self (print) | class_variables.rb:5:1:7:3 | self | class_variables.rb:6:2:6:6 | self | @@ -537,28 +537,28 @@ lastRead | instance_variables.rb:38:4:40:6 | self (y) | instance_variables.rb:38:4:40:6 | self | instance_variables.rb:39:6:39:7 | self | | nested_scopes.rb:1:1:3:3 | self (a) | nested_scopes.rb:1:1:3:3 | self | nested_scopes.rb:2:3:2:17 | self | | nested_scopes.rb:4:1:39:3 | self (C) | nested_scopes.rb:4:1:39:3 | self | nested_scopes.rb:38:3:38:8 | self | -| nested_scopes.rb:5:3:5:7 | ... = ... | nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:38:8:38:8 | a | +| nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:5:3:5:3 | a | nested_scopes.rb:38:8:38:8 | a | | nested_scopes.rb:6:3:37:5 | self (M) | nested_scopes.rb:6:3:37:5 | self | nested_scopes.rb:36:5:36:10 | self | -| nested_scopes.rb:7:5:7:9 | ... = ... | nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:36:10:36:10 | a | +| nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:7:5:7:5 | a | nested_scopes.rb:36:10:36:10 | a | | nested_scopes.rb:8:5:35:7 | self (N) | nested_scopes.rb:8:5:35:7 | self | nested_scopes.rb:34:7:34:12 | self | -| nested_scopes.rb:9:7:9:11 | ... = ... | nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:34:12:34:12 | a | +| nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:9:7:9:7 | a | nested_scopes.rb:34:12:34:12 | a | | nested_scopes.rb:10:7:26:9 | self (D) | nested_scopes.rb:10:7:26:9 | self | nested_scopes.rb:25:9:25:14 | self | -| nested_scopes.rb:11:9:11:13 | ... = ... | nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:25:14:25:14 | a | +| nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:11:9:11:9 | a | nested_scopes.rb:25:14:25:14 | a | | nested_scopes.rb:12:9:21:11 | self (show_a) | nested_scopes.rb:12:9:21:11 | self | nested_scopes.rb:14:11:14:16 | self | -| nested_scopes.rb:13:11:13:15 | ... = ... | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:15:11:15:11 | a | +| nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:15:11:15:11 | a | | nested_scopes.rb:15:23:15:23 | a | nested_scopes.rb:15:23:15:23 | a | nested_scopes.rb:16:13:16:13 | a | -| nested_scopes.rb:17:15:17:19 | ... = ... | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:15:18:15 | a | +| nested_scopes.rb:17:15:17:15 | a | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:15:18:15 | a | | nested_scopes.rb:18:23:18:36 | a | nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:18:34:18:34 | a | | nested_scopes.rb:18:23:18:36 | self | nested_scopes.rb:12:9:21:11 | self | nested_scopes.rb:18:29:18:34 | self | | nested_scopes.rb:22:9:24:11 | self (show_a2) | nested_scopes.rb:22:9:24:11 | self | nested_scopes.rb:23:11:23:16 | self | | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:23:16:23:16 | a | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | nested_scopes.rb:28:16:28:16 | self | | nested_scopes.rb:30:16:30:19 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | nested_scopes.rb:32:11:32:16 | self | -| nested_scopes.rb:31:11:31:16 | ... = ... | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:32:16:32:16 | a | -| nested_scopes.rb:40:1:40:18 | ... = ... | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:41:1:41:1 | d | +| nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:32:16:32:16 | a | +| nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:41:1:41:1 | d | | parameters.rb:1:9:5:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:4:4:4:9 | self | | parameters.rb:1:14:1:14 | x | parameters.rb:1:14:1:14 | x | parameters.rb:3:9:3:9 | x | -| parameters.rb:2:4:2:8 | ... = ... | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y | +| parameters.rb:2:4:2:4 | y | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y | | parameters.rb:7:1:13:3 | self (order_pizza) | parameters.rb:7:1:13:3 | self | parameters.rb:9:5:9:33 | self | | parameters.rb:7:1:13:3 | self (order_pizza) | parameters.rb:7:1:13:3 | self | parameters.rb:11:5:11:49 | self | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:9:25:9:30 | client | @@ -597,40 +597,40 @@ lastRead | parameters.rb:59:25:59:25 | c | parameters.rb:59:25:59:25 | c | parameters.rb:60:21:60:21 | c | | scopes.rb:1:1:49:4 | self (scopes.rb) | scopes.rb:1:1:49:4 | self | scopes.rb:8:1:8:6 | self | | scopes.rb:2:9:6:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:5:4:5:9 | self | -| scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | -| scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | +| scopes.rb:4:4:4:4 | a | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | +| scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | | scopes.rb:9:9:18:3 | a | scopes.rb:7:1:7:1 | a | scopes.rb:11:4:11:4 | a | | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:17:4:17:9 | self | -| scopes.rb:11:4:11:9 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:12:9:12:9 | a | -| scopes.rb:13:4:13:4 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:14:9:14:9 | a | -| scopes.rb:13:7:13:7 | ... = ... | scopes.rb:13:7:13:7 | b | scopes.rb:15:9:15:9 | b | -| scopes.rb:13:10:13:15 | ... = ... | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:14:13:14 | __synth__0__1 | -| scopes.rb:13:11:13:11 | ... = ... | scopes.rb:13:11:13:11 | c | scopes.rb:16:9:16:9 | c | -| scopes.rb:13:14:13:14 | ... = ... | scopes.rb:13:14:13:14 | d | scopes.rb:17:9:17:9 | d | -| scopes.rb:13:19:13:32 | ... = ... | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:10:13:15 | __synth__0 | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:37:5:37:5 | x | +| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:12:9:12:9 | a | +| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:14:9:14:9 | a | +| scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b | scopes.rb:15:9:15:9 | b | +| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:14:13:14 | __synth__0__1 | +| scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c | scopes.rb:16:9:16:9 | c | +| scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d | scopes.rb:17:9:17:9 | d | +| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:10:13:15 | __synth__0 | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:37:5:37:5 | x | | scopes.rb:41:1:49:3 | self (M) | scopes.rb:41:1:49:3 | self | scopes.rb:45:5:45:7 | self | -| scopes.rb:42:2:42:9 | ... = ... | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var | -| scopes.rb:46:5:46:13 | ... = ... | scopes.rb:46:5:46:8 | var2 | scopes.rb:47:5:47:8 | var2 | +| scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var | +| scopes.rb:46:5:46:8 | var2 | scopes.rb:46:5:46:8 | var2 | scopes.rb:47:5:47:8 | var2 | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:15:3:15:8 | self | | ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b | ssa.rb:5:6:5:6 | b | -| ssa.rb:2:3:2:7 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:4:8:4:8 | i | +| ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:3 | i | ssa.rb:4:8:4:8 | i | | ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:15:8:15:8 | i | -| ssa.rb:6:5:6:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:8:10:8:10 | i | -| ssa.rb:10:5:10:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:12:10:12:10 | i | +| ssa.rb:6:5:6:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:8:10:8:10 | i | +| ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:12:10:12:10 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:21:5:21:5 | x | | ssa.rb:25:1:30:3 | self (m2) | ssa.rb:25:1:30:3 | self | ssa.rb:29:3:29:11 | self | | ssa.rb:25:8:25:15 | elements | ssa.rb:25:8:25:15 | elements | ssa.rb:26:15:26:22 | elements | -| ssa.rb:26:3:28:5 | ... = ... | ssa.rb:26:7:26:10 | elem | ssa.rb:27:10:27:13 | elem | | ssa.rb:26:3:28:5 | self | ssa.rb:25:1:30:3 | self | ssa.rb:27:5:27:13 | self | | ssa.rb:26:3:28:5 | elem | ssa.rb:26:7:26:10 | elem | ssa.rb:29:8:29:11 | elem | | ssa.rb:26:3:28:5 | __synth__0__1 | ssa.rb:26:3:28:5 | __synth__0__1 | ssa.rb:26:3:28:5 | __synth__0__1 | +| ssa.rb:26:7:26:10 | elem | ssa.rb:26:7:26:10 | elem | ssa.rb:27:10:27:13 | elem | | ssa.rb:33:16:35:5 | self | ssa.rb:32:1:36:3 | self | ssa.rb:34:5:34:10 | self | | ssa.rb:33:20:33:20 | x | ssa.rb:33:20:33:20 | x | ssa.rb:34:10:34:10 | x | | ssa.rb:38:1:42:3 | self (m4) | ssa.rb:38:1:42:3 | self | ssa.rb:41:3:41:13 | self | -| ssa.rb:40:3:40:9 | ... = ... | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 | +| ssa.rb:40:3:40:4 | m3 | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 | | ssa.rb:44:1:47:3 | self (m5) | ssa.rb:44:1:47:3 | self | ssa.rb:46:3:46:8 | self | | ssa.rb:44:8:44:8 | b | ssa.rb:44:8:44:8 | b | ssa.rb:45:12:45:12 | b | | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:46:8:46:8 | x | @@ -638,10 +638,10 @@ lastRead | ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y | | ssa.rb:53:1:56:3 | self (m7) | ssa.rb:53:1:56:3 | self | ssa.rb:55:3:55:8 | self | | ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo | ssa.rb:54:7:54:9 | foo | -| ssa.rb:54:3:54:11 | ... = ... | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x | +| ssa.rb:54:3:54:3 | x | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x | | ssa.rb:58:1:62:3 | self (m8) | ssa.rb:58:1:62:3 | self | ssa.rb:61:3:61:8 | self | -| ssa.rb:59:3:59:8 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x | -| ssa.rb:60:3:60:9 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:61:8:61:8 | x | +| ssa.rb:59:3:59:3 | x | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x | +| ssa.rb:60:3:60:3 | x | ssa.rb:59:3:59:3 | x | ssa.rb:61:8:61:8 | x | | ssa.rb:64:1:72:3 | self (m9) | ssa.rb:64:1:72:3 | self | ssa.rb:71:3:71:15 | self | | ssa.rb:64:8:64:8 | a | ssa.rb:64:8:64:8 | a | ssa.rb:66:3:66:3 | a | | ssa.rb:66:3:70:5 | captured | ssa.rb:65:3:65:10 | captured | ssa.rb:71:8:71:15 | captured | @@ -663,10 +663,10 @@ lastRead | ssa.rb:90:13:90:14 | b2 | ssa.rb:90:13:90:14 | b2 | ssa.rb:94:10:94:11 | b2 | | ssa.rb:90:17:90:18 | b3 | ssa.rb:90:17:90:18 | b3 | ssa.rb:98:7:98:8 | b3 | | ssa.rb:90:21:90:22 | b4 | ssa.rb:90:21:90:22 | b4 | ssa.rb:100:10:100:11 | b4 | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:99:10:99:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:101:10:101:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:99:10:99:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:101:10:101:10 | x | adjacentReads | class_variables.rb:26:1:29:3 | self (N) | class_variables.rb:26:1:29:3 | self | class_variables.rb:27:3:27:11 | self | class_variables.rb:28:3:28:7 | self | | instance_variables.rb:1:1:44:4 | self (instance_variables.rb) | instance_variables.rb:1:1:44:4 | self | instance_variables.rb:1:1:1:4 | self | instance_variables.rb:11:1:11:9 | self | @@ -677,7 +677,7 @@ adjacentReads | instance_variables.rb:37:3:43:5 | self (x) | instance_variables.rb:37:3:43:5 | self | instance_variables.rb:42:4:42:7 | self | instance_variables.rb:42:6:42:7 | self | | nested_scopes.rb:8:5:35:7 | self (N) | nested_scopes.rb:8:5:35:7 | self | nested_scopes.rb:27:11:27:14 | self | nested_scopes.rb:30:16:30:19 | self | | nested_scopes.rb:8:5:35:7 | self (N) | nested_scopes.rb:8:5:35:7 | self | nested_scopes.rb:30:16:30:19 | self | nested_scopes.rb:34:7:34:12 | self | -| nested_scopes.rb:13:11:13:15 | ... = ... | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:14:16:14:16 | a | nested_scopes.rb:15:11:15:11 | a | +| nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:14:16:14:16 | a | nested_scopes.rb:15:11:15:11 | a | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | nested_scopes.rb:28:11:28:16 | self | nested_scopes.rb:28:16:28:16 | self | | nested_scopes.rb:30:16:30:19 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | nested_scopes.rb:30:16:30:19 | self | nested_scopes.rb:32:11:32:16 | self | | parameters.rb:1:9:5:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:3:4:3:9 | self | parameters.rb:4:4:4:9 | self | @@ -693,13 +693,13 @@ adjacentReads | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:14:4:14:9 | self | scopes.rb:15:4:15:9 | self | | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:15:4:15:9 | self | scopes.rb:16:4:16:9 | self | | scopes.rb:9:9:18:3 | self | scopes.rb:1:1:49:4 | self | scopes.rb:16:4:16:9 | self | scopes.rb:17:4:17:9 | self | -| scopes.rb:13:10:13:15 | ... = ... | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:11:13:11 | __synth__0__1 | scopes.rb:13:14:13:14 | __synth__0__1 | -| scopes.rb:13:19:13:32 | ... = ... | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:4:13:4 | __synth__0 | scopes.rb:13:7:13:7 | __synth__0 | -| scopes.rb:13:19:13:32 | ... = ... | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:7:13:7 | __synth__0 | scopes.rb:13:10:13:15 | __synth__0 | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:28:8:28:8 | x | scopes.rb:31:10:31:10 | x | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:31:10:31:10 | x | scopes.rb:34:7:34:7 | x | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:34:7:34:7 | x | scopes.rb:34:14:34:14 | x | -| scopes.rb:27:1:27:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:34:14:34:14 | x | scopes.rb:37:5:37:5 | x | +| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:11:13:11 | __synth__0__1 | scopes.rb:13:14:13:14 | __synth__0__1 | +| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:4:13:4 | __synth__0 | scopes.rb:13:7:13:7 | __synth__0 | +| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:7:13:7 | __synth__0 | scopes.rb:13:10:13:15 | __synth__0 | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:28:8:28:8 | x | scopes.rb:31:10:31:10 | x | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:31:10:31:10 | x | scopes.rb:34:7:34:7 | x | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:34:7:34:7 | x | scopes.rb:34:14:34:14 | x | +| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:34:14:34:14 | x | scopes.rb:37:5:37:5 | x | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:3:3:3:8 | self | ssa.rb:4:3:4:12 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:4:3:4:12 | self | ssa.rb:7:5:7:10 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:4:3:4:12 | self | ssa.rb:11:5:11:10 | self | @@ -707,9 +707,9 @@ adjacentReads | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:8:5:8:14 | self | ssa.rb:15:3:15:8 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:11:5:11:10 | self | ssa.rb:12:5:12:14 | self | | ssa.rb:1:1:16:3 | self (m) | ssa.rb:1:1:16:3 | self | ssa.rb:12:5:12:14 | self | ssa.rb:15:3:15:8 | self | -| ssa.rb:2:3:2:7 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:3:8:3:8 | i | ssa.rb:4:8:4:8 | i | -| ssa.rb:6:5:6:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:7:10:7:10 | i | ssa.rb:8:10:8:10 | i | -| ssa.rb:10:5:10:9 | ... = ... | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | ssa.rb:12:10:12:10 | i | +| ssa.rb:2:3:2:3 | i | ssa.rb:2:3:2:3 | i | ssa.rb:3:8:3:8 | i | ssa.rb:4:8:4:8 | i | +| ssa.rb:6:5:6:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:7:10:7:10 | i | ssa.rb:8:10:8:10 | i | +| ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | ssa.rb:12:10:12:10 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | ssa.rb:20:5:20:10 | self | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | ssa.rb:20:10:20:10 | x | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:20:10:20:10 | x | ssa.rb:21:5:21:5 | x | @@ -721,25 +721,25 @@ adjacentReads | ssa.rb:90:1:103:3 | self (m12) | ssa.rb:90:1:103:3 | self | ssa.rb:93:5:93:10 | self | ssa.rb:101:5:101:10 | self | | ssa.rb:90:1:103:3 | self (m12) | ssa.rb:90:1:103:3 | self | ssa.rb:95:5:95:10 | self | ssa.rb:99:5:99:10 | self | | ssa.rb:90:1:103:3 | self (m12) | ssa.rb:90:1:103:3 | self | ssa.rb:95:5:95:10 | self | ssa.rb:101:5:101:10 | self | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | ssa.rb:99:10:99:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | ssa.rb:101:10:101:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | ssa.rb:99:10:99:10 | x | -| ssa.rb:91:3:91:7 | ... = ... | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | ssa.rb:101:10:101:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | ssa.rb:99:10:99:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:93:10:93:10 | x | ssa.rb:101:10:101:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | ssa.rb:99:10:99:10 | x | +| ssa.rb:91:3:91:3 | x | ssa.rb:91:3:91:3 | x | ssa.rb:95:10:95:10 | x | ssa.rb:101:10:101:10 | x | phi | parameters.rb:37:3:37:18 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:35:1:38:3 | | -| parameters.rb:37:3:37:18 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:35:16:35:20 | ... = ... | +| parameters.rb:37:3:37:18 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:35:16:35:16 | b | | parameters.rb:42:3:42:18 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:1:43:3 | | -| parameters.rb:42:3:42:18 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:15:40:19 | ... = ... | +| parameters.rb:42:3:42:18 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:15:40:15 | e | | parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:9:57:3 | x | -| parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:19:54:23 | ... = ... | -| ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:6:5:6:9 | ... = ... | -| ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:10:5:10:9 | ... = ... | +| parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:19:54:19 | x | +| ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:6:5:6:5 | i | +| ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:10:5:10:5 | i | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:18:8:18:8 | x | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:21:5:21:10 | ... = ... | +| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:21:5:21:5 | x | | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:44:1:47:3 | | -| ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:45:3:45:7 | ... = ... | +| ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:45:3:45:3 | x | | ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:1:51:3 | | -| ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:14:49:19 | ... = ... | +| ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:14:49:14 | y | phiReadNode | parameters.rb:26:3:26:11 | SSA phi read(name) | parameters.rb:25:15:25:18 | name | | ssa.rb:5:3:13:5 | SSA phi read(self) | ssa.rb:1:1:16:3 | self | @@ -763,7 +763,7 @@ phiReadInput | ssa.rb:19:9:19:9 | SSA phi read(self) | ssa.rb:19:9:19:9 | SSA phi read(self) | | ssa.rb:92:3:96:5 | SSA phi read(self) | ssa.rb:90:1:103:3 | self (m12) | | ssa.rb:92:3:96:5 | SSA phi read(self) | ssa.rb:94:3:95:10 | SSA phi read(self) | -| ssa.rb:92:3:96:5 | SSA phi read(x) | ssa.rb:91:3:91:7 | ... = ... | +| ssa.rb:92:3:96:5 | SSA phi read(x) | ssa.rb:91:3:91:3 | x | | ssa.rb:92:3:96:5 | SSA phi read(x) | ssa.rb:94:3:95:10 | SSA phi read(x) | | ssa.rb:94:3:95:10 | SSA phi read(self) | ssa.rb:90:1:103:3 | self (m12) | -| ssa.rb:94:3:95:10 | SSA phi read(x) | ssa.rb:91:3:91:7 | ... = ... | +| ssa.rb:94:3:95:10 | SSA phi read(x) | ssa.rb:91:3:91:3 | x | diff --git a/ruby/ql/test/query-tests/experimental/TemplateInjection/TemplateInjection.expected b/ruby/ql/test/query-tests/experimental/TemplateInjection/TemplateInjection.expected index 7f7e0a5bbe4..a3e20d71b20 100644 --- a/ruby/ql/test/query-tests/experimental/TemplateInjection/TemplateInjection.expected +++ b/ruby/ql/test/query-tests/experimental/TemplateInjection/TemplateInjection.expected @@ -1,30 +1,36 @@ edges +| ErbInjection.rb:5:5:5:8 | name : | ErbInjection.rb:8:5:8:12 | bad_text : | +| ErbInjection.rb:5:5:5:8 | name : | ErbInjection.rb:11:11:11:14 | name : | | ErbInjection.rb:5:12:5:17 | call to params : | ErbInjection.rb:5:12:5:24 | ...[...] : | -| ErbInjection.rb:5:12:5:24 | ...[...] : | ErbInjection.rb:11:11:11:14 | name : | -| ErbInjection.rb:5:12:5:24 | ...[...] : | ErbInjection.rb:15:24:15:31 | bad_text | -| ErbInjection.rb:8:16:11:14 | ... % ... : | ErbInjection.rb:15:24:15:31 | bad_text | +| ErbInjection.rb:5:12:5:24 | ...[...] : | ErbInjection.rb:5:5:5:8 | name : | +| ErbInjection.rb:8:5:8:12 | bad_text : | ErbInjection.rb:15:24:15:31 | bad_text | +| ErbInjection.rb:8:16:11:14 | ... % ... : | ErbInjection.rb:8:5:8:12 | bad_text : | | ErbInjection.rb:11:11:11:14 | name : | ErbInjection.rb:8:16:11:14 | ... % ... : | +| SlimInjection.rb:5:5:5:8 | name : | SlimInjection.rb:8:5:8:12 | bad_text : | +| SlimInjection.rb:5:5:5:8 | name : | SlimInjection.rb:11:11:11:14 | name : | +| SlimInjection.rb:5:5:5:8 | name : | SlimInjection.rb:17:5:17:13 | bad2_text : | | SlimInjection.rb:5:12:5:17 | call to params : | SlimInjection.rb:5:12:5:24 | ...[...] : | -| SlimInjection.rb:5:12:5:24 | ...[...] : | SlimInjection.rb:8:5:11:14 | ... = ... : | -| SlimInjection.rb:5:12:5:24 | ...[...] : | SlimInjection.rb:11:11:11:14 | name : | -| SlimInjection.rb:5:12:5:24 | ...[...] : | SlimInjection.rb:17:5:20:7 | ... = ... : | -| SlimInjection.rb:8:5:11:14 | ... = ... : | SlimInjection.rb:14:25:14:32 | bad_text | -| SlimInjection.rb:8:16:11:14 | ... % ... : | SlimInjection.rb:8:5:11:14 | ... = ... : | +| SlimInjection.rb:5:12:5:24 | ...[...] : | SlimInjection.rb:5:5:5:8 | name : | +| SlimInjection.rb:8:5:8:12 | bad_text : | SlimInjection.rb:14:25:14:32 | bad_text | +| SlimInjection.rb:8:16:11:14 | ... % ... : | SlimInjection.rb:8:5:8:12 | bad_text : | | SlimInjection.rb:11:11:11:14 | name : | SlimInjection.rb:8:16:11:14 | ... % ... : | -| SlimInjection.rb:17:5:20:7 | ... = ... : | SlimInjection.rb:23:25:23:33 | bad2_text | +| SlimInjection.rb:17:5:17:13 | bad2_text : | SlimInjection.rb:23:25:23:33 | bad2_text | nodes +| ErbInjection.rb:5:5:5:8 | name : | semmle.label | name : | | ErbInjection.rb:5:12:5:17 | call to params : | semmle.label | call to params : | | ErbInjection.rb:5:12:5:24 | ...[...] : | semmle.label | ...[...] : | +| ErbInjection.rb:8:5:8:12 | bad_text : | semmle.label | bad_text : | | ErbInjection.rb:8:16:11:14 | ... % ... : | semmle.label | ... % ... : | | ErbInjection.rb:11:11:11:14 | name : | semmle.label | name : | | ErbInjection.rb:15:24:15:31 | bad_text | semmle.label | bad_text | +| SlimInjection.rb:5:5:5:8 | name : | semmle.label | name : | | SlimInjection.rb:5:12:5:17 | call to params : | semmle.label | call to params : | | SlimInjection.rb:5:12:5:24 | ...[...] : | semmle.label | ...[...] : | -| SlimInjection.rb:8:5:11:14 | ... = ... : | semmle.label | ... = ... : | +| SlimInjection.rb:8:5:8:12 | bad_text : | semmle.label | bad_text : | | SlimInjection.rb:8:16:11:14 | ... % ... : | semmle.label | ... % ... : | | SlimInjection.rb:11:11:11:14 | name : | semmle.label | name : | | SlimInjection.rb:14:25:14:32 | bad_text | semmle.label | bad_text | -| SlimInjection.rb:17:5:20:7 | ... = ... : | semmle.label | ... = ... : | +| SlimInjection.rb:17:5:17:13 | bad2_text : | semmle.label | bad2_text : | | SlimInjection.rb:23:25:23:33 | bad2_text | semmle.label | bad2_text | subpaths #select diff --git a/ruby/ql/test/query-tests/experimental/cwe-022-ZipSlip/ZipSlip.expected b/ruby/ql/test/query-tests/experimental/cwe-022-ZipSlip/ZipSlip.expected index 4b7ace007ed..ca200083a96 100644 --- a/ruby/ql/test/query-tests/experimental/cwe-022-ZipSlip/ZipSlip.expected +++ b/ruby/ql/test/query-tests/experimental/cwe-022-ZipSlip/ZipSlip.expected @@ -1,5 +1,6 @@ edges -| zip_slip.rb:8:15:8:54 | call to new : | zip_slip.rb:9:5:9:11 | tarfile : | +| zip_slip.rb:8:5:8:11 | tarfile : | zip_slip.rb:9:5:9:11 | tarfile : | +| zip_slip.rb:8:15:8:54 | call to new : | zip_slip.rb:8:5:8:11 | tarfile : | | zip_slip.rb:9:5:9:11 | tarfile : | zip_slip.rb:9:22:9:26 | entry : | | zip_slip.rb:9:22:9:26 | entry : | zip_slip.rb:10:19:10:33 | call to full_name | | zip_slip.rb:20:50:20:56 | tarfile : | zip_slip.rb:21:7:21:13 | tarfile : | @@ -10,15 +11,20 @@ edges | zip_slip.rb:56:30:56:37 | zip_file : | zip_slip.rb:57:7:57:14 | zip_file : | | zip_slip.rb:57:7:57:14 | zip_file : | zip_slip.rb:57:25:57:29 | entry : | | zip_slip.rb:57:25:57:29 | entry : | zip_slip.rb:58:19:58:28 | call to name | -| zip_slip.rb:90:12:90:54 | call to open : | zip_slip.rb:91:11:91:14 | gzip : | +| zip_slip.rb:90:5:90:8 | gzip : | zip_slip.rb:91:11:91:14 | gzip : | +| zip_slip.rb:90:12:90:54 | call to open : | zip_slip.rb:90:5:90:8 | gzip : | | zip_slip.rb:91:11:91:14 | gzip : | zip_slip.rb:97:42:97:56 | compressed_file : | | zip_slip.rb:97:42:97:56 | compressed_file : | zip_slip.rb:98:7:98:21 | compressed_file : | | zip_slip.rb:98:7:98:21 | compressed_file : | zip_slip.rb:98:32:98:36 | entry : | -| zip_slip.rb:98:32:98:36 | entry : | zip_slip.rb:100:21:100:30 | entry_path | -| zip_slip.rb:123:12:123:34 | call to new : | zip_slip.rb:124:7:124:8 | gz : | +| zip_slip.rb:98:32:98:36 | entry : | zip_slip.rb:99:9:99:18 | entry_path : | +| zip_slip.rb:99:9:99:18 | entry_path : | zip_slip.rb:100:21:100:30 | entry_path | +| zip_slip.rb:123:7:123:8 | gz : | zip_slip.rb:124:7:124:8 | gz : | +| zip_slip.rb:123:12:123:34 | call to new : | zip_slip.rb:123:7:123:8 | gz : | | zip_slip.rb:124:7:124:8 | gz : | zip_slip.rb:124:19:124:23 | entry : | -| zip_slip.rb:124:19:124:23 | entry : | zip_slip.rb:126:21:126:30 | entry_path | +| zip_slip.rb:124:19:124:23 | entry : | zip_slip.rb:125:9:125:18 | entry_path : | +| zip_slip.rb:125:9:125:18 | entry_path : | zip_slip.rb:126:21:126:30 | entry_path | nodes +| zip_slip.rb:8:5:8:11 | tarfile : | semmle.label | tarfile : | | zip_slip.rb:8:15:8:54 | call to new : | semmle.label | call to new : | | zip_slip.rb:9:5:9:11 | tarfile : | semmle.label | tarfile : | | zip_slip.rb:9:22:9:26 | entry : | semmle.label | entry : | @@ -34,15 +40,19 @@ nodes | zip_slip.rb:57:7:57:14 | zip_file : | semmle.label | zip_file : | | zip_slip.rb:57:25:57:29 | entry : | semmle.label | entry : | | zip_slip.rb:58:19:58:28 | call to name | semmle.label | call to name | +| zip_slip.rb:90:5:90:8 | gzip : | semmle.label | gzip : | | zip_slip.rb:90:12:90:54 | call to open : | semmle.label | call to open : | | zip_slip.rb:91:11:91:14 | gzip : | semmle.label | gzip : | | zip_slip.rb:97:42:97:56 | compressed_file : | semmle.label | compressed_file : | | zip_slip.rb:98:7:98:21 | compressed_file : | semmle.label | compressed_file : | | zip_slip.rb:98:32:98:36 | entry : | semmle.label | entry : | +| zip_slip.rb:99:9:99:18 | entry_path : | semmle.label | entry_path : | | zip_slip.rb:100:21:100:30 | entry_path | semmle.label | entry_path | +| zip_slip.rb:123:7:123:8 | gz : | semmle.label | gz : | | zip_slip.rb:123:12:123:34 | call to new : | semmle.label | call to new : | | zip_slip.rb:124:7:124:8 | gz : | semmle.label | gz : | | zip_slip.rb:124:19:124:23 | entry : | semmle.label | entry : | +| zip_slip.rb:125:9:125:18 | entry_path : | semmle.label | entry_path : | | zip_slip.rb:126:21:126:30 | entry_path | semmle.label | entry_path | subpaths #select diff --git a/ruby/ql/test/query-tests/experimental/manually-check-http-verb/ManuallyCheckHttpVerb.expected b/ruby/ql/test/query-tests/experimental/manually-check-http-verb/ManuallyCheckHttpVerb.expected index b7dff706a1f..b43c529946f 100644 --- a/ruby/ql/test/query-tests/experimental/manually-check-http-verb/ManuallyCheckHttpVerb.expected +++ b/ruby/ql/test/query-tests/experimental/manually-check-http-verb/ManuallyCheckHttpVerb.expected @@ -1,22 +1,32 @@ edges +| ManuallyCheckHttpVerb.rb:11:5:11:10 | method : | ManuallyCheckHttpVerb.rb:12:8:12:22 | ... == ... | | ManuallyCheckHttpVerb.rb:11:14:11:24 | call to env : | ManuallyCheckHttpVerb.rb:11:14:11:42 | ...[...] : | -| ManuallyCheckHttpVerb.rb:11:14:11:42 | ...[...] : | ManuallyCheckHttpVerb.rb:12:8:12:22 | ... == ... | -| ManuallyCheckHttpVerb.rb:19:14:19:35 | call to request_method : | ManuallyCheckHttpVerb.rb:20:8:20:22 | ... == ... | -| ManuallyCheckHttpVerb.rb:27:14:27:27 | call to method : | ManuallyCheckHttpVerb.rb:28:8:28:22 | ... == ... | -| ManuallyCheckHttpVerb.rb:35:14:35:39 | call to raw_request_method : | ManuallyCheckHttpVerb.rb:36:8:36:22 | ... == ... | -| ManuallyCheckHttpVerb.rb:51:16:51:44 | call to request_method_symbol : | ManuallyCheckHttpVerb.rb:52:10:52:23 | ... == ... | +| ManuallyCheckHttpVerb.rb:11:14:11:42 | ...[...] : | ManuallyCheckHttpVerb.rb:11:5:11:10 | method : | +| ManuallyCheckHttpVerb.rb:19:5:19:10 | method : | ManuallyCheckHttpVerb.rb:20:8:20:22 | ... == ... | +| ManuallyCheckHttpVerb.rb:19:14:19:35 | call to request_method : | ManuallyCheckHttpVerb.rb:19:5:19:10 | method : | +| ManuallyCheckHttpVerb.rb:27:5:27:10 | method : | ManuallyCheckHttpVerb.rb:28:8:28:22 | ... == ... | +| ManuallyCheckHttpVerb.rb:27:14:27:27 | call to method : | ManuallyCheckHttpVerb.rb:27:5:27:10 | method : | +| ManuallyCheckHttpVerb.rb:35:5:35:10 | method : | ManuallyCheckHttpVerb.rb:36:8:36:22 | ... == ... | +| ManuallyCheckHttpVerb.rb:35:14:35:39 | call to raw_request_method : | ManuallyCheckHttpVerb.rb:35:5:35:10 | method : | +| ManuallyCheckHttpVerb.rb:51:7:51:12 | method : | ManuallyCheckHttpVerb.rb:52:10:52:23 | ... == ... | +| ManuallyCheckHttpVerb.rb:51:16:51:44 | call to request_method_symbol : | ManuallyCheckHttpVerb.rb:51:7:51:12 | method : | | ManuallyCheckHttpVerb.rb:59:10:59:20 | call to env : | ManuallyCheckHttpVerb.rb:59:10:59:38 | ...[...] | nodes | ManuallyCheckHttpVerb.rb:4:8:4:19 | call to get? | semmle.label | call to get? | +| ManuallyCheckHttpVerb.rb:11:5:11:10 | method : | semmle.label | method : | | ManuallyCheckHttpVerb.rb:11:14:11:24 | call to env : | semmle.label | call to env : | | ManuallyCheckHttpVerb.rb:11:14:11:42 | ...[...] : | semmle.label | ...[...] : | | ManuallyCheckHttpVerb.rb:12:8:12:22 | ... == ... | semmle.label | ... == ... | +| ManuallyCheckHttpVerb.rb:19:5:19:10 | method : | semmle.label | method : | | ManuallyCheckHttpVerb.rb:19:14:19:35 | call to request_method : | semmle.label | call to request_method : | | ManuallyCheckHttpVerb.rb:20:8:20:22 | ... == ... | semmle.label | ... == ... | +| ManuallyCheckHttpVerb.rb:27:5:27:10 | method : | semmle.label | method : | | ManuallyCheckHttpVerb.rb:27:14:27:27 | call to method : | semmle.label | call to method : | | ManuallyCheckHttpVerb.rb:28:8:28:22 | ... == ... | semmle.label | ... == ... | +| ManuallyCheckHttpVerb.rb:35:5:35:10 | method : | semmle.label | method : | | ManuallyCheckHttpVerb.rb:35:14:35:39 | call to raw_request_method : | semmle.label | call to raw_request_method : | | ManuallyCheckHttpVerb.rb:36:8:36:22 | ... == ... | semmle.label | ... == ... | +| ManuallyCheckHttpVerb.rb:51:7:51:12 | method : | semmle.label | method : | | ManuallyCheckHttpVerb.rb:51:16:51:44 | call to request_method_symbol : | semmle.label | call to request_method_symbol : | | ManuallyCheckHttpVerb.rb:52:10:52:23 | ... == ... | semmle.label | ... == ... | | ManuallyCheckHttpVerb.rb:59:10:59:20 | call to env : | semmle.label | call to env : | diff --git a/ruby/ql/test/query-tests/security/cwe-022/PathInjection.expected b/ruby/ql/test/query-tests/security/cwe-022/PathInjection.expected index 5e05271252e..7d5598d1d49 100644 --- a/ruby/ql/test/query-tests/security/cwe-022/PathInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-022/PathInjection.expected @@ -6,48 +6,62 @@ edges | ArchiveApiPathTraversal.rb:15:9:15:14 | call to params : | ArchiveApiPathTraversal.rb:15:9:15:25 | ...[...] : | | ArchiveApiPathTraversal.rb:15:9:15:25 | ...[...] : | ArchiveApiPathTraversal.rb:75:11:75:18 | filename : | | ArchiveApiPathTraversal.rb:49:17:49:27 | destination : | ArchiveApiPathTraversal.rb:52:38:52:48 | destination : | -| ArchiveApiPathTraversal.rb:52:28:52:67 | call to join : | ArchiveApiPathTraversal.rb:59:21:59:36 | destination_file | +| ArchiveApiPathTraversal.rb:52:9:52:24 | destination_file : | ArchiveApiPathTraversal.rb:59:21:59:36 | destination_file | +| ArchiveApiPathTraversal.rb:52:28:52:67 | call to join : | ArchiveApiPathTraversal.rb:52:9:52:24 | destination_file : | | ArchiveApiPathTraversal.rb:52:38:52:48 | destination : | ArchiveApiPathTraversal.rb:52:28:52:67 | call to join : | | ArchiveApiPathTraversal.rb:67:13:67:16 | file : | ArchiveApiPathTraversal.rb:68:20:68:23 | file | | ArchiveApiPathTraversal.rb:75:11:75:18 | filename : | ArchiveApiPathTraversal.rb:76:19:76:26 | filename | +| tainted_path.rb:4:5:4:8 | path : | tainted_path.rb:5:26:5:29 | path | | tainted_path.rb:4:12:4:17 | call to params : | tainted_path.rb:4:12:4:24 | ...[...] : | -| tainted_path.rb:4:12:4:24 | ...[...] : | tainted_path.rb:5:26:5:29 | path | -| tainted_path.rb:10:12:10:43 | call to absolute_path : | tainted_path.rb:11:26:11:29 | path | +| tainted_path.rb:4:12:4:24 | ...[...] : | tainted_path.rb:4:5:4:8 | path : | +| tainted_path.rb:10:5:10:8 | path : | tainted_path.rb:11:26:11:29 | path | +| tainted_path.rb:10:12:10:43 | call to absolute_path : | tainted_path.rb:10:5:10:8 | path : | | tainted_path.rb:10:31:10:36 | call to params : | tainted_path.rb:10:31:10:43 | ...[...] : | | tainted_path.rb:10:31:10:43 | ...[...] : | tainted_path.rb:10:12:10:43 | call to absolute_path : | -| tainted_path.rb:16:15:16:41 | call to dirname : | tainted_path.rb:17:26:17:29 | path | +| tainted_path.rb:16:5:16:8 | path : | tainted_path.rb:17:26:17:29 | path | +| tainted_path.rb:16:15:16:41 | call to dirname : | tainted_path.rb:16:5:16:8 | path : | | tainted_path.rb:16:28:16:33 | call to params : | tainted_path.rb:16:28:16:40 | ...[...] : | | tainted_path.rb:16:28:16:40 | ...[...] : | tainted_path.rb:16:15:16:41 | call to dirname : | -| tainted_path.rb:22:12:22:41 | call to expand_path : | tainted_path.rb:23:26:23:29 | path | +| tainted_path.rb:22:5:22:8 | path : | tainted_path.rb:23:26:23:29 | path | +| tainted_path.rb:22:12:22:41 | call to expand_path : | tainted_path.rb:22:5:22:8 | path : | | tainted_path.rb:22:29:22:34 | call to params : | tainted_path.rb:22:29:22:41 | ...[...] : | | tainted_path.rb:22:29:22:41 | ...[...] : | tainted_path.rb:22:12:22:41 | call to expand_path : | -| tainted_path.rb:28:12:28:34 | call to path : | tainted_path.rb:29:26:29:29 | path | +| tainted_path.rb:28:5:28:8 | path : | tainted_path.rb:29:26:29:29 | path | +| tainted_path.rb:28:12:28:34 | call to path : | tainted_path.rb:28:5:28:8 | path : | | tainted_path.rb:28:22:28:27 | call to params : | tainted_path.rb:28:22:28:34 | ...[...] : | | tainted_path.rb:28:22:28:34 | ...[...] : | tainted_path.rb:28:12:28:34 | call to path : | -| tainted_path.rb:34:12:34:41 | call to realdirpath : | tainted_path.rb:35:26:35:29 | path | +| tainted_path.rb:34:5:34:8 | path : | tainted_path.rb:35:26:35:29 | path | +| tainted_path.rb:34:12:34:41 | call to realdirpath : | tainted_path.rb:34:5:34:8 | path : | | tainted_path.rb:34:29:34:34 | call to params : | tainted_path.rb:34:29:34:41 | ...[...] : | | tainted_path.rb:34:29:34:41 | ...[...] : | tainted_path.rb:34:12:34:41 | call to realdirpath : | -| tainted_path.rb:40:12:40:38 | call to realpath : | tainted_path.rb:41:26:41:29 | path | +| tainted_path.rb:40:5:40:8 | path : | tainted_path.rb:41:26:41:29 | path | +| tainted_path.rb:40:12:40:38 | call to realpath : | tainted_path.rb:40:5:40:8 | path : | | tainted_path.rb:40:26:40:31 | call to params : | tainted_path.rb:40:26:40:38 | ...[...] : | | tainted_path.rb:40:26:40:38 | ...[...] : | tainted_path.rb:40:12:40:38 | call to realpath : | -| tainted_path.rb:47:12:47:63 | call to join : | tainted_path.rb:48:26:48:29 | path | +| tainted_path.rb:47:5:47:8 | path : | tainted_path.rb:48:26:48:29 | path | +| tainted_path.rb:47:12:47:63 | call to join : | tainted_path.rb:47:5:47:8 | path : | | tainted_path.rb:47:43:47:48 | call to params : | tainted_path.rb:47:43:47:55 | ...[...] : | | tainted_path.rb:47:43:47:55 | ...[...] : | tainted_path.rb:47:12:47:63 | call to join : | -| tainted_path.rb:59:12:59:53 | call to new : | tainted_path.rb:60:26:60:29 | path | +| tainted_path.rb:59:5:59:8 | path : | tainted_path.rb:60:26:60:29 | path | +| tainted_path.rb:59:12:59:53 | call to new : | tainted_path.rb:59:5:59:8 | path : | | tainted_path.rb:59:40:59:45 | call to params : | tainted_path.rb:59:40:59:52 | ...[...] : | | tainted_path.rb:59:40:59:52 | ...[...] : | tainted_path.rb:59:12:59:53 | call to new : | -| tainted_path.rb:71:12:71:53 | call to new : | tainted_path.rb:72:15:72:18 | path | +| tainted_path.rb:71:5:71:8 | path : | tainted_path.rb:72:15:72:18 | path | +| tainted_path.rb:71:12:71:53 | call to new : | tainted_path.rb:71:5:71:8 | path : | | tainted_path.rb:71:40:71:45 | call to params : | tainted_path.rb:71:40:71:52 | ...[...] : | | tainted_path.rb:71:40:71:52 | ...[...] : | tainted_path.rb:71:12:71:53 | call to new : | -| tainted_path.rb:77:12:77:53 | call to new : | tainted_path.rb:78:19:78:22 | path | -| tainted_path.rb:77:12:77:53 | call to new : | tainted_path.rb:79:14:79:17 | path | +| tainted_path.rb:77:5:77:8 | path : | tainted_path.rb:78:19:78:22 | path | +| tainted_path.rb:77:5:77:8 | path : | tainted_path.rb:79:14:79:17 | path | +| tainted_path.rb:77:12:77:53 | call to new : | tainted_path.rb:77:5:77:8 | path : | | tainted_path.rb:77:40:77:45 | call to params : | tainted_path.rb:77:40:77:52 | ...[...] : | | tainted_path.rb:77:40:77:52 | ...[...] : | tainted_path.rb:77:12:77:53 | call to new : | -| tainted_path.rb:84:12:84:53 | call to new : | tainted_path.rb:85:10:85:13 | path | -| tainted_path.rb:84:12:84:53 | call to new : | tainted_path.rb:86:25:86:28 | path | +| tainted_path.rb:84:5:84:8 | path : | tainted_path.rb:85:10:85:13 | path | +| tainted_path.rb:84:5:84:8 | path : | tainted_path.rb:86:25:86:28 | path | +| tainted_path.rb:84:12:84:53 | call to new : | tainted_path.rb:84:5:84:8 | path : | | tainted_path.rb:84:40:84:45 | call to params : | tainted_path.rb:84:40:84:52 | ...[...] : | | tainted_path.rb:84:40:84:52 | ...[...] : | tainted_path.rb:84:12:84:53 | call to new : | -| tainted_path.rb:90:12:90:53 | call to new : | tainted_path.rb:92:11:92:14 | path | +| tainted_path.rb:90:5:90:8 | path : | tainted_path.rb:92:11:92:14 | path | +| tainted_path.rb:90:12:90:53 | call to new : | tainted_path.rb:90:5:90:8 | path : | | tainted_path.rb:90:40:90:45 | call to params : | tainted_path.rb:90:40:90:52 | ...[...] : | | tainted_path.rb:90:40:90:52 | ...[...] : | tainted_path.rb:90:12:90:53 | call to new : | nodes @@ -58,6 +72,7 @@ nodes | ArchiveApiPathTraversal.rb:15:9:15:14 | call to params : | semmle.label | call to params : | | ArchiveApiPathTraversal.rb:15:9:15:25 | ...[...] : | semmle.label | ...[...] : | | ArchiveApiPathTraversal.rb:49:17:49:27 | destination : | semmle.label | destination : | +| ArchiveApiPathTraversal.rb:52:9:52:24 | destination_file : | semmle.label | destination_file : | | ArchiveApiPathTraversal.rb:52:28:52:67 | call to join : | semmle.label | call to join : | | ArchiveApiPathTraversal.rb:52:38:52:48 | destination : | semmle.label | destination : | | ArchiveApiPathTraversal.rb:59:21:59:36 | destination_file | semmle.label | destination_file | @@ -65,55 +80,68 @@ nodes | ArchiveApiPathTraversal.rb:68:20:68:23 | file | semmle.label | file | | ArchiveApiPathTraversal.rb:75:11:75:18 | filename : | semmle.label | filename : | | ArchiveApiPathTraversal.rb:76:19:76:26 | filename | semmle.label | filename | +| tainted_path.rb:4:5:4:8 | path : | semmle.label | path : | | tainted_path.rb:4:12:4:17 | call to params : | semmle.label | call to params : | | tainted_path.rb:4:12:4:24 | ...[...] : | semmle.label | ...[...] : | | tainted_path.rb:5:26:5:29 | path | semmle.label | path | +| tainted_path.rb:10:5:10:8 | path : | semmle.label | path : | | tainted_path.rb:10:12:10:43 | call to absolute_path : | semmle.label | call to absolute_path : | | tainted_path.rb:10:31:10:36 | call to params : | semmle.label | call to params : | | tainted_path.rb:10:31:10:43 | ...[...] : | semmle.label | ...[...] : | | tainted_path.rb:11:26:11:29 | path | semmle.label | path | +| tainted_path.rb:16:5:16:8 | path : | semmle.label | path : | | tainted_path.rb:16:15:16:41 | call to dirname : | semmle.label | call to dirname : | | tainted_path.rb:16:28:16:33 | call to params : | semmle.label | call to params : | | tainted_path.rb:16:28:16:40 | ...[...] : | semmle.label | ...[...] : | | tainted_path.rb:17:26:17:29 | path | semmle.label | path | +| tainted_path.rb:22:5:22:8 | path : | semmle.label | path : | | tainted_path.rb:22:12:22:41 | call to expand_path : | semmle.label | call to expand_path : | | tainted_path.rb:22:29:22:34 | call to params : | semmle.label | call to params : | | tainted_path.rb:22:29:22:41 | ...[...] : | semmle.label | ...[...] : | | tainted_path.rb:23:26:23:29 | path | semmle.label | path | +| tainted_path.rb:28:5:28:8 | path : | semmle.label | path : | | tainted_path.rb:28:12:28:34 | call to path : | semmle.label | call to path : | | tainted_path.rb:28:22:28:27 | call to params : | semmle.label | call to params : | | tainted_path.rb:28:22:28:34 | ...[...] : | semmle.label | ...[...] : | | tainted_path.rb:29:26:29:29 | path | semmle.label | path | +| tainted_path.rb:34:5:34:8 | path : | semmle.label | path : | | tainted_path.rb:34:12:34:41 | call to realdirpath : | semmle.label | call to realdirpath : | | tainted_path.rb:34:29:34:34 | call to params : | semmle.label | call to params : | | tainted_path.rb:34:29:34:41 | ...[...] : | semmle.label | ...[...] : | | tainted_path.rb:35:26:35:29 | path | semmle.label | path | +| tainted_path.rb:40:5:40:8 | path : | semmle.label | path : | | tainted_path.rb:40:12:40:38 | call to realpath : | semmle.label | call to realpath : | | tainted_path.rb:40:26:40:31 | call to params : | semmle.label | call to params : | | tainted_path.rb:40:26:40:38 | ...[...] : | semmle.label | ...[...] : | | tainted_path.rb:41:26:41:29 | path | semmle.label | path | +| tainted_path.rb:47:5:47:8 | path : | semmle.label | path : | | tainted_path.rb:47:12:47:63 | call to join : | semmle.label | call to join : | | tainted_path.rb:47:43:47:48 | call to params : | semmle.label | call to params : | | tainted_path.rb:47:43:47:55 | ...[...] : | semmle.label | ...[...] : | | tainted_path.rb:48:26:48:29 | path | semmle.label | path | +| tainted_path.rb:59:5:59:8 | path : | semmle.label | path : | | tainted_path.rb:59:12:59:53 | call to new : | semmle.label | call to new : | | tainted_path.rb:59:40:59:45 | call to params : | semmle.label | call to params : | | tainted_path.rb:59:40:59:52 | ...[...] : | semmle.label | ...[...] : | | tainted_path.rb:60:26:60:29 | path | semmle.label | path | +| tainted_path.rb:71:5:71:8 | path : | semmle.label | path : | | tainted_path.rb:71:12:71:53 | call to new : | semmle.label | call to new : | | tainted_path.rb:71:40:71:45 | call to params : | semmle.label | call to params : | | tainted_path.rb:71:40:71:52 | ...[...] : | semmle.label | ...[...] : | | tainted_path.rb:72:15:72:18 | path | semmle.label | path | +| tainted_path.rb:77:5:77:8 | path : | semmle.label | path : | | tainted_path.rb:77:12:77:53 | call to new : | semmle.label | call to new : | | tainted_path.rb:77:40:77:45 | call to params : | semmle.label | call to params : | | tainted_path.rb:77:40:77:52 | ...[...] : | semmle.label | ...[...] : | | tainted_path.rb:78:19:78:22 | path | semmle.label | path | | tainted_path.rb:79:14:79:17 | path | semmle.label | path | +| tainted_path.rb:84:5:84:8 | path : | semmle.label | path : | | tainted_path.rb:84:12:84:53 | call to new : | semmle.label | call to new : | | tainted_path.rb:84:40:84:45 | call to params : | semmle.label | call to params : | | tainted_path.rb:84:40:84:52 | ...[...] : | semmle.label | ...[...] : | | tainted_path.rb:85:10:85:13 | path | semmle.label | path | | tainted_path.rb:86:25:86:28 | path | semmle.label | path | +| tainted_path.rb:90:5:90:8 | path : | semmle.label | path : | | tainted_path.rb:90:12:90:53 | call to new : | semmle.label | call to new : | | tainted_path.rb:90:40:90:45 | call to params : | semmle.label | call to params : | | tainted_path.rb:90:40:90:52 | ...[...] : | semmle.label | ...[...] : | diff --git a/ruby/ql/test/query-tests/security/cwe-078/CommandInjection/CommandInjection.expected b/ruby/ql/test/query-tests/security/cwe-078/CommandInjection/CommandInjection.expected index dda603763e2..de8b527312e 100644 --- a/ruby/ql/test/query-tests/security/cwe-078/CommandInjection/CommandInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-078/CommandInjection/CommandInjection.expected @@ -1,25 +1,30 @@ edges +| CommandInjection.rb:6:9:6:11 | cmd : | CommandInjection.rb:7:10:7:15 | #{...} | +| CommandInjection.rb:6:9:6:11 | cmd : | CommandInjection.rb:8:16:8:18 | cmd | +| CommandInjection.rb:6:9:6:11 | cmd : | CommandInjection.rb:10:14:10:16 | cmd | +| CommandInjection.rb:6:9:6:11 | cmd : | CommandInjection.rb:11:17:11:22 | #{...} | +| CommandInjection.rb:6:9:6:11 | cmd : | CommandInjection.rb:13:9:13:14 | #{...} | +| CommandInjection.rb:6:9:6:11 | cmd : | CommandInjection.rb:29:19:29:24 | #{...} | +| CommandInjection.rb:6:9:6:11 | cmd : | CommandInjection.rb:33:24:33:36 | "echo #{...}" | +| CommandInjection.rb:6:9:6:11 | cmd : | CommandInjection.rb:34:39:34:51 | "grep #{...}" | | CommandInjection.rb:6:15:6:20 | call to params : | CommandInjection.rb:6:15:6:26 | ...[...] : | -| CommandInjection.rb:6:15:6:26 | ...[...] : | CommandInjection.rb:7:10:7:15 | #{...} | -| CommandInjection.rb:6:15:6:26 | ...[...] : | CommandInjection.rb:8:16:8:18 | cmd | -| CommandInjection.rb:6:15:6:26 | ...[...] : | CommandInjection.rb:10:14:10:16 | cmd | -| CommandInjection.rb:6:15:6:26 | ...[...] : | CommandInjection.rb:11:17:11:22 | #{...} | -| CommandInjection.rb:6:15:6:26 | ...[...] : | CommandInjection.rb:13:9:13:14 | #{...} | -| CommandInjection.rb:6:15:6:26 | ...[...] : | CommandInjection.rb:29:19:29:24 | #{...} | -| CommandInjection.rb:6:15:6:26 | ...[...] : | CommandInjection.rb:33:24:33:36 | "echo #{...}" | -| CommandInjection.rb:6:15:6:26 | ...[...] : | CommandInjection.rb:34:39:34:51 | "grep #{...}" | +| CommandInjection.rb:6:15:6:26 | ...[...] : | CommandInjection.rb:6:9:6:11 | cmd : | +| CommandInjection.rb:46:9:46:11 | cmd : | CommandInjection.rb:50:24:50:36 | "echo #{...}" | | CommandInjection.rb:46:15:46:20 | call to params : | CommandInjection.rb:46:15:46:26 | ...[...] : | -| CommandInjection.rb:46:15:46:26 | ...[...] : | CommandInjection.rb:50:24:50:36 | "echo #{...}" | +| CommandInjection.rb:46:15:46:26 | ...[...] : | CommandInjection.rb:46:9:46:11 | cmd : | +| CommandInjection.rb:54:7:54:9 | cmd : | CommandInjection.rb:59:14:59:16 | cmd | | CommandInjection.rb:54:13:54:18 | call to params : | CommandInjection.rb:54:13:54:24 | ...[...] : | -| CommandInjection.rb:54:13:54:24 | ...[...] : | CommandInjection.rb:59:14:59:16 | cmd | +| CommandInjection.rb:54:13:54:24 | ...[...] : | CommandInjection.rb:54:7:54:9 | cmd : | | CommandInjection.rb:73:18:73:23 | number : | CommandInjection.rb:74:14:74:29 | "echo #{...}" | | CommandInjection.rb:81:23:81:33 | blah_number : | CommandInjection.rb:82:14:82:34 | "echo #{...}" | | CommandInjection.rb:90:20:90:25 | **args : | CommandInjection.rb:91:22:91:25 | args : | | CommandInjection.rb:91:22:91:25 | args : | CommandInjection.rb:91:22:91:37 | ...[...] : | | CommandInjection.rb:91:22:91:37 | ...[...] : | CommandInjection.rb:91:14:91:39 | "echo #{...}" | +| CommandInjection.rb:103:9:103:12 | file : | CommandInjection.rb:104:16:104:28 | "cat #{...}" | | CommandInjection.rb:103:16:103:21 | call to params : | CommandInjection.rb:103:16:103:28 | ...[...] : | -| CommandInjection.rb:103:16:103:28 | ...[...] : | CommandInjection.rb:104:16:104:28 | "cat #{...}" | +| CommandInjection.rb:103:16:103:28 | ...[...] : | CommandInjection.rb:103:9:103:12 | file : | nodes +| CommandInjection.rb:6:9:6:11 | cmd : | semmle.label | cmd : | | CommandInjection.rb:6:15:6:20 | call to params : | semmle.label | call to params : | | CommandInjection.rb:6:15:6:26 | ...[...] : | semmle.label | ...[...] : | | CommandInjection.rb:7:10:7:15 | #{...} | semmle.label | #{...} | @@ -30,9 +35,11 @@ nodes | CommandInjection.rb:29:19:29:24 | #{...} | semmle.label | #{...} | | CommandInjection.rb:33:24:33:36 | "echo #{...}" | semmle.label | "echo #{...}" | | CommandInjection.rb:34:39:34:51 | "grep #{...}" | semmle.label | "grep #{...}" | +| CommandInjection.rb:46:9:46:11 | cmd : | semmle.label | cmd : | | CommandInjection.rb:46:15:46:20 | call to params : | semmle.label | call to params : | | CommandInjection.rb:46:15:46:26 | ...[...] : | semmle.label | ...[...] : | | CommandInjection.rb:50:24:50:36 | "echo #{...}" | semmle.label | "echo #{...}" | +| CommandInjection.rb:54:7:54:9 | cmd : | semmle.label | cmd : | | CommandInjection.rb:54:13:54:18 | call to params : | semmle.label | call to params : | | CommandInjection.rb:54:13:54:24 | ...[...] : | semmle.label | ...[...] : | | CommandInjection.rb:59:14:59:16 | cmd | semmle.label | cmd | @@ -44,6 +51,7 @@ nodes | CommandInjection.rb:91:14:91:39 | "echo #{...}" | semmle.label | "echo #{...}" | | CommandInjection.rb:91:22:91:25 | args : | semmle.label | args : | | CommandInjection.rb:91:22:91:37 | ...[...] : | semmle.label | ...[...] : | +| CommandInjection.rb:103:9:103:12 | file : | semmle.label | file : | | CommandInjection.rb:103:16:103:21 | call to params : | semmle.label | call to params : | | CommandInjection.rb:103:16:103:28 | ...[...] : | semmle.label | ...[...] : | | CommandInjection.rb:104:16:104:28 | "cat #{...}" | semmle.label | "cat #{...}" | diff --git a/ruby/ql/test/query-tests/security/cwe-078/KernelOpen/KernelOpen.expected b/ruby/ql/test/query-tests/security/cwe-078/KernelOpen/KernelOpen.expected index 1a7088fcbe8..b64fd8c416f 100644 --- a/ruby/ql/test/query-tests/security/cwe-078/KernelOpen/KernelOpen.expected +++ b/ruby/ql/test/query-tests/security/cwe-078/KernelOpen/KernelOpen.expected @@ -1,17 +1,19 @@ edges +| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:4:10:4:13 | file | +| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:5:13:5:16 | file | +| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:6:14:6:17 | file | +| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:7:16:7:19 | file | +| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:8:17:8:20 | file | +| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:9:16:9:19 | file | +| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:10:18:10:21 | file | +| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:11:14:11:17 | file | +| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:13:23:13:26 | file : | +| KernelOpen.rb:3:5:3:8 | file : | KernelOpen.rb:26:10:26:13 | file | | KernelOpen.rb:3:12:3:17 | call to params : | KernelOpen.rb:3:12:3:24 | ...[...] : | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:4:10:4:13 | file | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:5:13:5:16 | file | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:6:14:6:17 | file | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:7:16:7:19 | file | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:8:17:8:20 | file | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:9:16:9:19 | file | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:10:18:10:21 | file | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:11:14:11:17 | file | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:13:23:13:26 | file : | -| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:26:10:26:13 | file | +| KernelOpen.rb:3:12:3:24 | ...[...] : | KernelOpen.rb:3:5:3:8 | file : | | KernelOpen.rb:13:23:13:26 | file : | KernelOpen.rb:13:13:13:31 | call to join | nodes +| KernelOpen.rb:3:5:3:8 | file : | semmle.label | file : | | KernelOpen.rb:3:12:3:17 | call to params : | semmle.label | call to params : | | KernelOpen.rb:3:12:3:24 | ...[...] : | semmle.label | ...[...] : | | KernelOpen.rb:4:10:4:13 | file | semmle.label | file | diff --git a/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected b/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected index 55e0ea7f42b..40062a572a1 100644 --- a/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected +++ b/ruby/ql/test/query-tests/security/cwe-079/ReflectedXSS.expected @@ -8,9 +8,10 @@ edges | app/controllers/foo/bars_controller.rb:13:20:13:37 | ...[...] : | app/views/foo/bars/show.html.erb:50:5:50:18 | call to user_name_memo | | app/controllers/foo/bars_controller.rb:17:21:17:26 | call to params : | app/controllers/foo/bars_controller.rb:17:21:17:36 | ...[...] : | | app/controllers/foo/bars_controller.rb:17:21:17:36 | ...[...] : | app/views/foo/bars/show.html.erb:2:18:2:30 | @user_website | +| app/controllers/foo/bars_controller.rb:18:5:18:6 | dt : | app/controllers/foo/bars_controller.rb:19:22:19:23 | dt : | +| app/controllers/foo/bars_controller.rb:18:5:18:6 | dt : | app/controllers/foo/bars_controller.rb:26:53:26:54 | dt : | | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params : | app/controllers/foo/bars_controller.rb:18:10:18:22 | ...[...] : | -| app/controllers/foo/bars_controller.rb:18:10:18:22 | ...[...] : | app/controllers/foo/bars_controller.rb:19:22:19:23 | dt : | -| app/controllers/foo/bars_controller.rb:18:10:18:22 | ...[...] : | app/controllers/foo/bars_controller.rb:26:53:26:54 | dt : | +| app/controllers/foo/bars_controller.rb:18:10:18:22 | ...[...] : | app/controllers/foo/bars_controller.rb:18:5:18:6 | dt : | | app/controllers/foo/bars_controller.rb:19:22:19:23 | dt : | app/views/foo/bars/show.html.erb:40:3:40:16 | @instance_text | | app/controllers/foo/bars_controller.rb:24:39:24:44 | call to params : | app/controllers/foo/bars_controller.rb:24:39:24:59 | ...[...] : | | app/controllers/foo/bars_controller.rb:24:39:24:59 | ...[...] : | app/controllers/foo/bars_controller.rb:24:39:24:59 | ... = ... | @@ -20,8 +21,9 @@ edges | app/controllers/foo/bars_controller.rb:26:53:26:54 | dt : | app/views/foo/bars/show.html.erb:17:15:17:27 | call to local_assigns [element :display_text] : | | app/controllers/foo/bars_controller.rb:26:53:26:54 | dt : | app/views/foo/bars/show.html.erb:35:3:35:14 | call to display_text | | app/controllers/foo/bars_controller.rb:26:53:26:54 | dt : | app/views/foo/bars/show.html.erb:43:76:43:87 | call to display_text : | +| app/controllers/foo/bars_controller.rb:30:5:30:7 | str : | app/controllers/foo/bars_controller.rb:31:5:31:7 | str | | app/controllers/foo/bars_controller.rb:30:11:30:16 | call to params : | app/controllers/foo/bars_controller.rb:30:11:30:28 | ...[...] : | -| app/controllers/foo/bars_controller.rb:30:11:30:28 | ...[...] : | app/controllers/foo/bars_controller.rb:31:5:31:7 | str | +| app/controllers/foo/bars_controller.rb:30:11:30:28 | ...[...] : | app/controllers/foo/bars_controller.rb:30:5:30:7 | str : | | app/views/foo/bars/_widget.html.erb:8:9:8:21 | call to local_assigns [element :display_text] : | app/views/foo/bars/_widget.html.erb:8:9:8:36 | ...[...] | | app/views/foo/bars/show.html.erb:8:9:8:21 | call to local_assigns [element :display_text] : | app/views/foo/bars/show.html.erb:8:9:8:36 | ...[...] | | app/views/foo/bars/show.html.erb:12:9:12:21 | call to local_assigns [element :display_text] : | app/views/foo/bars/show.html.erb:12:9:12:26 | ...[...] | @@ -41,6 +43,7 @@ nodes | app/controllers/foo/bars_controller.rb:13:20:13:37 | ...[...] : | semmle.label | ...[...] : | | app/controllers/foo/bars_controller.rb:17:21:17:26 | call to params : | semmle.label | call to params : | | app/controllers/foo/bars_controller.rb:17:21:17:36 | ...[...] : | semmle.label | ...[...] : | +| app/controllers/foo/bars_controller.rb:18:5:18:6 | dt : | semmle.label | dt : | | app/controllers/foo/bars_controller.rb:18:10:18:15 | call to params : | semmle.label | call to params : | | app/controllers/foo/bars_controller.rb:18:10:18:22 | ...[...] : | semmle.label | ...[...] : | | app/controllers/foo/bars_controller.rb:19:22:19:23 | dt : | semmle.label | dt : | @@ -48,6 +51,7 @@ nodes | app/controllers/foo/bars_controller.rb:24:39:24:59 | ... = ... | semmle.label | ... = ... | | app/controllers/foo/bars_controller.rb:24:39:24:59 | ...[...] : | semmle.label | ...[...] : | | app/controllers/foo/bars_controller.rb:26:53:26:54 | dt : | semmle.label | dt : | +| app/controllers/foo/bars_controller.rb:30:5:30:7 | str : | semmle.label | str : | | app/controllers/foo/bars_controller.rb:30:11:30:16 | call to params : | semmle.label | call to params : | | app/controllers/foo/bars_controller.rb:30:11:30:28 | ...[...] : | semmle.label | ...[...] : | | app/controllers/foo/bars_controller.rb:31:5:31:7 | str | semmle.label | str | diff --git a/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected b/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected index 3edc843ea2f..01a48d43371 100644 --- a/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected +++ b/ruby/ql/test/query-tests/security/cwe-079/StoredXSS.expected @@ -1,6 +1,7 @@ edges -| app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read : | app/controllers/foo/stores_controller.rb:9:22:9:23 | dt : | -| app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read : | app/controllers/foo/stores_controller.rb:13:55:13:56 | dt : | +| app/controllers/foo/stores_controller.rb:8:5:8:6 | dt : | app/controllers/foo/stores_controller.rb:9:22:9:23 | dt : | +| app/controllers/foo/stores_controller.rb:8:5:8:6 | dt : | app/controllers/foo/stores_controller.rb:13:55:13:56 | dt : | +| app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read : | app/controllers/foo/stores_controller.rb:8:5:8:6 | dt : | | app/controllers/foo/stores_controller.rb:9:22:9:23 | dt : | app/views/foo/stores/show.html.erb:37:3:37:16 | @instance_text | | app/controllers/foo/stores_controller.rb:12:28:12:48 | call to raw_name : | app/views/foo/stores/show.html.erb:82:5:82:24 | @other_user_raw_name | | app/controllers/foo/stores_controller.rb:13:55:13:56 | dt : | app/views/foo/stores/show.html.erb:2:9:2:20 | call to display_text | @@ -18,6 +19,7 @@ edges | app/views/foo/stores/show.html.erb:40:76:40:87 | call to display_text : | app/views/foo/stores/show.html.erb:40:64:40:87 | ... + ... : | | app/views/foo/stores/show.html.erb:86:17:86:28 | call to handle : | app/views/foo/stores/show.html.erb:86:3:86:29 | call to sprintf | nodes +| app/controllers/foo/stores_controller.rb:8:5:8:6 | dt : | semmle.label | dt : | | app/controllers/foo/stores_controller.rb:8:10:8:29 | call to read : | semmle.label | call to read : | | app/controllers/foo/stores_controller.rb:9:22:9:23 | dt : | semmle.label | dt : | | app/controllers/foo/stores_controller.rb:12:28:12:48 | call to raw_name : | semmle.label | call to raw_name : | diff --git a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected index cac3c53820c..a41722107d6 100644 --- a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected @@ -28,16 +28,21 @@ edges | ActiveRecordInjection.rb:92:21:92:26 | call to params : | ActiveRecordInjection.rb:92:21:92:35 | ...[...] | | ActiveRecordInjection.rb:94:18:94:23 | call to params : | ActiveRecordInjection.rb:94:18:94:35 | ...[...] | | ActiveRecordInjection.rb:96:23:96:28 | call to params : | ActiveRecordInjection.rb:96:23:96:47 | ...[...] | -| ActiveRecordInjection.rb:102:10:102:15 | call to params : | ActiveRecordInjection.rb:103:11:103:12 | ps : | +| ActiveRecordInjection.rb:102:5:102:6 | ps : | ActiveRecordInjection.rb:103:11:103:12 | ps : | +| ActiveRecordInjection.rb:102:10:102:15 | call to params : | ActiveRecordInjection.rb:102:5:102:6 | ps : | +| ActiveRecordInjection.rb:103:5:103:7 | uid : | ActiveRecordInjection.rb:104:5:104:9 | uidEq : | | ActiveRecordInjection.rb:103:11:103:12 | ps : | ActiveRecordInjection.rb:103:11:103:17 | ...[...] : | -| ActiveRecordInjection.rb:103:11:103:17 | ...[...] : | ActiveRecordInjection.rb:108:20:108:32 | ... + ... | +| ActiveRecordInjection.rb:103:11:103:17 | ...[...] : | ActiveRecordInjection.rb:103:5:103:7 | uid : | +| ActiveRecordInjection.rb:104:5:104:9 | uidEq : | ActiveRecordInjection.rb:108:20:108:32 | ... + ... | | ActiveRecordInjection.rb:141:21:141:26 | call to params : | ActiveRecordInjection.rb:141:21:141:44 | ...[...] : | | ActiveRecordInjection.rb:141:21:141:44 | ...[...] : | ActiveRecordInjection.rb:20:22:20:30 | condition : | | ActiveRecordInjection.rb:155:59:155:64 | call to params : | ActiveRecordInjection.rb:155:59:155:74 | ...[...] : | | ActiveRecordInjection.rb:155:59:155:74 | ...[...] : | ActiveRecordInjection.rb:155:27:155:76 | "this is an unsafe annotation:..." | -| ActiveRecordInjection.rb:166:17:166:32 | call to permitted_params : | ActiveRecordInjection.rb:167:47:167:55 | my_params : | +| ActiveRecordInjection.rb:166:5:166:13 | my_params : | ActiveRecordInjection.rb:167:47:167:55 | my_params : | +| ActiveRecordInjection.rb:166:17:166:32 | call to permitted_params : | ActiveRecordInjection.rb:166:5:166:13 | my_params : | +| ActiveRecordInjection.rb:167:5:167:9 | query : | ActiveRecordInjection.rb:168:37:168:41 | query | | ActiveRecordInjection.rb:167:47:167:55 | my_params : | ActiveRecordInjection.rb:167:47:167:65 | ...[...] : | -| ActiveRecordInjection.rb:167:47:167:65 | ...[...] : | ActiveRecordInjection.rb:168:37:168:41 | query | +| ActiveRecordInjection.rb:167:47:167:65 | ...[...] : | ActiveRecordInjection.rb:167:5:167:9 | query : | | ActiveRecordInjection.rb:173:5:173:10 | call to params : | ActiveRecordInjection.rb:173:5:173:27 | call to require : | | ActiveRecordInjection.rb:173:5:173:27 | call to require : | ActiveRecordInjection.rb:173:5:173:59 | call to permit : | | ActiveRecordInjection.rb:173:5:173:59 | call to permit : | ActiveRecordInjection.rb:166:17:166:32 | call to permitted_params : | @@ -47,8 +52,9 @@ edges | ActiveRecordInjection.rb:177:77:177:102 | ...[...] : | ActiveRecordInjection.rb:177:43:177:104 | "SELECT * FROM users WHERE id ..." | | ActiveRecordInjection.rb:178:69:178:84 | call to permitted_params : | ActiveRecordInjection.rb:178:69:178:94 | ...[...] : | | ActiveRecordInjection.rb:178:69:178:94 | ...[...] : | ActiveRecordInjection.rb:178:35:178:96 | "SELECT * FROM users WHERE id ..." | +| ArelInjection.rb:4:5:4:8 | name : | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | | ArelInjection.rb:4:12:4:17 | call to params : | ArelInjection.rb:4:12:4:29 | ...[...] : | -| ArelInjection.rb:4:12:4:29 | ...[...] : | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | +| ArelInjection.rb:4:12:4:29 | ...[...] : | ArelInjection.rb:4:5:4:8 | name : | nodes | ActiveRecordInjection.rb:8:25:8:28 | name : | semmle.label | name : | | ActiveRecordInjection.rb:8:31:8:34 | pass : | semmle.label | pass : | @@ -96,16 +102,21 @@ nodes | ActiveRecordInjection.rb:94:18:94:35 | ...[...] | semmle.label | ...[...] | | ActiveRecordInjection.rb:96:23:96:28 | call to params : | semmle.label | call to params : | | ActiveRecordInjection.rb:96:23:96:47 | ...[...] | semmle.label | ...[...] | +| ActiveRecordInjection.rb:102:5:102:6 | ps : | semmle.label | ps : | | ActiveRecordInjection.rb:102:10:102:15 | call to params : | semmle.label | call to params : | +| ActiveRecordInjection.rb:103:5:103:7 | uid : | semmle.label | uid : | | ActiveRecordInjection.rb:103:11:103:12 | ps : | semmle.label | ps : | | ActiveRecordInjection.rb:103:11:103:17 | ...[...] : | semmle.label | ...[...] : | +| ActiveRecordInjection.rb:104:5:104:9 | uidEq : | semmle.label | uidEq : | | ActiveRecordInjection.rb:108:20:108:32 | ... + ... | semmle.label | ... + ... | | ActiveRecordInjection.rb:141:21:141:26 | call to params : | semmle.label | call to params : | | ActiveRecordInjection.rb:141:21:141:44 | ...[...] : | semmle.label | ...[...] : | | ActiveRecordInjection.rb:155:27:155:76 | "this is an unsafe annotation:..." | semmle.label | "this is an unsafe annotation:..." | | ActiveRecordInjection.rb:155:59:155:64 | call to params : | semmle.label | call to params : | | ActiveRecordInjection.rb:155:59:155:74 | ...[...] : | semmle.label | ...[...] : | +| ActiveRecordInjection.rb:166:5:166:13 | my_params : | semmle.label | my_params : | | ActiveRecordInjection.rb:166:17:166:32 | call to permitted_params : | semmle.label | call to permitted_params : | +| ActiveRecordInjection.rb:167:5:167:9 | query : | semmle.label | query : | | ActiveRecordInjection.rb:167:47:167:55 | my_params : | semmle.label | my_params : | | ActiveRecordInjection.rb:167:47:167:65 | ...[...] : | semmle.label | ...[...] : | | ActiveRecordInjection.rb:168:37:168:41 | query | semmle.label | query | @@ -118,6 +129,7 @@ nodes | ActiveRecordInjection.rb:178:35:178:96 | "SELECT * FROM users WHERE id ..." | semmle.label | "SELECT * FROM users WHERE id ..." | | ActiveRecordInjection.rb:178:69:178:84 | call to permitted_params : | semmle.label | call to permitted_params : | | ActiveRecordInjection.rb:178:69:178:94 | ...[...] : | semmle.label | ...[...] : | +| ArelInjection.rb:4:5:4:8 | name : | semmle.label | name : | | ArelInjection.rb:4:12:4:17 | call to params : | semmle.label | call to params : | | ArelInjection.rb:4:12:4:29 | ...[...] : | semmle.label | ...[...] : | | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | semmle.label | "SELECT * FROM users WHERE nam..." | diff --git a/ruby/ql/test/query-tests/security/cwe-094/CodeInjection/CodeInjection.expected b/ruby/ql/test/query-tests/security/cwe-094/CodeInjection/CodeInjection.expected index 53a181121c2..0c7a63915ed 100644 --- a/ruby/ql/test/query-tests/security/cwe-094/CodeInjection/CodeInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-094/CodeInjection/CodeInjection.expected @@ -1,26 +1,30 @@ edges +| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:8:10:8:13 | code | +| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:8:10:8:13 | code | +| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:20:20:20:23 | code | +| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:20:20:20:23 | code | +| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:23:21:23:24 | code | +| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:23:21:23:24 | code | +| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:29:15:29:18 | code | +| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:32:19:32:22 | code | +| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:38:24:38:27 | code : | +| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:38:24:38:27 | code : | +| CodeInjection.rb:5:5:5:8 | code : | CodeInjection.rb:41:40:41:43 | code | | CodeInjection.rb:5:12:5:17 | call to params : | CodeInjection.rb:5:12:5:24 | ...[...] : | | CodeInjection.rb:5:12:5:17 | call to params : | CodeInjection.rb:5:12:5:24 | ...[...] : | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:8:10:8:13 | code | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:8:10:8:13 | code | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:20:20:20:23 | code | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:20:20:20:23 | code | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:23:21:23:24 | code | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:23:21:23:24 | code | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:29:15:29:18 | code | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:32:19:32:22 | code | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:38:24:38:27 | code : | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:38:24:38:27 | code : | -| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:41:40:41:43 | code | +| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:5:5:5:8 | code : | +| CodeInjection.rb:5:12:5:24 | ...[...] : | CodeInjection.rb:5:5:5:8 | code : | | CodeInjection.rb:38:24:38:27 | code : | CodeInjection.rb:38:10:38:28 | call to escape | | CodeInjection.rb:38:24:38:27 | code : | CodeInjection.rb:38:10:38:28 | call to escape | +| CodeInjection.rb:78:5:78:8 | code : | CodeInjection.rb:80:16:80:19 | code | +| CodeInjection.rb:78:5:78:8 | code : | CodeInjection.rb:86:10:86:37 | ... + ... | +| CodeInjection.rb:78:5:78:8 | code : | CodeInjection.rb:88:10:88:32 | "prefix_#{...}_suffix" | +| CodeInjection.rb:78:5:78:8 | code : | CodeInjection.rb:90:10:90:13 | code | +| CodeInjection.rb:78:5:78:8 | code : | CodeInjection.rb:90:10:90:13 | code | | CodeInjection.rb:78:12:78:17 | call to params : | CodeInjection.rb:78:12:78:24 | ...[...] : | | CodeInjection.rb:78:12:78:17 | call to params : | CodeInjection.rb:78:12:78:24 | ...[...] : | -| CodeInjection.rb:78:12:78:24 | ...[...] : | CodeInjection.rb:80:16:80:19 | code | -| CodeInjection.rb:78:12:78:24 | ...[...] : | CodeInjection.rb:86:10:86:37 | ... + ... | -| CodeInjection.rb:78:12:78:24 | ...[...] : | CodeInjection.rb:88:10:88:32 | "prefix_#{...}_suffix" | -| CodeInjection.rb:78:12:78:24 | ...[...] : | CodeInjection.rb:90:10:90:13 | code | -| CodeInjection.rb:78:12:78:24 | ...[...] : | CodeInjection.rb:90:10:90:13 | code | +| CodeInjection.rb:78:12:78:24 | ...[...] : | CodeInjection.rb:78:5:78:8 | code : | +| CodeInjection.rb:78:12:78:24 | ...[...] : | CodeInjection.rb:78:5:78:8 | code : | | CodeInjection.rb:101:3:102:5 | self in index [@foo] : | CodeInjection.rb:111:3:113:5 | self in baz [@foo] : | | CodeInjection.rb:101:3:102:5 | self in index [@foo] : | CodeInjection.rb:111:3:113:5 | self in baz [@foo] : | | CodeInjection.rb:105:5:105:8 | [post] self [@foo] : | CodeInjection.rb:108:3:109:5 | self in bar [@foo] : | @@ -36,6 +40,8 @@ edges | CodeInjection.rb:112:10:112:13 | self [@foo] : | CodeInjection.rb:112:10:112:13 | @foo | | CodeInjection.rb:112:10:112:13 | self [@foo] : | CodeInjection.rb:112:10:112:13 | @foo | nodes +| CodeInjection.rb:5:5:5:8 | code : | semmle.label | code : | +| CodeInjection.rb:5:5:5:8 | code : | semmle.label | code : | | CodeInjection.rb:5:12:5:17 | call to params : | semmle.label | call to params : | | CodeInjection.rb:5:12:5:17 | call to params : | semmle.label | call to params : | | CodeInjection.rb:5:12:5:24 | ...[...] : | semmle.label | ...[...] : | @@ -55,6 +61,8 @@ nodes | CodeInjection.rb:38:24:38:27 | code : | semmle.label | code : | | CodeInjection.rb:38:24:38:27 | code : | semmle.label | code : | | CodeInjection.rb:41:40:41:43 | code | semmle.label | code | +| CodeInjection.rb:78:5:78:8 | code : | semmle.label | code : | +| CodeInjection.rb:78:5:78:8 | code : | semmle.label | code : | | CodeInjection.rb:78:12:78:17 | call to params : | semmle.label | call to params : | | CodeInjection.rb:78:12:78:17 | call to params : | semmle.label | call to params : | | CodeInjection.rb:78:12:78:24 | ...[...] : | semmle.label | ...[...] : | diff --git a/ruby/ql/test/query-tests/security/cwe-094/UnsafeCodeConstruction/UnsafeCodeConstruction.expected b/ruby/ql/test/query-tests/security/cwe-094/UnsafeCodeConstruction/UnsafeCodeConstruction.expected index 1b55dd3c999..f57dd6a3e88 100644 --- a/ruby/ql/test/query-tests/security/cwe-094/UnsafeCodeConstruction/UnsafeCodeConstruction.expected +++ b/ruby/ql/test/query-tests/security/cwe-094/UnsafeCodeConstruction/UnsafeCodeConstruction.expected @@ -4,7 +4,8 @@ edges | impl/unsafeCode.rb:12:12:12:12 | x : | impl/unsafeCode.rb:13:33:13:33 | x | | impl/unsafeCode.rb:28:17:28:22 | my_arr : | impl/unsafeCode.rb:29:10:29:15 | my_arr | | impl/unsafeCode.rb:32:21:32:21 | x : | impl/unsafeCode.rb:33:12:33:12 | x : | -| impl/unsafeCode.rb:33:12:33:12 | x : | impl/unsafeCode.rb:34:10:34:12 | arr | +| impl/unsafeCode.rb:33:5:33:7 | arr [element 0] : | impl/unsafeCode.rb:34:10:34:12 | arr | +| impl/unsafeCode.rb:33:12:33:12 | x : | impl/unsafeCode.rb:33:5:33:7 | arr [element 0] : | | impl/unsafeCode.rb:37:15:37:15 | x : | impl/unsafeCode.rb:39:14:39:14 | x : | | impl/unsafeCode.rb:39:5:39:7 | [post] arr [element] : | impl/unsafeCode.rb:40:10:40:12 | arr | | impl/unsafeCode.rb:39:5:39:7 | [post] arr [element] : | impl/unsafeCode.rb:44:10:44:12 | arr | @@ -13,10 +14,12 @@ edges | impl/unsafeCode.rb:54:21:54:21 | x : | impl/unsafeCode.rb:55:22:55:22 | x | | impl/unsafeCode.rb:59:21:59:21 | x : | impl/unsafeCode.rb:60:17:60:17 | x : | | impl/unsafeCode.rb:59:24:59:24 | y : | impl/unsafeCode.rb:63:30:63:30 | y : | -| impl/unsafeCode.rb:60:11:60:18 | call to Array [element 0] : | impl/unsafeCode.rb:61:10:61:12 | arr | +| impl/unsafeCode.rb:60:5:60:7 | arr [element 0] : | impl/unsafeCode.rb:61:10:61:12 | arr | +| impl/unsafeCode.rb:60:11:60:18 | call to Array [element 0] : | impl/unsafeCode.rb:60:5:60:7 | arr [element 0] : | | impl/unsafeCode.rb:60:17:60:17 | x : | impl/unsafeCode.rb:60:11:60:18 | call to Array [element 0] : | +| impl/unsafeCode.rb:63:5:63:8 | arr2 [element 0] : | impl/unsafeCode.rb:64:10:64:13 | arr2 | | impl/unsafeCode.rb:63:13:63:32 | call to Array [element 1] : | impl/unsafeCode.rb:63:13:63:42 | call to join : | -| impl/unsafeCode.rb:63:13:63:42 | call to join : | impl/unsafeCode.rb:64:10:64:13 | arr2 | +| impl/unsafeCode.rb:63:13:63:42 | call to join : | impl/unsafeCode.rb:63:5:63:8 | arr2 [element 0] : | | impl/unsafeCode.rb:63:30:63:30 | y : | impl/unsafeCode.rb:63:13:63:32 | call to Array [element 1] : | nodes | impl/unsafeCode.rb:2:12:2:17 | target : | semmle.label | target : | @@ -28,6 +31,7 @@ nodes | impl/unsafeCode.rb:28:17:28:22 | my_arr : | semmle.label | my_arr : | | impl/unsafeCode.rb:29:10:29:15 | my_arr | semmle.label | my_arr | | impl/unsafeCode.rb:32:21:32:21 | x : | semmle.label | x : | +| impl/unsafeCode.rb:33:5:33:7 | arr [element 0] : | semmle.label | arr [element 0] : | | impl/unsafeCode.rb:33:12:33:12 | x : | semmle.label | x : | | impl/unsafeCode.rb:34:10:34:12 | arr | semmle.label | arr | | impl/unsafeCode.rb:37:15:37:15 | x : | semmle.label | x : | @@ -41,9 +45,11 @@ nodes | impl/unsafeCode.rb:55:22:55:22 | x | semmle.label | x | | impl/unsafeCode.rb:59:21:59:21 | x : | semmle.label | x : | | impl/unsafeCode.rb:59:24:59:24 | y : | semmle.label | y : | +| impl/unsafeCode.rb:60:5:60:7 | arr [element 0] : | semmle.label | arr [element 0] : | | impl/unsafeCode.rb:60:11:60:18 | call to Array [element 0] : | semmle.label | call to Array [element 0] : | | impl/unsafeCode.rb:60:17:60:17 | x : | semmle.label | x : | | impl/unsafeCode.rb:61:10:61:12 | arr | semmle.label | arr | +| impl/unsafeCode.rb:63:5:63:8 | arr2 [element 0] : | semmle.label | arr2 [element 0] : | | impl/unsafeCode.rb:63:13:63:32 | call to Array [element 1] : | semmle.label | call to Array [element 1] : | | impl/unsafeCode.rb:63:13:63:42 | call to join : | semmle.label | call to join : | | impl/unsafeCode.rb:63:30:63:30 | y : | semmle.label | y : | diff --git a/ruby/ql/test/query-tests/security/cwe-117/LogInjection.expected b/ruby/ql/test/query-tests/security/cwe-117/LogInjection.expected index b0da6305e8a..7f461d5efe1 100644 --- a/ruby/ql/test/query-tests/security/cwe-117/LogInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-117/LogInjection.expected @@ -1,28 +1,30 @@ edges +| app/controllers/users_controller.rb:15:5:15:15 | unsanitized : | app/controllers/users_controller.rb:16:19:16:29 | unsanitized | +| app/controllers/users_controller.rb:15:5:15:15 | unsanitized : | app/controllers/users_controller.rb:17:19:17:41 | ... + ... | +| app/controllers/users_controller.rb:15:5:15:15 | unsanitized : | app/controllers/users_controller.rb:23:20:23:30 | unsanitized : | | app/controllers/users_controller.rb:15:19:15:24 | call to params : | app/controllers/users_controller.rb:15:19:15:30 | ...[...] : | -| app/controllers/users_controller.rb:15:19:15:30 | ...[...] : | app/controllers/users_controller.rb:16:19:16:29 | unsanitized | -| app/controllers/users_controller.rb:15:19:15:30 | ...[...] : | app/controllers/users_controller.rb:17:19:17:41 | ... + ... | -| app/controllers/users_controller.rb:15:19:15:30 | ...[...] : | app/controllers/users_controller.rb:23:20:23:30 | unsanitized : | -| app/controllers/users_controller.rb:23:5:23:44 | ... = ... : | app/controllers/users_controller.rb:25:7:25:18 | unsanitized2 | +| app/controllers/users_controller.rb:15:19:15:30 | ...[...] : | app/controllers/users_controller.rb:15:5:15:15 | unsanitized : | +| app/controllers/users_controller.rb:23:5:23:16 | unsanitized2 : | app/controllers/users_controller.rb:25:7:25:18 | unsanitized2 | +| app/controllers/users_controller.rb:23:5:23:16 | unsanitized2 : | app/controllers/users_controller.rb:27:16:27:39 | ... + ... | | app/controllers/users_controller.rb:23:20:23:30 | unsanitized : | app/controllers/users_controller.rb:23:20:23:44 | call to sub : | -| app/controllers/users_controller.rb:23:20:23:44 | call to sub : | app/controllers/users_controller.rb:23:5:23:44 | ... = ... : | -| app/controllers/users_controller.rb:23:20:23:44 | call to sub : | app/controllers/users_controller.rb:27:16:27:39 | ... + ... | -| app/controllers/users_controller.rb:33:5:33:31 | ... = ... : | app/controllers/users_controller.rb:34:33:34:43 | unsanitized | -| app/controllers/users_controller.rb:33:5:33:31 | ... = ... : | app/controllers/users_controller.rb:35:33:35:55 | ... + ... | +| app/controllers/users_controller.rb:23:20:23:44 | call to sub : | app/controllers/users_controller.rb:23:5:23:16 | unsanitized2 : | +| app/controllers/users_controller.rb:33:5:33:15 | unsanitized : | app/controllers/users_controller.rb:34:33:34:43 | unsanitized | +| app/controllers/users_controller.rb:33:5:33:15 | unsanitized : | app/controllers/users_controller.rb:35:33:35:55 | ... + ... | | app/controllers/users_controller.rb:33:19:33:25 | call to cookies : | app/controllers/users_controller.rb:33:19:33:31 | ...[...] : | -| app/controllers/users_controller.rb:33:19:33:31 | ...[...] : | app/controllers/users_controller.rb:33:5:33:31 | ... = ... : | +| app/controllers/users_controller.rb:33:19:33:31 | ...[...] : | app/controllers/users_controller.rb:33:5:33:15 | unsanitized : | | app/controllers/users_controller.rb:49:19:49:24 | call to params : | app/controllers/users_controller.rb:49:19:49:30 | ...[...] | nodes +| app/controllers/users_controller.rb:15:5:15:15 | unsanitized : | semmle.label | unsanitized : | | app/controllers/users_controller.rb:15:19:15:24 | call to params : | semmle.label | call to params : | | app/controllers/users_controller.rb:15:19:15:30 | ...[...] : | semmle.label | ...[...] : | | app/controllers/users_controller.rb:16:19:16:29 | unsanitized | semmle.label | unsanitized | | app/controllers/users_controller.rb:17:19:17:41 | ... + ... | semmle.label | ... + ... | -| app/controllers/users_controller.rb:23:5:23:44 | ... = ... : | semmle.label | ... = ... : | +| app/controllers/users_controller.rb:23:5:23:16 | unsanitized2 : | semmle.label | unsanitized2 : | | app/controllers/users_controller.rb:23:20:23:30 | unsanitized : | semmle.label | unsanitized : | | app/controllers/users_controller.rb:23:20:23:44 | call to sub : | semmle.label | call to sub : | | app/controllers/users_controller.rb:25:7:25:18 | unsanitized2 | semmle.label | unsanitized2 | | app/controllers/users_controller.rb:27:16:27:39 | ... + ... | semmle.label | ... + ... | -| app/controllers/users_controller.rb:33:5:33:31 | ... = ... : | semmle.label | ... = ... : | +| app/controllers/users_controller.rb:33:5:33:15 | unsanitized : | semmle.label | unsanitized : | | app/controllers/users_controller.rb:33:19:33:25 | call to cookies : | semmle.label | call to cookies : | | app/controllers/users_controller.rb:33:19:33:31 | ...[...] : | semmle.label | ...[...] : | | app/controllers/users_controller.rb:34:33:34:43 | unsanitized | semmle.label | unsanitized | diff --git a/ruby/ql/test/query-tests/security/cwe-1333-polynomial-redos/PolynomialReDoS.expected b/ruby/ql/test/query-tests/security/cwe-1333-polynomial-redos/PolynomialReDoS.expected index c428efe29cd..5341242ac8f 100644 --- a/ruby/ql/test/query-tests/security/cwe-1333-polynomial-redos/PolynomialReDoS.expected +++ b/ruby/ql/test/query-tests/security/cwe-1333-polynomial-redos/PolynomialReDoS.expected @@ -1,42 +1,49 @@ edges +| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:10:5:10:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:11:5:11:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:12:5:12:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:13:5:13:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:14:5:14:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:15:5:15:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:16:5:16:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:17:5:17:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:18:5:18:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:19:5:19:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:20:5:20:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:21:5:21:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:22:5:22:8 | name | +| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:23:17:23:20 | name | +| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:24:18:24:21 | name | +| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:42:10:42:13 | name | +| PolynomialReDoS.rb:4:5:4:8 | name : | PolynomialReDoS.rb:47:10:47:13 | name | | PolynomialReDoS.rb:4:12:4:17 | call to params : | PolynomialReDoS.rb:4:12:4:24 | ...[...] : | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:10:5:10:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:11:5:11:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:12:5:12:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:13:5:13:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:14:5:14:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:15:5:15:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:16:5:16:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:17:5:17:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:18:5:18:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:19:5:19:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:20:5:20:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:21:5:21:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:22:5:22:8 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:23:17:23:20 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:24:18:24:21 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:42:10:42:13 | name | -| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:47:10:47:13 | name | +| PolynomialReDoS.rb:4:12:4:24 | ...[...] : | PolynomialReDoS.rb:4:5:4:8 | name : | +| PolynomialReDoS.rb:27:5:27:5 | a : | PolynomialReDoS.rb:28:5:28:5 | a | | PolynomialReDoS.rb:27:9:27:14 | call to params : | PolynomialReDoS.rb:27:9:27:18 | ...[...] : | -| PolynomialReDoS.rb:27:9:27:18 | ...[...] : | PolynomialReDoS.rb:28:5:28:5 | a | +| PolynomialReDoS.rb:27:9:27:18 | ...[...] : | PolynomialReDoS.rb:27:5:27:5 | a : | +| PolynomialReDoS.rb:29:5:29:5 | b : | PolynomialReDoS.rb:30:5:30:5 | b | | PolynomialReDoS.rb:29:9:29:14 | call to params : | PolynomialReDoS.rb:29:9:29:18 | ...[...] : | -| PolynomialReDoS.rb:29:9:29:18 | ...[...] : | PolynomialReDoS.rb:30:5:30:5 | b | +| PolynomialReDoS.rb:29:9:29:18 | ...[...] : | PolynomialReDoS.rb:29:5:29:5 | b : | +| PolynomialReDoS.rb:31:5:31:5 | c : | PolynomialReDoS.rb:32:5:32:5 | c | | PolynomialReDoS.rb:31:9:31:14 | call to params : | PolynomialReDoS.rb:31:9:31:18 | ...[...] : | -| PolynomialReDoS.rb:31:9:31:18 | ...[...] : | PolynomialReDoS.rb:32:5:32:5 | c | +| PolynomialReDoS.rb:31:9:31:18 | ...[...] : | PolynomialReDoS.rb:31:5:31:5 | c : | +| PolynomialReDoS.rb:54:5:54:8 | name : | PolynomialReDoS.rb:56:38:56:41 | name : | +| PolynomialReDoS.rb:54:5:54:8 | name : | PolynomialReDoS.rb:58:37:58:40 | name : | | PolynomialReDoS.rb:54:12:54:17 | call to params : | PolynomialReDoS.rb:54:12:54:24 | ...[...] : | -| PolynomialReDoS.rb:54:12:54:24 | ...[...] : | PolynomialReDoS.rb:56:38:56:41 | name : | -| PolynomialReDoS.rb:54:12:54:24 | ...[...] : | PolynomialReDoS.rb:58:37:58:40 | name : | +| PolynomialReDoS.rb:54:12:54:24 | ...[...] : | PolynomialReDoS.rb:54:5:54:8 | name : | | PolynomialReDoS.rb:56:38:56:41 | name : | PolynomialReDoS.rb:61:33:61:37 | input : | | PolynomialReDoS.rb:58:37:58:40 | name : | PolynomialReDoS.rb:65:42:65:46 | input : | | PolynomialReDoS.rb:61:33:61:37 | input : | PolynomialReDoS.rb:62:5:62:9 | input | | PolynomialReDoS.rb:65:42:65:46 | input : | PolynomialReDoS.rb:66:5:66:9 | input | +| PolynomialReDoS.rb:70:5:70:8 | name : | PolynomialReDoS.rb:73:32:73:35 | name : | | PolynomialReDoS.rb:70:12:70:17 | call to params : | PolynomialReDoS.rb:70:12:70:24 | ...[...] : | -| PolynomialReDoS.rb:70:12:70:24 | ...[...] : | PolynomialReDoS.rb:73:32:73:35 | name : | +| PolynomialReDoS.rb:70:12:70:24 | ...[...] : | PolynomialReDoS.rb:70:5:70:8 | name : | | PolynomialReDoS.rb:73:32:73:35 | name : | PolynomialReDoS.rb:76:35:76:39 | input : | | PolynomialReDoS.rb:76:35:76:39 | input : | PolynomialReDoS.rb:77:5:77:9 | input | | lib/index.rb:2:11:2:11 | x : | lib/index.rb:4:13:4:13 | x | | lib/index.rb:8:13:8:13 | x : | lib/index.rb:9:15:9:15 | x | nodes +| PolynomialReDoS.rb:4:5:4:8 | name : | semmle.label | name : | | PolynomialReDoS.rb:4:12:4:17 | call to params : | semmle.label | call to params : | | PolynomialReDoS.rb:4:12:4:24 | ...[...] : | semmle.label | ...[...] : | | PolynomialReDoS.rb:10:5:10:8 | name | semmle.label | name | @@ -54,17 +61,21 @@ nodes | PolynomialReDoS.rb:22:5:22:8 | name | semmle.label | name | | PolynomialReDoS.rb:23:17:23:20 | name | semmle.label | name | | PolynomialReDoS.rb:24:18:24:21 | name | semmle.label | name | +| PolynomialReDoS.rb:27:5:27:5 | a : | semmle.label | a : | | PolynomialReDoS.rb:27:9:27:14 | call to params : | semmle.label | call to params : | | PolynomialReDoS.rb:27:9:27:18 | ...[...] : | semmle.label | ...[...] : | | PolynomialReDoS.rb:28:5:28:5 | a | semmle.label | a | +| PolynomialReDoS.rb:29:5:29:5 | b : | semmle.label | b : | | PolynomialReDoS.rb:29:9:29:14 | call to params : | semmle.label | call to params : | | PolynomialReDoS.rb:29:9:29:18 | ...[...] : | semmle.label | ...[...] : | | PolynomialReDoS.rb:30:5:30:5 | b | semmle.label | b | +| PolynomialReDoS.rb:31:5:31:5 | c : | semmle.label | c : | | PolynomialReDoS.rb:31:9:31:14 | call to params : | semmle.label | call to params : | | PolynomialReDoS.rb:31:9:31:18 | ...[...] : | semmle.label | ...[...] : | | PolynomialReDoS.rb:32:5:32:5 | c | semmle.label | c | | PolynomialReDoS.rb:42:10:42:13 | name | semmle.label | name | | PolynomialReDoS.rb:47:10:47:13 | name | semmle.label | name | +| PolynomialReDoS.rb:54:5:54:8 | name : | semmle.label | name : | | PolynomialReDoS.rb:54:12:54:17 | call to params : | semmle.label | call to params : | | PolynomialReDoS.rb:54:12:54:24 | ...[...] : | semmle.label | ...[...] : | | PolynomialReDoS.rb:56:38:56:41 | name : | semmle.label | name : | @@ -73,6 +84,7 @@ nodes | PolynomialReDoS.rb:62:5:62:9 | input | semmle.label | input | | PolynomialReDoS.rb:65:42:65:46 | input : | semmle.label | input : | | PolynomialReDoS.rb:66:5:66:9 | input | semmle.label | input | +| PolynomialReDoS.rb:70:5:70:8 | name : | semmle.label | name : | | PolynomialReDoS.rb:70:12:70:17 | call to params : | semmle.label | call to params : | | PolynomialReDoS.rb:70:12:70:24 | ...[...] : | semmle.label | ...[...] : | | PolynomialReDoS.rb:73:32:73:35 | name : | semmle.label | name : | diff --git a/ruby/ql/test/query-tests/security/cwe-1333-regexp-injection/RegExpInjection.expected b/ruby/ql/test/query-tests/security/cwe-1333-regexp-injection/RegExpInjection.expected index 80c434f8002..8318c0a8ec8 100644 --- a/ruby/ql/test/query-tests/security/cwe-1333-regexp-injection/RegExpInjection.expected +++ b/ruby/ql/test/query-tests/security/cwe-1333-regexp-injection/RegExpInjection.expected @@ -1,27 +1,37 @@ edges +| RegExpInjection.rb:4:5:4:8 | name : | RegExpInjection.rb:5:13:5:21 | /#{...}/ | | RegExpInjection.rb:4:12:4:17 | call to params : | RegExpInjection.rb:4:12:4:24 | ...[...] : | -| RegExpInjection.rb:4:12:4:24 | ...[...] : | RegExpInjection.rb:5:13:5:21 | /#{...}/ | +| RegExpInjection.rb:4:12:4:24 | ...[...] : | RegExpInjection.rb:4:5:4:8 | name : | +| RegExpInjection.rb:10:5:10:8 | name : | RegExpInjection.rb:11:13:11:27 | /foo#{...}bar/ | | RegExpInjection.rb:10:12:10:17 | call to params : | RegExpInjection.rb:10:12:10:24 | ...[...] : | -| RegExpInjection.rb:10:12:10:24 | ...[...] : | RegExpInjection.rb:11:13:11:27 | /foo#{...}bar/ | +| RegExpInjection.rb:10:12:10:24 | ...[...] : | RegExpInjection.rb:10:5:10:8 | name : | +| RegExpInjection.rb:16:5:16:8 | name : | RegExpInjection.rb:17:24:17:27 | name | | RegExpInjection.rb:16:12:16:17 | call to params : | RegExpInjection.rb:16:12:16:24 | ...[...] : | -| RegExpInjection.rb:16:12:16:24 | ...[...] : | RegExpInjection.rb:17:24:17:27 | name | +| RegExpInjection.rb:16:12:16:24 | ...[...] : | RegExpInjection.rb:16:5:16:8 | name : | +| RegExpInjection.rb:22:5:22:8 | name : | RegExpInjection.rb:23:24:23:33 | ... + ... | | RegExpInjection.rb:22:12:22:17 | call to params : | RegExpInjection.rb:22:12:22:24 | ...[...] : | -| RegExpInjection.rb:22:12:22:24 | ...[...] : | RegExpInjection.rb:23:24:23:33 | ... + ... | +| RegExpInjection.rb:22:12:22:24 | ...[...] : | RegExpInjection.rb:22:5:22:8 | name : | +| RegExpInjection.rb:54:5:54:8 | name : | RegExpInjection.rb:55:28:55:37 | ... + ... | | RegExpInjection.rb:54:12:54:17 | call to params : | RegExpInjection.rb:54:12:54:24 | ...[...] : | -| RegExpInjection.rb:54:12:54:24 | ...[...] : | RegExpInjection.rb:55:28:55:37 | ... + ... | +| RegExpInjection.rb:54:12:54:24 | ...[...] : | RegExpInjection.rb:54:5:54:8 | name : | nodes +| RegExpInjection.rb:4:5:4:8 | name : | semmle.label | name : | | RegExpInjection.rb:4:12:4:17 | call to params : | semmle.label | call to params : | | RegExpInjection.rb:4:12:4:24 | ...[...] : | semmle.label | ...[...] : | | RegExpInjection.rb:5:13:5:21 | /#{...}/ | semmle.label | /#{...}/ | +| RegExpInjection.rb:10:5:10:8 | name : | semmle.label | name : | | RegExpInjection.rb:10:12:10:17 | call to params : | semmle.label | call to params : | | RegExpInjection.rb:10:12:10:24 | ...[...] : | semmle.label | ...[...] : | | RegExpInjection.rb:11:13:11:27 | /foo#{...}bar/ | semmle.label | /foo#{...}bar/ | +| RegExpInjection.rb:16:5:16:8 | name : | semmle.label | name : | | RegExpInjection.rb:16:12:16:17 | call to params : | semmle.label | call to params : | | RegExpInjection.rb:16:12:16:24 | ...[...] : | semmle.label | ...[...] : | | RegExpInjection.rb:17:24:17:27 | name | semmle.label | name | +| RegExpInjection.rb:22:5:22:8 | name : | semmle.label | name : | | RegExpInjection.rb:22:12:22:17 | call to params : | semmle.label | call to params : | | RegExpInjection.rb:22:12:22:24 | ...[...] : | semmle.label | ...[...] : | | RegExpInjection.rb:23:24:23:33 | ... + ... | semmle.label | ... + ... | +| RegExpInjection.rb:54:5:54:8 | name : | semmle.label | name : | | RegExpInjection.rb:54:12:54:17 | call to params : | semmle.label | call to params : | | RegExpInjection.rb:54:12:54:24 | ...[...] : | semmle.label | ...[...] : | | RegExpInjection.rb:55:28:55:37 | ... + ... | semmle.label | ... + ... | diff --git a/ruby/ql/test/query-tests/security/cwe-209/StackTraceExposure.expected b/ruby/ql/test/query-tests/security/cwe-209/StackTraceExposure.expected index 0dba484c65a..532c7752905 100644 --- a/ruby/ql/test/query-tests/security/cwe-209/StackTraceExposure.expected +++ b/ruby/ql/test/query-tests/security/cwe-209/StackTraceExposure.expected @@ -1,7 +1,9 @@ edges -| StackTraceExposure.rb:11:10:11:17 | call to caller : | StackTraceExposure.rb:12:18:12:19 | bt | +| StackTraceExposure.rb:11:5:11:6 | bt : | StackTraceExposure.rb:12:18:12:19 | bt | +| StackTraceExposure.rb:11:10:11:17 | call to caller : | StackTraceExposure.rb:11:5:11:6 | bt : | nodes | StackTraceExposure.rb:6:18:6:28 | call to backtrace | semmle.label | call to backtrace | +| StackTraceExposure.rb:11:5:11:6 | bt : | semmle.label | bt : | | StackTraceExposure.rb:11:10:11:17 | call to caller : | semmle.label | call to caller : | | StackTraceExposure.rb:12:18:12:19 | bt | semmle.label | bt | | StackTraceExposure.rb:18:18:18:28 | call to backtrace | semmle.label | call to backtrace | diff --git a/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected b/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected index 2931f4869c4..90968a06b2b 100644 --- a/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected +++ b/ruby/ql/test/query-tests/security/cwe-312/CleartextLogging.expected @@ -1,34 +1,45 @@ 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:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" : | logging.rb:38:20:38:23 | hsh1 [element :password] : | +| logging.rb:3:1:3:8 | password : | logging.rb:6:20:6:27 | password | +| logging.rb:3:1:3:8 | password : | logging.rb:8:21:8:28 | password | +| logging.rb:3:1:3:8 | password : | logging.rb:10:21:10:28 | password | +| logging.rb:3:1:3:8 | password : | logging.rb:12:21:12:28 | password | +| logging.rb:3:1:3:8 | password : | logging.rb:14:23:14:30 | password | +| logging.rb:3:1:3:8 | password : | logging.rb:16:20:16:27 | password | +| logging.rb:3:1:3:8 | password : | logging.rb:19:33:19:40 | password | +| logging.rb:3:1:3:8 | password : | logging.rb:21:44:21:51 | password | +| logging.rb:3:1:3:8 | password : | logging.rb:23:33:23:40 | password | +| logging.rb:3:1:3:8 | password : | logging.rb:26:18:26:34 | "pw: #{...}" | +| logging.rb:3:1:3:8 | password : | logging.rb:28:26:28:33 | password | +| logging.rb:3:12:3:45 | "043697b96909e03ca907599d6420555f" : | logging.rb:3:1:3:8 | password : | +| logging.rb:30:1:30:4 | hsh1 [element :password] : | logging.rb:38:20:38:23 | hsh1 [element :password] : | +| logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" : | logging.rb:30:1:30:4 | hsh1 [element :password] : | +| logging.rb:34:1:34:4 | [post] hsh2 [element :password] : | logging.rb:35:1:35:4 | hsh3 [element :password] : | | logging.rb:34:1:34:4 | [post] hsh2 [element :password] : | logging.rb:40:20:40:23 | hsh2 [element :password] : | -| logging.rb:34:1:34:4 | [post] hsh2 [element :password] : | logging.rb:42:20:42:23 | hsh3 [element :password] : | | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" : | logging.rb:34:1:34:4 | [post] hsh2 [element :password] : | +| logging.rb:35:1:35:4 | hsh3 [element :password] : | logging.rb:42:20:42:23 | hsh3 [element :password] : | | logging.rb:38:20:38:23 | hsh1 [element :password] : | logging.rb:38:20:38:34 | ...[...] | | logging.rb:40:20:40:23 | hsh2 [element :password] : | logging.rb:40:20:40:34 | ...[...] | | logging.rb:42:20:42:23 | hsh3 [element :password] : | logging.rb:42:20:42:34 | ...[...] | -| logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" : | logging.rb:68:35:68:65 | password_masked_ineffective_sub : | -| logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" : | logging.rb:78:20:78:53 | password_masked_ineffective_sub_ex | -| logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" : | logging.rb:70:36:70:67 | password_masked_ineffective_gsub : | -| logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" : | logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | +| logging.rb:64:1:64:31 | password_masked_ineffective_sub : | logging.rb:68:35:68:65 | password_masked_ineffective_sub : | +| logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" : | logging.rb:64:1:64:31 | password_masked_ineffective_sub : | +| logging.rb:65:1:65:34 | password_masked_ineffective_sub_ex : | logging.rb:78:20:78:53 | password_masked_ineffective_sub_ex | +| logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" : | logging.rb:65:1:65:34 | password_masked_ineffective_sub_ex : | +| logging.rb:66:1:66:32 | password_masked_ineffective_gsub : | logging.rb:70:36:70:67 | password_masked_ineffective_gsub : | +| logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" : | logging.rb:66:1:66:32 | password_masked_ineffective_gsub : | +| logging.rb:67:1:67:35 | password_masked_ineffective_gsub_ex : | logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | +| logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" : | logging.rb:67:1:67:35 | password_masked_ineffective_gsub_ex : | +| logging.rb:68:1:68:31 | password_masked_ineffective_sub : | logging.rb:74:20:74:50 | password_masked_ineffective_sub | | logging.rb:68:35:68:65 | password_masked_ineffective_sub : | logging.rb:68:35:68:88 | call to sub : | -| logging.rb:68:35:68:88 | call to sub : | logging.rb:74:20:74:50 | password_masked_ineffective_sub | +| logging.rb:68:35:68:88 | call to sub : | logging.rb:68:1:68:31 | password_masked_ineffective_sub : | +| logging.rb:70:1:70:32 | password_masked_ineffective_gsub : | logging.rb:76:20:76:51 | password_masked_ineffective_gsub | | logging.rb:70:36:70:67 | password_masked_ineffective_gsub : | logging.rb:70:36:70:86 | call to gsub : | -| logging.rb:70:36:70:86 | call to gsub : | logging.rb:76:20:76:51 | password_masked_ineffective_gsub | +| logging.rb:70:36:70:86 | call to gsub : | logging.rb:70:1:70:32 | password_masked_ineffective_gsub : | | logging.rb:82:9:82:16 | password : | logging.rb:84:15:84:22 | password | -| logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" : | logging.rb:88:5:88:16 | password_arg : | +| logging.rb:87:1:87:12 | password_arg : | logging.rb:88:5:88:16 | password_arg : | +| logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" : | logging.rb:87:1:87:12 | password_arg : | | logging.rb:88:5:88:16 | password_arg : | logging.rb:82:9:82:16 | password : | nodes +| logging.rb:3:1:3:8 | password : | semmle.label | password : | | 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 | @@ -41,21 +52,29 @@ nodes | 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:1:30:4 | hsh1 [element :password] : | semmle.label | hsh1 [element :password] : | | logging.rb:30:20:30:53 | "aec5058e61f7f122998b1a30ee2c66b6" : | semmle.label | "aec5058e61f7f122998b1a30ee2c66b6" : | | logging.rb:34:1:34:4 | [post] hsh2 [element :password] : | semmle.label | [post] hsh2 [element :password] : | | logging.rb:34:19:34:52 | "beeda625d7306b45784d91ea0336e201" : | semmle.label | "beeda625d7306b45784d91ea0336e201" : | +| logging.rb:35:1:35:4 | hsh3 [element :password] : | semmle.label | hsh3 [element :password] : | | logging.rb:38:20:38:23 | hsh1 [element :password] : | semmle.label | hsh1 [element :password] : | | logging.rb:38:20:38:34 | ...[...] | semmle.label | ...[...] | | logging.rb:40:20:40:23 | hsh2 [element :password] : | semmle.label | hsh2 [element :password] : | | logging.rb:40:20:40:34 | ...[...] | semmle.label | ...[...] | | logging.rb:42:20:42:23 | hsh3 [element :password] : | semmle.label | hsh3 [element :password] : | | logging.rb:42:20:42:34 | ...[...] | semmle.label | ...[...] | +| logging.rb:64:1:64:31 | password_masked_ineffective_sub : | semmle.label | password_masked_ineffective_sub : | | logging.rb:64:35:64:68 | "ca497451f5e883662fb1a37bc9ec7838" : | semmle.label | "ca497451f5e883662fb1a37bc9ec7838" : | +| logging.rb:65:1:65:34 | password_masked_ineffective_sub_ex : | semmle.label | password_masked_ineffective_sub_ex : | | logging.rb:65:38:65:71 | "ca497451f5e883662fb1a37bc9ec7838" : | semmle.label | "ca497451f5e883662fb1a37bc9ec7838" : | +| logging.rb:66:1:66:32 | password_masked_ineffective_gsub : | semmle.label | password_masked_ineffective_gsub : | | logging.rb:66:36:66:69 | "a7e3747b19930d4f4b8181047194832f" : | semmle.label | "a7e3747b19930d4f4b8181047194832f" : | +| logging.rb:67:1:67:35 | password_masked_ineffective_gsub_ex : | semmle.label | password_masked_ineffective_gsub_ex : | | logging.rb:67:39:67:72 | "a7e3747b19930d4f4b8181047194832f" : | semmle.label | "a7e3747b19930d4f4b8181047194832f" : | +| logging.rb:68:1:68:31 | password_masked_ineffective_sub : | semmle.label | password_masked_ineffective_sub : | | logging.rb:68:35:68:65 | password_masked_ineffective_sub : | semmle.label | password_masked_ineffective_sub : | | logging.rb:68:35:68:88 | call to sub : | semmle.label | call to sub : | +| logging.rb:70:1:70:32 | password_masked_ineffective_gsub : | semmle.label | password_masked_ineffective_gsub : | | logging.rb:70:36:70:67 | password_masked_ineffective_gsub : | semmle.label | password_masked_ineffective_gsub : | | logging.rb:70:36:70:86 | call to gsub : | semmle.label | call to gsub : | | logging.rb:74:20:74:50 | password_masked_ineffective_sub | semmle.label | password_masked_ineffective_sub | @@ -64,6 +83,7 @@ nodes | logging.rb:80:20:80:54 | password_masked_ineffective_gsub_ex | semmle.label | password_masked_ineffective_gsub_ex | | logging.rb:82:9:82:16 | password : | semmle.label | password : | | logging.rb:84:15:84:22 | password | semmle.label | password | +| logging.rb:87:1:87:12 | password_arg : | semmle.label | password_arg : | | logging.rb:87:16:87:49 | "65f2950df2f0e2c38d7ba2ccca767291" : | semmle.label | "65f2950df2f0e2c38d7ba2ccca767291" : | | logging.rb:88:5:88:16 | password_arg : | semmle.label | password_arg : | subpaths diff --git a/ruby/ql/test/query-tests/security/cwe-312/CleartextStorage.expected b/ruby/ql/test/query-tests/security/cwe-312/CleartextStorage.expected index 39f771ed08d..9f8f849b10a 100644 --- a/ruby/ql/test/query-tests/security/cwe-312/CleartextStorage.expected +++ b/ruby/ql/test/query-tests/security/cwe-312/CleartextStorage.expected @@ -1,51 +1,71 @@ edges -| app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" : | app/controllers/users_controller.rb:5:39:5:50 | new_password | -| app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" : | app/controllers/users_controller.rb:7:41:7:52 | new_password | -| app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : | app/controllers/users_controller.rb:13:42:13:53 | new_password | -| app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : | app/controllers/users_controller.rb:15:49:15:60 | new_password | -| app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : | app/controllers/users_controller.rb:15:49:15:60 | new_password : | -| app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : | app/controllers/users_controller.rb:15:87:15:98 | new_password | +| app/controllers/users_controller.rb:3:5:3:16 | new_password : | app/controllers/users_controller.rb:5:39:5:50 | new_password | +| app/controllers/users_controller.rb:3:5:3:16 | new_password : | app/controllers/users_controller.rb:7:41:7:52 | new_password | +| app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" : | app/controllers/users_controller.rb:3:5:3:16 | new_password : | +| app/controllers/users_controller.rb:11:5:11:16 | new_password : | app/controllers/users_controller.rb:13:42:13:53 | new_password | +| app/controllers/users_controller.rb:11:5:11:16 | new_password : | app/controllers/users_controller.rb:15:49:15:60 | new_password | +| app/controllers/users_controller.rb:11:5:11:16 | new_password : | app/controllers/users_controller.rb:15:49:15:60 | new_password : | +| app/controllers/users_controller.rb:11:5:11:16 | new_password : | app/controllers/users_controller.rb:15:87:15:98 | new_password | +| app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : | app/controllers/users_controller.rb:11:5:11:16 | new_password : | | app/controllers/users_controller.rb:15:49:15:60 | new_password : | app/controllers/users_controller.rb:15:87:15:98 | new_password | -| app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" : | app/controllers/users_controller.rb:21:45:21:56 | new_password | -| app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" : | app/controllers/users_controller.rb:21:45:21:56 | new_password : | -| app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" : | app/controllers/users_controller.rb:21:83:21:94 | new_password | +| app/controllers/users_controller.rb:19:5:19:16 | new_password : | app/controllers/users_controller.rb:21:45:21:56 | new_password | +| app/controllers/users_controller.rb:19:5:19:16 | new_password : | app/controllers/users_controller.rb:21:45:21:56 | new_password : | +| app/controllers/users_controller.rb:19:5:19:16 | new_password : | app/controllers/users_controller.rb:21:83:21:94 | new_password | +| app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" : | app/controllers/users_controller.rb:19:5:19:16 | new_password : | | app/controllers/users_controller.rb:21:45:21:56 | new_password : | app/controllers/users_controller.rb:21:83:21:94 | new_password | -| app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" : | app/controllers/users_controller.rb:28:27:28:38 | new_password | -| app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" : | app/controllers/users_controller.rb:30:28:30:39 | new_password | -| app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" : | app/controllers/users_controller.rb:37:39:37:50 | new_password | -| app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" : | app/controllers/users_controller.rb:44:21:44:32 | new_password | -| app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" : | app/controllers/users_controller.rb:61:25:61:53 | "password: #{...}\\n" | -| app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" : | app/controllers/users_controller.rb:64:35:64:61 | "password: #{...}" | -| app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" : | app/models/user.rb:5:27:5:38 | new_password | -| app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" : | app/models/user.rb:11:22:11:33 | new_password | -| app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" : | app/models/user.rb:17:21:17:32 | new_password | +| app/controllers/users_controller.rb:26:5:26:16 | new_password : | app/controllers/users_controller.rb:28:27:28:38 | new_password | +| app/controllers/users_controller.rb:26:5:26:16 | new_password : | app/controllers/users_controller.rb:30:28:30:39 | new_password | +| app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" : | app/controllers/users_controller.rb:26:5:26:16 | new_password : | +| app/controllers/users_controller.rb:35:5:35:16 | new_password : | app/controllers/users_controller.rb:37:39:37:50 | new_password | +| app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" : | app/controllers/users_controller.rb:35:5:35:16 | new_password : | +| app/controllers/users_controller.rb:42:5:42:16 | new_password : | app/controllers/users_controller.rb:44:21:44:32 | new_password | +| app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" : | app/controllers/users_controller.rb:42:5:42:16 | new_password : | +| app/controllers/users_controller.rb:58:5:58:16 | new_password : | app/controllers/users_controller.rb:61:25:61:53 | "password: #{...}\\n" | +| app/controllers/users_controller.rb:58:5:58:16 | new_password : | app/controllers/users_controller.rb:64:35:64:61 | "password: #{...}" | +| app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" : | app/controllers/users_controller.rb:58:5:58:16 | new_password : | +| app/models/user.rb:3:5:3:16 | new_password : | app/models/user.rb:5:27:5:38 | new_password | +| app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" : | app/models/user.rb:3:5:3:16 | new_password : | +| app/models/user.rb:9:5:9:16 | new_password : | app/models/user.rb:11:22:11:33 | new_password | +| app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" : | app/models/user.rb:9:5:9:16 | new_password : | +| app/models/user.rb:15:5:15:16 | new_password : | app/models/user.rb:17:21:17:32 | new_password | +| app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" : | app/models/user.rb:15:5:15:16 | new_password : | nodes +| app/controllers/users_controller.rb:3:5:3:16 | new_password : | semmle.label | new_password : | | app/controllers/users_controller.rb:3:20:3:53 | "043697b96909e03ca907599d6420555f" : | semmle.label | "043697b96909e03ca907599d6420555f" : | | app/controllers/users_controller.rb:5:39:5:50 | new_password | semmle.label | new_password | | app/controllers/users_controller.rb:7:41:7:52 | new_password | semmle.label | new_password | +| app/controllers/users_controller.rb:11:5:11:16 | new_password : | semmle.label | new_password : | | app/controllers/users_controller.rb:11:20:11:53 | "083c9e1da4cc0c2f5480bb4dbe6ff141" : | semmle.label | "083c9e1da4cc0c2f5480bb4dbe6ff141" : | | app/controllers/users_controller.rb:13:42:13:53 | new_password | semmle.label | new_password | | app/controllers/users_controller.rb:15:49:15:60 | new_password | semmle.label | new_password | | app/controllers/users_controller.rb:15:49:15:60 | new_password : | semmle.label | new_password : | | app/controllers/users_controller.rb:15:87:15:98 | new_password | semmle.label | new_password | +| app/controllers/users_controller.rb:19:5:19:16 | new_password : | semmle.label | new_password : | | app/controllers/users_controller.rb:19:20:19:53 | "504d224a806cf8073cd14ef08242d422" : | semmle.label | "504d224a806cf8073cd14ef08242d422" : | | app/controllers/users_controller.rb:21:45:21:56 | new_password | semmle.label | new_password | | app/controllers/users_controller.rb:21:45:21:56 | new_password : | semmle.label | new_password : | | app/controllers/users_controller.rb:21:83:21:94 | new_password | semmle.label | new_password | +| app/controllers/users_controller.rb:26:5:26:16 | new_password : | semmle.label | new_password : | | app/controllers/users_controller.rb:26:20:26:53 | "7d6ae08394c3f284506dca70f05995f6" : | semmle.label | "7d6ae08394c3f284506dca70f05995f6" : | | app/controllers/users_controller.rb:28:27:28:38 | new_password | semmle.label | new_password | | app/controllers/users_controller.rb:30:28:30:39 | new_password | semmle.label | new_password | +| app/controllers/users_controller.rb:35:5:35:16 | new_password : | semmle.label | new_password : | | app/controllers/users_controller.rb:35:20:35:53 | "ff295f8648a406c37fbe378377320e4c" : | semmle.label | "ff295f8648a406c37fbe378377320e4c" : | | app/controllers/users_controller.rb:37:39:37:50 | new_password | semmle.label | new_password | +| app/controllers/users_controller.rb:42:5:42:16 | new_password : | semmle.label | new_password : | | app/controllers/users_controller.rb:42:20:42:53 | "78ffbec583b546bd073efd898f833184" : | semmle.label | "78ffbec583b546bd073efd898f833184" : | | app/controllers/users_controller.rb:44:21:44:32 | new_password | semmle.label | new_password | +| app/controllers/users_controller.rb:58:5:58:16 | new_password : | semmle.label | new_password : | | app/controllers/users_controller.rb:58:20:58:53 | "0157af7c38cbdd24f1616de4e5321861" : | semmle.label | "0157af7c38cbdd24f1616de4e5321861" : | | app/controllers/users_controller.rb:61:25:61:53 | "password: #{...}\\n" | semmle.label | "password: #{...}\\n" | | app/controllers/users_controller.rb:64:35:64:61 | "password: #{...}" | semmle.label | "password: #{...}" | +| app/models/user.rb:3:5:3:16 | new_password : | semmle.label | new_password : | | app/models/user.rb:3:20:3:53 | "06c38c6a8a9c11a9d3b209a3193047b4" : | semmle.label | "06c38c6a8a9c11a9d3b209a3193047b4" : | | app/models/user.rb:5:27:5:38 | new_password | semmle.label | new_password | +| app/models/user.rb:9:5:9:16 | new_password : | semmle.label | new_password : | | app/models/user.rb:9:20:9:53 | "52652fb5c709fb6b9b5a0194af7c6067" : | semmle.label | "52652fb5c709fb6b9b5a0194af7c6067" : | | app/models/user.rb:11:22:11:33 | new_password | semmle.label | new_password | +| app/models/user.rb:15:5:15:16 | new_password : | semmle.label | new_password : | | app/models/user.rb:15:20:15:53 | "f982bf2531c149a8a1444a951b12e830" : | semmle.label | "f982bf2531c149a8a1444a951b12e830" : | | app/models/user.rb:17:21:17:32 | new_password | semmle.label | new_password | subpaths diff --git a/ruby/ql/test/query-tests/security/cwe-502/oj-global-options/UnsafeDeserialization.expected b/ruby/ql/test/query-tests/security/cwe-502/oj-global-options/UnsafeDeserialization.expected index 72c25575a21..38499665118 100644 --- a/ruby/ql/test/query-tests/security/cwe-502/oj-global-options/UnsafeDeserialization.expected +++ b/ruby/ql/test/query-tests/security/cwe-502/oj-global-options/UnsafeDeserialization.expected @@ -1,7 +1,9 @@ edges +| OjGlobalOptions.rb:13:5:13:13 | json_data : | OjGlobalOptions.rb:14:22:14:30 | json_data | | OjGlobalOptions.rb:13:17:13:22 | call to params : | OjGlobalOptions.rb:13:17:13:28 | ...[...] : | -| OjGlobalOptions.rb:13:17:13:28 | ...[...] : | OjGlobalOptions.rb:14:22:14:30 | json_data | +| OjGlobalOptions.rb:13:17:13:28 | ...[...] : | OjGlobalOptions.rb:13:5:13:13 | json_data : | nodes +| OjGlobalOptions.rb:13:5:13:13 | json_data : | semmle.label | json_data : | | OjGlobalOptions.rb:13:17:13:22 | call to params : | semmle.label | call to params : | | OjGlobalOptions.rb:13:17:13:28 | ...[...] : | semmle.label | ...[...] : | | OjGlobalOptions.rb:14:22:14:30 | json_data | semmle.label | json_data | diff --git a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected index fe4addd5d4d..13fe16295d9 100644 --- a/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected +++ b/ruby/ql/test/query-tests/security/cwe-502/unsafe-deserialization/UnsafeDeserialization.expected @@ -1,53 +1,71 @@ edges -| UnsafeDeserialization.rb:10:23:10:50 | call to decode64 : | UnsafeDeserialization.rb:11:27:11:41 | serialized_data | +| UnsafeDeserialization.rb:10:5:10:19 | serialized_data : | UnsafeDeserialization.rb:11:27:11:41 | serialized_data | +| UnsafeDeserialization.rb:10:23:10:50 | call to decode64 : | UnsafeDeserialization.rb:10:5:10:19 | serialized_data : | | UnsafeDeserialization.rb:10:39:10:44 | call to params : | UnsafeDeserialization.rb:10:39:10:50 | ...[...] : | | UnsafeDeserialization.rb:10:39:10:50 | ...[...] : | UnsafeDeserialization.rb:10:23:10:50 | call to decode64 : | -| UnsafeDeserialization.rb:16:23:16:50 | call to decode64 : | UnsafeDeserialization.rb:17:30:17:44 | serialized_data | +| UnsafeDeserialization.rb:16:5:16:19 | serialized_data : | UnsafeDeserialization.rb:17:30:17:44 | serialized_data | +| UnsafeDeserialization.rb:16:23:16:50 | call to decode64 : | UnsafeDeserialization.rb:16:5:16:19 | serialized_data : | | UnsafeDeserialization.rb:16:39:16:44 | call to params : | UnsafeDeserialization.rb:16:39:16:50 | ...[...] : | | UnsafeDeserialization.rb:16:39:16:50 | ...[...] : | UnsafeDeserialization.rb:16:23:16:50 | call to decode64 : | +| UnsafeDeserialization.rb:22:5:22:13 | json_data : | UnsafeDeserialization.rb:23:24:23:32 | json_data | | UnsafeDeserialization.rb:22:17:22:22 | call to params : | UnsafeDeserialization.rb:22:17:22:28 | ...[...] : | -| UnsafeDeserialization.rb:22:17:22:28 | ...[...] : | UnsafeDeserialization.rb:23:24:23:32 | json_data | +| UnsafeDeserialization.rb:22:17:22:28 | ...[...] : | UnsafeDeserialization.rb:22:5:22:13 | json_data : | +| UnsafeDeserialization.rb:28:5:28:13 | json_data : | UnsafeDeserialization.rb:29:27:29:35 | json_data | | UnsafeDeserialization.rb:28:17:28:22 | call to params : | UnsafeDeserialization.rb:28:17:28:28 | ...[...] : | -| UnsafeDeserialization.rb:28:17:28:28 | ...[...] : | UnsafeDeserialization.rb:29:27:29:35 | json_data | +| UnsafeDeserialization.rb:28:17:28:28 | ...[...] : | UnsafeDeserialization.rb:28:5:28:13 | json_data : | +| UnsafeDeserialization.rb:40:5:40:13 | yaml_data : | UnsafeDeserialization.rb:41:24:41:32 | yaml_data | | UnsafeDeserialization.rb:40:17:40:22 | call to params : | UnsafeDeserialization.rb:40:17:40:28 | ...[...] : | -| UnsafeDeserialization.rb:40:17:40:28 | ...[...] : | UnsafeDeserialization.rb:41:24:41:32 | yaml_data | +| UnsafeDeserialization.rb:40:17:40:28 | ...[...] : | UnsafeDeserialization.rb:40:5:40:13 | yaml_data : | +| UnsafeDeserialization.rb:52:5:52:13 | json_data : | UnsafeDeserialization.rb:53:22:53:30 | json_data | +| UnsafeDeserialization.rb:52:5:52:13 | json_data : | UnsafeDeserialization.rb:54:22:54:30 | json_data | | UnsafeDeserialization.rb:52:17:52:22 | call to params : | UnsafeDeserialization.rb:52:17:52:28 | ...[...] : | -| UnsafeDeserialization.rb:52:17:52:28 | ...[...] : | UnsafeDeserialization.rb:53:22:53:30 | json_data | -| UnsafeDeserialization.rb:52:17:52:28 | ...[...] : | UnsafeDeserialization.rb:54:22:54:30 | json_data | +| UnsafeDeserialization.rb:52:17:52:28 | ...[...] : | UnsafeDeserialization.rb:52:5:52:13 | json_data : | +| UnsafeDeserialization.rb:59:5:59:13 | json_data : | UnsafeDeserialization.rb:69:23:69:31 | json_data | | UnsafeDeserialization.rb:59:17:59:22 | call to params : | UnsafeDeserialization.rb:59:17:59:28 | ...[...] : | -| UnsafeDeserialization.rb:59:17:59:28 | ...[...] : | UnsafeDeserialization.rb:69:23:69:31 | json_data | +| UnsafeDeserialization.rb:59:17:59:28 | ...[...] : | UnsafeDeserialization.rb:59:5:59:13 | json_data : | +| UnsafeDeserialization.rb:81:5:81:7 | xml : | UnsafeDeserialization.rb:82:34:82:36 | xml | | UnsafeDeserialization.rb:81:11:81:16 | call to params : | UnsafeDeserialization.rb:81:11:81:22 | ...[...] : | -| UnsafeDeserialization.rb:81:11:81:22 | ...[...] : | UnsafeDeserialization.rb:82:34:82:36 | xml | +| UnsafeDeserialization.rb:81:11:81:22 | ...[...] : | UnsafeDeserialization.rb:81:5:81:7 | xml : | +| UnsafeDeserialization.rb:87:5:87:13 | yaml_data : | UnsafeDeserialization.rb:88:25:88:33 | yaml_data | | UnsafeDeserialization.rb:87:17:87:22 | call to params : | UnsafeDeserialization.rb:87:17:87:28 | ...[...] : | -| UnsafeDeserialization.rb:87:17:87:28 | ...[...] : | UnsafeDeserialization.rb:88:25:88:33 | yaml_data | +| UnsafeDeserialization.rb:87:17:87:28 | ...[...] : | UnsafeDeserialization.rb:87:5:87:13 | yaml_data : | nodes +| UnsafeDeserialization.rb:10:5:10:19 | serialized_data : | semmle.label | serialized_data : | | UnsafeDeserialization.rb:10:23:10:50 | call to decode64 : | semmle.label | call to decode64 : | | UnsafeDeserialization.rb:10:39:10:44 | call to params : | semmle.label | call to params : | | UnsafeDeserialization.rb:10:39:10:50 | ...[...] : | semmle.label | ...[...] : | | UnsafeDeserialization.rb:11:27:11:41 | serialized_data | semmle.label | serialized_data | +| UnsafeDeserialization.rb:16:5:16:19 | serialized_data : | semmle.label | serialized_data : | | UnsafeDeserialization.rb:16:23:16:50 | call to decode64 : | semmle.label | call to decode64 : | | UnsafeDeserialization.rb:16:39:16:44 | call to params : | semmle.label | call to params : | | UnsafeDeserialization.rb:16:39:16:50 | ...[...] : | semmle.label | ...[...] : | | UnsafeDeserialization.rb:17:30:17:44 | serialized_data | semmle.label | serialized_data | +| UnsafeDeserialization.rb:22:5:22:13 | json_data : | semmle.label | json_data : | | UnsafeDeserialization.rb:22:17:22:22 | call to params : | semmle.label | call to params : | | UnsafeDeserialization.rb:22:17:22:28 | ...[...] : | semmle.label | ...[...] : | | UnsafeDeserialization.rb:23:24:23:32 | json_data | semmle.label | json_data | +| UnsafeDeserialization.rb:28:5:28:13 | json_data : | semmle.label | json_data : | | UnsafeDeserialization.rb:28:17:28:22 | call to params : | semmle.label | call to params : | | UnsafeDeserialization.rb:28:17:28:28 | ...[...] : | semmle.label | ...[...] : | | UnsafeDeserialization.rb:29:27:29:35 | json_data | semmle.label | json_data | +| UnsafeDeserialization.rb:40:5:40:13 | yaml_data : | semmle.label | yaml_data : | | UnsafeDeserialization.rb:40:17:40:22 | call to params : | semmle.label | call to params : | | UnsafeDeserialization.rb:40:17:40:28 | ...[...] : | semmle.label | ...[...] : | | UnsafeDeserialization.rb:41:24:41:32 | yaml_data | semmle.label | yaml_data | +| UnsafeDeserialization.rb:52:5:52:13 | json_data : | semmle.label | json_data : | | UnsafeDeserialization.rb:52:17:52:22 | call to params : | semmle.label | call to params : | | UnsafeDeserialization.rb:52:17:52:28 | ...[...] : | semmle.label | ...[...] : | | UnsafeDeserialization.rb:53:22:53:30 | json_data | semmle.label | json_data | | UnsafeDeserialization.rb:54:22:54:30 | json_data | semmle.label | json_data | +| UnsafeDeserialization.rb:59:5:59:13 | json_data : | semmle.label | json_data : | | UnsafeDeserialization.rb:59:17:59:22 | call to params : | semmle.label | call to params : | | UnsafeDeserialization.rb:59:17:59:28 | ...[...] : | semmle.label | ...[...] : | | UnsafeDeserialization.rb:69:23:69:31 | json_data | semmle.label | json_data | +| UnsafeDeserialization.rb:81:5:81:7 | xml : | semmle.label | xml : | | UnsafeDeserialization.rb:81:11:81:16 | call to params : | semmle.label | call to params : | | UnsafeDeserialization.rb:81:11:81:22 | ...[...] : | semmle.label | ...[...] : | | UnsafeDeserialization.rb:82:34:82:36 | xml | semmle.label | xml | +| UnsafeDeserialization.rb:87:5:87:13 | yaml_data : | semmle.label | yaml_data : | | UnsafeDeserialization.rb:87:17:87:22 | call to params : | semmle.label | call to params : | | UnsafeDeserialization.rb:87:17:87:28 | ...[...] : | semmle.label | ...[...] : | | UnsafeDeserialization.rb:88:25:88:33 | yaml_data | semmle.label | yaml_data | diff --git a/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected b/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected index a52134aa7db..cf3cc204cbd 100644 --- a/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected +++ b/ruby/ql/test/query-tests/security/cwe-506/HardcodedDataInterpretedAsCode.expected @@ -1,22 +1,26 @@ edges | tst.rb:1:7:1:7 | r : | tst.rb:2:4:2:4 | r : | | tst.rb:2:4:2:4 | r : | tst.rb:2:3:2:15 | call to pack : | -| tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." : | tst.rb:7:8:7:30 | totally_harmless_string : | +| tst.rb:5:1:5:23 | totally_harmless_string : | tst.rb:7:8:7:30 | totally_harmless_string : | +| tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." : | tst.rb:5:1:5:23 | totally_harmless_string : | | tst.rb:7:8:7:30 | totally_harmless_string : | tst.rb:1:7:1:7 | r : | | tst.rb:7:8:7:30 | totally_harmless_string : | tst.rb:7:6:7:31 | call to e | | tst.rb:10:11:10:24 | "666f6f626172" : | tst.rb:1:7:1:7 | r : | | tst.rb:10:11:10:24 | "666f6f626172" : | tst.rb:10:9:10:25 | call to e | -| tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." : | tst.rb:17:6:17:32 | another_questionable_string : | +| tst.rb:16:1:16:27 | another_questionable_string : | tst.rb:17:6:17:32 | another_questionable_string : | +| tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." : | tst.rb:16:1:16:27 | another_questionable_string : | | tst.rb:17:6:17:32 | another_questionable_string : | tst.rb:17:6:17:38 | call to strip | nodes | tst.rb:1:7:1:7 | r : | semmle.label | r : | | tst.rb:2:3:2:15 | call to pack : | semmle.label | call to pack : | | tst.rb:2:4:2:4 | r : | semmle.label | r : | +| tst.rb:5:1:5:23 | totally_harmless_string : | semmle.label | totally_harmless_string : | | tst.rb:5:27:5:72 | "707574732822636f646520696e6a6..." : | semmle.label | "707574732822636f646520696e6a6..." : | | tst.rb:7:6:7:31 | call to e | semmle.label | call to e | | tst.rb:7:8:7:30 | totally_harmless_string : | semmle.label | totally_harmless_string : | | tst.rb:10:9:10:25 | call to e | semmle.label | call to e | | tst.rb:10:11:10:24 | "666f6f626172" : | semmle.label | "666f6f626172" : | +| tst.rb:16:1:16:27 | another_questionable_string : | semmle.label | another_questionable_string : | | tst.rb:16:31:16:84 | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." : | semmle.label | "\\x70\\x75\\x74\\x73\\x28\\x27\\x68\\..." : | | tst.rb:17:6:17:32 | another_questionable_string : | semmle.label | another_questionable_string : | | tst.rb:17:6:17:38 | call to strip | semmle.label | call to strip | diff --git a/ruby/ql/test/query-tests/security/cwe-598/SensitiveGetQuery.expected b/ruby/ql/test/query-tests/security/cwe-598/SensitiveGetQuery.expected index 005e2497be8..5fd00e43faf 100644 --- a/ruby/ql/test/query-tests/security/cwe-598/SensitiveGetQuery.expected +++ b/ruby/ql/test/query-tests/security/cwe-598/SensitiveGetQuery.expected @@ -1,7 +1,8 @@ edges | app/controllers/users_controller.rb:4:11:4:16 | call to params : | app/controllers/users_controller.rb:4:11:4:27 | ...[...] | +| app/controllers/users_controller.rb:9:5:9:12 | password : | app/controllers/users_controller.rb:10:42:10:49 | password | | app/controllers/users_controller.rb:9:16:9:21 | call to params : | app/controllers/users_controller.rb:9:16:9:27 | ...[...] : | -| app/controllers/users_controller.rb:9:16:9:27 | ...[...] : | app/controllers/users_controller.rb:10:42:10:49 | password | +| app/controllers/users_controller.rb:9:16:9:27 | ...[...] : | app/controllers/users_controller.rb:9:5:9:12 | password : | | app/controllers/users_controller.rb:14:5:14:13 | [post] self [@password] : | app/controllers/users_controller.rb:15:42:15:50 | self [@password] : | | app/controllers/users_controller.rb:14:17:14:22 | call to params : | app/controllers/users_controller.rb:14:17:14:28 | ...[...] : | | app/controllers/users_controller.rb:14:17:14:28 | ...[...] : | app/controllers/users_controller.rb:14:5:14:13 | [post] self [@password] : | @@ -9,6 +10,7 @@ edges nodes | app/controllers/users_controller.rb:4:11:4:16 | call to params : | semmle.label | call to params : | | app/controllers/users_controller.rb:4:11:4:27 | ...[...] | semmle.label | ...[...] | +| app/controllers/users_controller.rb:9:5:9:12 | password : | semmle.label | password : | | app/controllers/users_controller.rb:9:16:9:21 | call to params : | semmle.label | call to params : | | app/controllers/users_controller.rb:9:16:9:27 | ...[...] : | semmle.label | ...[...] : | | app/controllers/users_controller.rb:10:42:10:49 | password | semmle.label | password | diff --git a/ruby/ql/test/query-tests/security/cwe-611/libxml-backend/Xxe.expected b/ruby/ql/test/query-tests/security/cwe-611/libxml-backend/Xxe.expected index 30f57223c4b..6e0473c62c8 100644 --- a/ruby/ql/test/query-tests/security/cwe-611/libxml-backend/Xxe.expected +++ b/ruby/ql/test/query-tests/security/cwe-611/libxml-backend/Xxe.expected @@ -1,10 +1,12 @@ edges +| LibXmlBackend.rb:16:5:16:11 | content : | LibXmlBackend.rb:18:30:18:36 | content | +| LibXmlBackend.rb:16:5:16:11 | content : | LibXmlBackend.rb:19:19:19:25 | content | +| LibXmlBackend.rb:16:5:16:11 | content : | LibXmlBackend.rb:20:27:20:33 | content | +| LibXmlBackend.rb:16:5:16:11 | content : | LibXmlBackend.rb:21:34:21:40 | content | | LibXmlBackend.rb:16:15:16:20 | call to params : | LibXmlBackend.rb:16:15:16:26 | ...[...] : | -| LibXmlBackend.rb:16:15:16:26 | ...[...] : | LibXmlBackend.rb:18:30:18:36 | content | -| LibXmlBackend.rb:16:15:16:26 | ...[...] : | LibXmlBackend.rb:19:19:19:25 | content | -| LibXmlBackend.rb:16:15:16:26 | ...[...] : | LibXmlBackend.rb:20:27:20:33 | content | -| LibXmlBackend.rb:16:15:16:26 | ...[...] : | LibXmlBackend.rb:21:34:21:40 | content | +| LibXmlBackend.rb:16:15:16:26 | ...[...] : | LibXmlBackend.rb:16:5:16:11 | content : | nodes +| LibXmlBackend.rb:16:5:16:11 | content : | semmle.label | content : | | LibXmlBackend.rb:16:15:16:20 | call to params : | semmle.label | call to params : | | LibXmlBackend.rb:16:15:16:26 | ...[...] : | semmle.label | ...[...] : | | LibXmlBackend.rb:18:30:18:36 | content | semmle.label | content | diff --git a/ruby/ql/test/query-tests/security/cwe-611/xxe/Xxe.expected b/ruby/ql/test/query-tests/security/cwe-611/xxe/Xxe.expected index 442e5a9cfd4..638a3f3f805 100644 --- a/ruby/ql/test/query-tests/security/cwe-611/xxe/Xxe.expected +++ b/ruby/ql/test/query-tests/security/cwe-611/xxe/Xxe.expected @@ -1,30 +1,33 @@ edges +| LibXmlRuby.rb:3:5:3:11 | content : | LibXmlRuby.rb:4:34:4:40 | content | +| LibXmlRuby.rb:3:5:3:11 | content : | LibXmlRuby.rb:5:32:5:38 | content | +| LibXmlRuby.rb:3:5:3:11 | content : | LibXmlRuby.rb:6:30:6:36 | content | +| LibXmlRuby.rb:3:5:3:11 | content : | LibXmlRuby.rb:7:32:7:38 | content | +| LibXmlRuby.rb:3:5:3:11 | content : | LibXmlRuby.rb:8:30:8:36 | content | +| LibXmlRuby.rb:3:5:3:11 | content : | LibXmlRuby.rb:9:28:9:34 | content | +| LibXmlRuby.rb:3:5:3:11 | content : | LibXmlRuby.rb:11:26:11:32 | content | +| LibXmlRuby.rb:3:5:3:11 | content : | LibXmlRuby.rb:12:24:12:30 | content | | LibXmlRuby.rb:3:15:3:20 | call to params : | LibXmlRuby.rb:3:15:3:26 | ...[...] : | -| LibXmlRuby.rb:3:15:3:26 | ...[...] : | LibXmlRuby.rb:4:34:4:40 | content | -| LibXmlRuby.rb:3:15:3:26 | ...[...] : | LibXmlRuby.rb:5:32:5:38 | content | -| LibXmlRuby.rb:3:15:3:26 | ...[...] : | LibXmlRuby.rb:6:30:6:36 | content | -| LibXmlRuby.rb:3:15:3:26 | ...[...] : | LibXmlRuby.rb:7:32:7:38 | content | -| LibXmlRuby.rb:3:15:3:26 | ...[...] : | LibXmlRuby.rb:8:30:8:36 | content | -| LibXmlRuby.rb:3:15:3:26 | ...[...] : | LibXmlRuby.rb:9:28:9:34 | content | -| LibXmlRuby.rb:3:15:3:26 | ...[...] : | LibXmlRuby.rb:11:26:11:32 | content | -| LibXmlRuby.rb:3:15:3:26 | ...[...] : | LibXmlRuby.rb:12:24:12:30 | content | +| LibXmlRuby.rb:3:15:3:26 | ...[...] : | LibXmlRuby.rb:3:5:3:11 | content : | +| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:5:26:5:32 | content | +| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:6:26:6:32 | content | +| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:7:26:7:32 | content | +| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:8:26:8:32 | content | +| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:9:26:9:32 | content | +| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:11:26:11:32 | content | +| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:12:26:12:32 | content | +| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:15:26:15:32 | content | +| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:16:26:16:32 | content | +| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:18:26:18:32 | content | +| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:19:26:19:32 | content | +| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:22:26:22:32 | content | +| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:25:26:25:32 | content | +| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:27:26:27:32 | content | +| Nokogiri.rb:3:5:3:11 | content : | Nokogiri.rb:28:26:28:32 | content | | Nokogiri.rb:3:15:3:20 | call to params : | Nokogiri.rb:3:15:3:26 | ...[...] : | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:5:26:5:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:6:26:6:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:7:26:7:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:8:26:8:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:9:26:9:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:11:26:11:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:12:26:12:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:15:26:15:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:16:26:16:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:18:26:18:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:19:26:19:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:22:26:22:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:25:26:25:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:27:26:27:32 | content | -| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:28:26:28:32 | content | +| Nokogiri.rb:3:15:3:26 | ...[...] : | Nokogiri.rb:3:5:3:11 | content : | nodes +| LibXmlRuby.rb:3:5:3:11 | content : | semmle.label | content : | | LibXmlRuby.rb:3:15:3:20 | call to params : | semmle.label | call to params : | | LibXmlRuby.rb:3:15:3:26 | ...[...] : | semmle.label | ...[...] : | | LibXmlRuby.rb:4:34:4:40 | content | semmle.label | content | @@ -35,6 +38,7 @@ nodes | LibXmlRuby.rb:9:28:9:34 | content | semmle.label | content | | LibXmlRuby.rb:11:26:11:32 | content | semmle.label | content | | LibXmlRuby.rb:12:24:12:30 | content | semmle.label | content | +| Nokogiri.rb:3:5:3:11 | content : | semmle.label | content : | | Nokogiri.rb:3:15:3:20 | call to params : | semmle.label | call to params : | | Nokogiri.rb:3:15:3:26 | ...[...] : | semmle.label | ...[...] : | | Nokogiri.rb:5:26:5:32 | content | semmle.label | content | diff --git a/ruby/ql/test/query-tests/security/cwe-732/WeakFilePermissions.expected b/ruby/ql/test/query-tests/security/cwe-732/WeakFilePermissions.expected index a7669549247..5df273f589f 100644 --- a/ruby/ql/test/query-tests/security/cwe-732/WeakFilePermissions.expected +++ b/ruby/ql/test/query-tests/security/cwe-732/WeakFilePermissions.expected @@ -1,17 +1,25 @@ edges -| FilePermissions.rb:51:10:51:13 | 0777 : | FilePermissions.rb:53:19:53:22 | perm | -| FilePermissions.rb:51:10:51:13 | 0777 : | FilePermissions.rb:56:19:56:23 | perm2 | -| FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" : | FilePermissions.rb:61:19:61:23 | perm2 | +| FilePermissions.rb:51:3:51:6 | perm : | FilePermissions.rb:53:19:53:22 | perm | +| FilePermissions.rb:51:3:51:6 | perm : | FilePermissions.rb:54:3:54:7 | perm2 : | +| FilePermissions.rb:51:10:51:13 | 0777 : | FilePermissions.rb:51:3:51:6 | perm : | +| FilePermissions.rb:54:3:54:7 | perm2 : | FilePermissions.rb:56:19:56:23 | perm2 | +| FilePermissions.rb:58:3:58:6 | perm : | FilePermissions.rb:59:3:59:7 | perm2 : | +| FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" : | FilePermissions.rb:58:3:58:6 | perm : | +| FilePermissions.rb:59:3:59:7 | perm2 : | FilePermissions.rb:61:19:61:23 | perm2 | nodes | FilePermissions.rb:5:19:5:22 | 0222 | semmle.label | 0222 | | FilePermissions.rb:7:19:7:22 | 0622 | semmle.label | 0622 | | FilePermissions.rb:9:19:9:22 | 0755 | semmle.label | 0755 | | FilePermissions.rb:11:19:11:22 | 0777 | semmle.label | 0777 | | FilePermissions.rb:28:13:28:16 | 0755 | semmle.label | 0755 | +| FilePermissions.rb:51:3:51:6 | perm : | semmle.label | perm : | | FilePermissions.rb:51:10:51:13 | 0777 : | semmle.label | 0777 : | | FilePermissions.rb:53:19:53:22 | perm | semmle.label | perm | +| FilePermissions.rb:54:3:54:7 | perm2 : | semmle.label | perm2 : | | FilePermissions.rb:56:19:56:23 | perm2 | semmle.label | perm2 | +| FilePermissions.rb:58:3:58:6 | perm : | semmle.label | perm : | | FilePermissions.rb:58:10:58:26 | "u=wrx,g=rwx,o=x" : | semmle.label | "u=wrx,g=rwx,o=x" : | +| FilePermissions.rb:59:3:59:7 | perm2 : | semmle.label | perm2 : | | FilePermissions.rb:61:19:61:23 | perm2 | semmle.label | perm2 | | FilePermissions.rb:63:19:63:29 | "u=rwx,o+r" | semmle.label | "u=rwx,o+r" | | FilePermissions.rb:67:19:67:24 | "a+rw" | semmle.label | "a+rw" | diff --git a/ruby/ql/test/query-tests/security/cwe-798/HardcodedCredentials.expected b/ruby/ql/test/query-tests/security/cwe-798/HardcodedCredentials.expected index 51e45945d0f..4d358671e34 100644 --- a/ruby/ql/test/query-tests/security/cwe-798/HardcodedCredentials.expected +++ b/ruby/ql/test/query-tests/security/cwe-798/HardcodedCredentials.expected @@ -3,8 +3,11 @@ edges | HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." : | HardcodedCredentials.rb:1:33:1:36 | cert | | HardcodedCredentials.rb:18:19:18:72 | ... + ... : | HardcodedCredentials.rb:1:23:1:30 | password | | HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." : | HardcodedCredentials.rb:18:19:18:72 | ... + ... : | -| HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." : | HardcodedCredentials.rb:23:19:23:20 | pw : | -| HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" : | HardcodedCredentials.rb:23:19:23:20 | pw : | +| HardcodedCredentials.rb:20:1:20:7 | pw_left : | HardcodedCredentials.rb:22:1:22:2 | pw : | +| HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." : | HardcodedCredentials.rb:20:1:20:7 | pw_left : | +| HardcodedCredentials.rb:21:1:21:8 | pw_right : | HardcodedCredentials.rb:22:1:22:2 | pw : | +| HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" : | HardcodedCredentials.rb:21:1:21:8 | pw_right : | +| HardcodedCredentials.rb:22:1:22:2 | pw : | HardcodedCredentials.rb:23:19:23:20 | pw : | | HardcodedCredentials.rb:23:19:23:20 | pw : | HardcodedCredentials.rb:1:23:1:30 | password | | HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." : | HardcodedCredentials.rb:31:18:31:23 | passwd | | HardcodedCredentials.rb:43:29:43:43 | "user@test.com" : | HardcodedCredentials.rb:43:18:43:25 | username | @@ -19,8 +22,11 @@ nodes | HardcodedCredentials.rb:15:30:15:75 | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." : | semmle.label | "WLC17dLQ9P8YlQvqm77qplOMm5pd1..." : | | HardcodedCredentials.rb:18:19:18:72 | ... + ... : | semmle.label | ... + ... : | | HardcodedCredentials.rb:18:27:18:72 | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." : | semmle.label | "ogH6qSYWGdbR/2WOGYa7eZ/tObL+G..." : | +| HardcodedCredentials.rb:20:1:20:7 | pw_left : | semmle.label | pw_left : | | HardcodedCredentials.rb:20:11:20:76 | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." : | semmle.label | "3jOe7sXKX6Tx52qHWUVqh2t9LNsE+..." : | +| HardcodedCredentials.rb:21:1:21:8 | pw_right : | semmle.label | pw_right : | | HardcodedCredentials.rb:21:12:21:37 | "4fQuzXef4f2yow8KWvIJTA==" : | semmle.label | "4fQuzXef4f2yow8KWvIJTA==" : | +| HardcodedCredentials.rb:22:1:22:2 | pw : | semmle.label | pw : | | HardcodedCredentials.rb:23:19:23:20 | pw : | semmle.label | pw : | | HardcodedCredentials.rb:31:18:31:23 | passwd | semmle.label | passwd | | HardcodedCredentials.rb:38:40:38:85 | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." : | semmle.label | "kdW/xVhiv6y1fQQNevDpUaq+2rfPK..." : | diff --git a/ruby/ql/test/query-tests/security/cwe-807-user-controlled-bypass/ConditionalBypass.expected b/ruby/ql/test/query-tests/security/cwe-807-user-controlled-bypass/ConditionalBypass.expected index 912900936a1..32b778130ef 100644 --- a/ruby/ql/test/query-tests/security/cwe-807-user-controlled-bypass/ConditionalBypass.expected +++ b/ruby/ql/test/query-tests/security/cwe-807-user-controlled-bypass/ConditionalBypass.expected @@ -1,16 +1,20 @@ edges +| ConditionalBypass.rb:3:5:3:9 | check : | ConditionalBypass.rb:6:8:6:12 | check | | ConditionalBypass.rb:3:13:3:18 | call to params : | ConditionalBypass.rb:3:13:3:26 | ...[...] : | -| ConditionalBypass.rb:3:13:3:26 | ...[...] : | ConditionalBypass.rb:6:8:6:12 | check | +| ConditionalBypass.rb:3:13:3:26 | ...[...] : | ConditionalBypass.rb:3:5:3:9 | check : | | ConditionalBypass.rb:14:14:14:19 | call to params : | ConditionalBypass.rb:14:14:14:27 | ...[...] | +| ConditionalBypass.rb:25:5:25:5 | p : | ConditionalBypass.rb:27:8:27:8 | p | | ConditionalBypass.rb:25:10:25:15 | call to params : | ConditionalBypass.rb:25:10:25:22 | ...[...] | | ConditionalBypass.rb:25:10:25:15 | call to params : | ConditionalBypass.rb:25:10:25:22 | ...[...] : | -| ConditionalBypass.rb:25:10:25:22 | ...[...] : | ConditionalBypass.rb:27:8:27:8 | p | +| ConditionalBypass.rb:25:10:25:22 | ...[...] : | ConditionalBypass.rb:25:5:25:5 | p : | nodes +| ConditionalBypass.rb:3:5:3:9 | check : | semmle.label | check : | | ConditionalBypass.rb:3:13:3:18 | call to params : | semmle.label | call to params : | | ConditionalBypass.rb:3:13:3:26 | ...[...] : | semmle.label | ...[...] : | | ConditionalBypass.rb:6:8:6:12 | check | semmle.label | check | | ConditionalBypass.rb:14:14:14:19 | call to params : | semmle.label | call to params : | | ConditionalBypass.rb:14:14:14:27 | ...[...] | semmle.label | ...[...] | +| ConditionalBypass.rb:25:5:25:5 | p : | semmle.label | p : | | ConditionalBypass.rb:25:10:25:15 | call to params : | semmle.label | call to params : | | ConditionalBypass.rb:25:10:25:22 | ...[...] | semmle.label | ...[...] | | ConditionalBypass.rb:25:10:25:22 | ...[...] : | semmle.label | ...[...] : | diff --git a/ruby/ql/test/query-tests/security/cwe-829/InsecureDownload.expected b/ruby/ql/test/query-tests/security/cwe-829/InsecureDownload.expected index 77e26750686..3562b7a8c98 100644 --- a/ruby/ql/test/query-tests/security/cwe-829/InsecureDownload.expected +++ b/ruby/ql/test/query-tests/security/cwe-829/InsecureDownload.expected @@ -1,10 +1,14 @@ failures edges -| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : | insecure_download.rb:33:15:33:17 | url | -| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : | insecure_download.rb:33:15:33:17 | url | +| insecure_download.rb:31:5:31:7 | url : | insecure_download.rb:33:15:33:17 | url | +| insecure_download.rb:31:5:31:7 | url : | insecure_download.rb:33:15:33:17 | url | +| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : | insecure_download.rb:31:5:31:7 | url : | +| insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : | insecure_download.rb:31:5:31:7 | url : | nodes | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | semmle.label | "http://example.org/unsafe.APK" | | insecure_download.rb:27:15:27:45 | "http://example.org/unsafe.APK" | semmle.label | "http://example.org/unsafe.APK" | +| insecure_download.rb:31:5:31:7 | url : | semmle.label | url : | +| insecure_download.rb:31:5:31:7 | url : | semmle.label | url : | | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : | semmle.label | "http://example.org/unsafe.APK" : | | insecure_download.rb:31:11:31:41 | "http://example.org/unsafe.APK" : | semmle.label | "http://example.org/unsafe.APK" : | | insecure_download.rb:33:15:33:17 | url | semmle.label | url | diff --git a/ruby/ql/test/query-tests/security/cwe-912/HttpToFileAccess.expected b/ruby/ql/test/query-tests/security/cwe-912/HttpToFileAccess.expected index ba8d776656b..1f26bdc2221 100644 --- a/ruby/ql/test/query-tests/security/cwe-912/HttpToFileAccess.expected +++ b/ruby/ql/test/query-tests/security/cwe-912/HttpToFileAccess.expected @@ -1,10 +1,14 @@ edges -| http_to_file_access.rb:3:8:3:52 | call to body : | http_to_file_access.rb:5:12:5:15 | resp | +| http_to_file_access.rb:3:1:3:4 | resp : | http_to_file_access.rb:5:12:5:15 | resp | +| http_to_file_access.rb:3:8:3:52 | call to body : | http_to_file_access.rb:3:1:3:4 | resp : | +| http_to_file_access.rb:9:7:9:12 | script : | http_to_file_access.rb:11:18:11:23 | script | | http_to_file_access.rb:9:16:9:21 | call to params : | http_to_file_access.rb:9:16:9:30 | ...[...] : | -| http_to_file_access.rb:9:16:9:30 | ...[...] : | http_to_file_access.rb:11:18:11:23 | script | +| http_to_file_access.rb:9:16:9:30 | ...[...] : | http_to_file_access.rb:9:7:9:12 | script : | nodes +| http_to_file_access.rb:3:1:3:4 | resp : | semmle.label | resp : | | http_to_file_access.rb:3:8:3:52 | call to body : | semmle.label | call to body : | | http_to_file_access.rb:5:12:5:15 | resp | semmle.label | resp | +| http_to_file_access.rb:9:7:9:12 | script : | semmle.label | script : | | http_to_file_access.rb:9:16:9:21 | call to params : | semmle.label | call to params : | | http_to_file_access.rb:9:16:9:30 | ...[...] : | semmle.label | ...[...] : | | http_to_file_access.rb:11:18:11:23 | script | semmle.label | script | diff --git a/ruby/ql/test/query-tests/security/cwe-918/ServerSideRequestForgery.expected b/ruby/ql/test/query-tests/security/cwe-918/ServerSideRequestForgery.expected index 1ac18b48554..906d4666020 100644 --- a/ruby/ql/test/query-tests/security/cwe-918/ServerSideRequestForgery.expected +++ b/ruby/ql/test/query-tests/security/cwe-918/ServerSideRequestForgery.expected @@ -1,9 +1,11 @@ edges +| ServerSideRequestForgery.rb:10:9:10:28 | users_service_domain : | ServerSideRequestForgery.rb:11:31:11:62 | "#{...}/logins" | | ServerSideRequestForgery.rb:10:32:10:37 | call to params : | ServerSideRequestForgery.rb:10:32:10:60 | ...[...] : | -| ServerSideRequestForgery.rb:10:32:10:60 | ...[...] : | ServerSideRequestForgery.rb:11:31:11:62 | "#{...}/logins" | +| ServerSideRequestForgery.rb:10:32:10:60 | ...[...] : | ServerSideRequestForgery.rb:10:9:10:28 | users_service_domain : | | ServerSideRequestForgery.rb:15:33:15:38 | call to params : | ServerSideRequestForgery.rb:15:33:15:44 | ...[...] | | ServerSideRequestForgery.rb:20:45:20:50 | call to params : | ServerSideRequestForgery.rb:20:45:20:56 | ...[...] | nodes +| ServerSideRequestForgery.rb:10:9:10:28 | users_service_domain : | semmle.label | users_service_domain : | | ServerSideRequestForgery.rb:10:32:10:37 | call to params : | semmle.label | call to params : | | ServerSideRequestForgery.rb:10:32:10:60 | ...[...] : | semmle.label | ...[...] : | | ServerSideRequestForgery.rb:11:31:11:62 | "#{...}/logins" | semmle.label | "#{...}/logins" | diff --git a/ruby/ql/test/query-tests/security/decompression-api/DecompressionApi.expected b/ruby/ql/test/query-tests/security/decompression-api/DecompressionApi.expected index 20ec5943541..265142d1ccd 100644 --- a/ruby/ql/test/query-tests/security/decompression-api/DecompressionApi.expected +++ b/ruby/ql/test/query-tests/security/decompression-api/DecompressionApi.expected @@ -1,8 +1,10 @@ edges +| decompression_api.rb:4:9:4:12 | path : | decompression_api.rb:5:31:5:34 | path | | decompression_api.rb:4:16:4:21 | call to params : | decompression_api.rb:4:16:4:28 | ...[...] : | -| decompression_api.rb:4:16:4:28 | ...[...] : | decompression_api.rb:5:31:5:34 | path | +| decompression_api.rb:4:16:4:28 | ...[...] : | decompression_api.rb:4:9:4:12 | path : | | decompression_api.rb:15:31:15:36 | call to params : | decompression_api.rb:15:31:15:43 | ...[...] | nodes +| decompression_api.rb:4:9:4:12 | path : | semmle.label | path : | | decompression_api.rb:4:16:4:21 | call to params : | semmle.label | call to params : | | decompression_api.rb:4:16:4:28 | ...[...] : | semmle.label | ...[...] : | | decompression_api.rb:5:31:5:34 | path | semmle.label | path | From 8b5393661b0cee13febbee060caf039e2003eafe Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Fri, 24 Mar 2023 10:34:10 +0100 Subject: [PATCH 141/143] C++: Address review comments --- .../lib/semmle/code/cpp/security/boostorg/asio/protocols.qll | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll b/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll index 63b11597487..8668ecf078c 100644 --- a/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll +++ b/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll @@ -402,11 +402,6 @@ module BoostorgAsio { import DataFlow::Global } - /** DEPRECATED: Use `SslContextCallGlobal` instead. */ - deprecated module SslContextCallMake { - import SslContextCallGlobal - } - /** * Any protocol value that flows to the first argument of a context constructor. */ From b45c274f3316d67393522e36858f80324596b884 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 24 Mar 2023 12:41:53 +0100 Subject: [PATCH 142/143] Dataflow: Adjust qldoc --- java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll | 4 ++-- .../java/dataflow/internal/tainttracking1/TaintTracking.qll | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll index 137612c52af..865d7b4d6ce 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlow.qll @@ -222,7 +222,7 @@ signature module GlobalFlowSig { } /** - * Constructs a standard data flow computation. + * Constructs a global data flow computation. */ module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { @@ -239,7 +239,7 @@ deprecated module Make implements GlobalFlowSig { } /** - * Constructs a data flow computation using flow state. + * Constructs a global data flow computation using flow state. */ module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTracking.qll b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTracking.qll index 3f8cef3698a..872ac8d4cb8 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/tainttracking1/TaintTracking.qll @@ -33,7 +33,7 @@ private module AddTaintDefaults imp } /** - * Constructs a standard taint tracking computation. + * Constructs a global taint tracking computation. */ module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { @@ -54,7 +54,7 @@ deprecated module Make implements DataFlow::GlobalFl } /** - * Constructs a taint tracking computation using flow state. + * Constructs a global taint tracking computation using flow state. */ module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { From 85511ba19d4a5c7f64f259130b9b3e8cd484ff52 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 24 Mar 2023 12:42:06 +0100 Subject: [PATCH 143/143] Dataflow: Sync --- cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll | 4 ++-- .../cpp/dataflow/internal/tainttracking1/TaintTracking.qll | 4 ++-- cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll | 4 ++-- .../cpp/ir/dataflow/internal/tainttracking1/TaintTracking.qll | 4 ++-- .../ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll | 4 ++-- .../csharp/dataflow/internal/tainttracking1/TaintTracking.qll | 4 ++-- go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll | 4 ++-- .../go/dataflow/internal/tainttracking1/TaintTracking.qll | 4 ++-- .../ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll | 4 ++-- .../dataflow/new/internal/tainttracking1/TaintTracking.qll | 4 ++-- ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll | 4 ++-- .../ruby/dataflow/internal/tainttracking1/TaintTracking.qll | 4 ++-- swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll | 4 ++-- .../swift/dataflow/internal/tainttracking1/TaintTracking.qll | 4 ++-- 14 files changed, 28 insertions(+), 28 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll index 137612c52af..865d7b4d6ce 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlow.qll @@ -222,7 +222,7 @@ signature module GlobalFlowSig { } /** - * Constructs a standard data flow computation. + * Constructs a global data flow computation. */ module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { @@ -239,7 +239,7 @@ deprecated module Make implements GlobalFlowSig { } /** - * Constructs a data flow computation using flow state. + * Constructs a global data flow computation using flow state. */ module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTracking.qll index 3f8cef3698a..872ac8d4cb8 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/tainttracking1/TaintTracking.qll @@ -33,7 +33,7 @@ private module AddTaintDefaults imp } /** - * Constructs a standard taint tracking computation. + * Constructs a global taint tracking computation. */ module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { @@ -54,7 +54,7 @@ deprecated module Make implements DataFlow::GlobalFl } /** - * Constructs a taint tracking computation using flow state. + * Constructs a global taint tracking computation using flow state. */ module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll index 137612c52af..865d7b4d6ce 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlow.qll @@ -222,7 +222,7 @@ signature module GlobalFlowSig { } /** - * Constructs a standard data flow computation. + * Constructs a global data flow computation. */ module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { @@ -239,7 +239,7 @@ deprecated module Make implements GlobalFlowSig { } /** - * Constructs a data flow computation using flow state. + * Constructs a global data flow computation using flow state. */ module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTracking.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTracking.qll index 3f8cef3698a..872ac8d4cb8 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/tainttracking1/TaintTracking.qll @@ -33,7 +33,7 @@ private module AddTaintDefaults imp } /** - * Constructs a standard taint tracking computation. + * Constructs a global taint tracking computation. */ module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { @@ -54,7 +54,7 @@ deprecated module Make implements DataFlow::GlobalFl } /** - * Constructs a taint tracking computation using flow state. + * Constructs a global taint tracking computation using flow state. */ module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll index 137612c52af..865d7b4d6ce 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlow.qll @@ -222,7 +222,7 @@ signature module GlobalFlowSig { } /** - * Constructs a standard data flow computation. + * Constructs a global data flow computation. */ module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { @@ -239,7 +239,7 @@ deprecated module Make implements GlobalFlowSig { } /** - * Constructs a data flow computation using flow state. + * Constructs a global data flow computation using flow state. */ module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTracking.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTracking.qll index 3f8cef3698a..872ac8d4cb8 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/tainttracking1/TaintTracking.qll @@ -33,7 +33,7 @@ private module AddTaintDefaults imp } /** - * Constructs a standard taint tracking computation. + * Constructs a global taint tracking computation. */ module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { @@ -54,7 +54,7 @@ deprecated module Make implements DataFlow::GlobalFl } /** - * Constructs a taint tracking computation using flow state. + * Constructs a global taint tracking computation using flow state. */ module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { diff --git a/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll b/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll index 137612c52af..865d7b4d6ce 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/DataFlow.qll @@ -222,7 +222,7 @@ signature module GlobalFlowSig { } /** - * Constructs a standard data flow computation. + * Constructs a global data flow computation. */ module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { @@ -239,7 +239,7 @@ deprecated module Make implements GlobalFlowSig { } /** - * Constructs a data flow computation using flow state. + * Constructs a global data flow computation using flow state. */ module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { diff --git a/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTracking.qll b/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTracking.qll index 3f8cef3698a..872ac8d4cb8 100644 --- a/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/go/ql/lib/semmle/go/dataflow/internal/tainttracking1/TaintTracking.qll @@ -33,7 +33,7 @@ private module AddTaintDefaults imp } /** - * Constructs a standard taint tracking computation. + * Constructs a global taint tracking computation. */ module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { @@ -54,7 +54,7 @@ deprecated module Make implements DataFlow::GlobalFl } /** - * Constructs a taint tracking computation using flow state. + * Constructs a global taint tracking computation using flow state. */ module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll index 137612c52af..865d7b4d6ce 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlow.qll @@ -222,7 +222,7 @@ signature module GlobalFlowSig { } /** - * Constructs a standard data flow computation. + * Constructs a global data flow computation. */ module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { @@ -239,7 +239,7 @@ deprecated module Make implements GlobalFlowSig { } /** - * Constructs a data flow computation using flow state. + * Constructs a global data flow computation using flow state. */ module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTracking.qll b/python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTracking.qll index 3f8cef3698a..872ac8d4cb8 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTracking.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/tainttracking1/TaintTracking.qll @@ -33,7 +33,7 @@ private module AddTaintDefaults imp } /** - * Constructs a standard taint tracking computation. + * Constructs a global taint tracking computation. */ module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { @@ -54,7 +54,7 @@ deprecated module Make implements DataFlow::GlobalFl } /** - * Constructs a taint tracking computation using flow state. + * Constructs a global taint tracking computation using flow state. */ module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll index 137612c52af..865d7b4d6ce 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlow.qll @@ -222,7 +222,7 @@ signature module GlobalFlowSig { } /** - * Constructs a standard data flow computation. + * Constructs a global data flow computation. */ module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { @@ -239,7 +239,7 @@ deprecated module Make implements GlobalFlowSig { } /** - * Constructs a data flow computation using flow state. + * Constructs a global data flow computation using flow state. */ module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTracking.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTracking.qll index 3f8cef3698a..872ac8d4cb8 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/tainttracking1/TaintTracking.qll @@ -33,7 +33,7 @@ private module AddTaintDefaults imp } /** - * Constructs a standard taint tracking computation. + * Constructs a global taint tracking computation. */ module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { @@ -54,7 +54,7 @@ deprecated module Make implements DataFlow::GlobalFl } /** - * Constructs a taint tracking computation using flow state. + * Constructs a global taint tracking computation using flow state. */ module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll index 137612c52af..865d7b4d6ce 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/DataFlow.qll @@ -222,7 +222,7 @@ signature module GlobalFlowSig { } /** - * Constructs a standard data flow computation. + * Constructs a global data flow computation. */ module Global implements GlobalFlowSig { private module C implements FullStateConfigSig { @@ -239,7 +239,7 @@ deprecated module Make implements GlobalFlowSig { } /** - * Constructs a data flow computation using flow state. + * Constructs a global data flow computation using flow state. */ module GlobalWithState implements GlobalFlowSig { private module C implements FullStateConfigSig { diff --git a/swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTracking.qll b/swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTracking.qll index 3f8cef3698a..872ac8d4cb8 100644 --- a/swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTracking.qll +++ b/swift/ql/lib/codeql/swift/dataflow/internal/tainttracking1/TaintTracking.qll @@ -33,7 +33,7 @@ private module AddTaintDefaults imp } /** - * Constructs a standard taint tracking computation. + * Constructs a global taint tracking computation. */ module Global implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig { @@ -54,7 +54,7 @@ deprecated module Make implements DataFlow::GlobalFl } /** - * Constructs a taint tracking computation using flow state. + * Constructs a global taint tracking computation using flow state. */ module GlobalWithState implements DataFlow::GlobalFlowSig { private module Config0 implements DataFlowInternal::FullStateConfigSig {