Date: Tue, 16 Sep 2025 13:48:26 +0200
Subject: [PATCH 023/160] Update
javascript/ql/lib/semmle/javascript/frameworks/Express.qll
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
javascript/ql/lib/semmle/javascript/frameworks/Express.qll | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/javascript/ql/lib/semmle/javascript/frameworks/Express.qll b/javascript/ql/lib/semmle/javascript/frameworks/Express.qll
index 41e4d1c860c..be3cb7b1ccb 100644
--- a/javascript/ql/lib/semmle/javascript/frameworks/Express.qll
+++ b/javascript/ql/lib/semmle/javascript/frameworks/Express.qll
@@ -803,7 +803,7 @@ module Express {
}
/**
- * An argument passed to the `json` or `json` method of an HTTP response object.
+ * An argument passed to the `json` or `jsonp` method of an HTTP response object.
*/
private class ResponseJsonCallArgument extends Http::ResponseSendArgument {
ResponseJsonCall call;
From 80ce55ab1072fb534776fc7b02a93ca6a2b18ce2 Mon Sep 17 00:00:00 2001
From: Geoffrey White <40627776+geoffw0@users.noreply.github.com>
Date: Tue, 16 Sep 2025 11:58:23 +0100
Subject: [PATCH 024/160] Rust: Make the private address spaces URL more
accurate.
---
rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll | 2 +-
rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected | 4 ----
rust/ql/test/query-tests/security/CWE-319/main.rs | 2 +-
3 files changed, 2 insertions(+), 6 deletions(-)
diff --git a/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll
index 8001e6270dd..58466dd0a4f 100644
--- a/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll
+++ b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll
@@ -38,7 +38,7 @@ module UseOfHttp {
exists(string s | this.getTextValue() = s |
// Match HTTP URLs that are not private/local
s.regexpMatch("\"http://.*\"") and
- not s.regexpMatch("\"http://(localhost|127\\.0\\.0\\.1|192\\.168\\.[0-9]+\\.[0-9]+|10\\.[0-9]+\\.[0-9]+\\.[0-9]+|172\\.16\\.[0-9]+\\.[0-9]+|\\[::1\\]|\\[0:0:0:0:0:0:0:1\\]).*\"")
+ not s.regexpMatch("\"http://(localhost|127\\.0\\.0\\.1|192\\.168\\.[0-9]+\\.[0-9]+|10\\.[0-9]+\\.[0-9]+\\.[0-9]+|172\\.(1[6-9]|2[0-9]|3[01])\\.[0-9]+|\\[::1\\]|\\[0:0:0:0:0:0:0:1\\]).*\"")
)
}
}
diff --git a/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected
index 216d11b3606..ef99b001fcf 100644
--- a/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected
+++ b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected
@@ -3,7 +3,6 @@
| main.rs:14:22:14:43 | ...::get | main.rs:14:45:14:73 | "http://api.example.com/data" | main.rs:14:22:14:43 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:14:45:14:73 | "http://api.example.com/data" | this HTTP URL |
| main.rs:26:21:26:42 | ...::get | main.rs:23:20:23:39 | "http://example.com" | main.rs:26:21:26:42 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:23:20:23:39 | "http://example.com" | this HTTP URL |
| main.rs:37:30:37:51 | ...::get | main.rs:34:20:34:28 | "http://" | main.rs:37:30:37:51 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:34:20:34:28 | "http://" | this HTTP URL |
-| main.rs:53:19:53:40 | ...::get | main.rs:53:42:53:68 | "http://172.31.255.255/bar" | main.rs:53:19:53:40 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:53:42:53:68 | "http://172.31.255.255/bar" | this HTTP URL |
| main.rs:60:20:60:41 | ...::get | main.rs:60:43:60:65 | "http://172.32.0.0/baz" | main.rs:60:20:60:41 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:60:43:60:65 | "http://172.32.0.0/baz" | this HTTP URL |
| main.rs:71:24:71:45 | ...::get | main.rs:68:19:68:53 | "http://example.com/sensitive-... | main.rs:71:24:71:45 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:68:19:68:53 | "http://example.com/sensitive-... | this HTTP URL |
edges
@@ -29,7 +28,6 @@ edges
| main.rs:36:32:36:53 | { ... } | main.rs:36:32:36:53 | ...::must_use(...) | provenance | MaD:3 |
| main.rs:37:53:37:65 | &insecure_url [&ref] | main.rs:37:30:37:51 | ...::get | provenance | MaD:1 Sink:MaD:1 |
| main.rs:37:54:37:65 | insecure_url | main.rs:37:53:37:65 | &insecure_url [&ref] | provenance | |
-| main.rs:53:42:53:68 | "http://172.31.255.255/bar" | main.rs:53:19:53:40 | ...::get | provenance | MaD:1 Sink:MaD:1 |
| main.rs:60:43:60:65 | "http://172.32.0.0/baz" | main.rs:60:20:60:41 | ...::get | provenance | MaD:1 Sink:MaD:1 |
| main.rs:68:13:68:15 | url | main.rs:71:47:71:49 | url | provenance | |
| main.rs:68:19:68:53 | "http://example.com/sensitive-... | main.rs:68:13:68:15 | url | provenance | |
@@ -65,8 +63,6 @@ nodes
| main.rs:37:30:37:51 | ...::get | semmle.label | ...::get |
| main.rs:37:53:37:65 | &insecure_url [&ref] | semmle.label | &insecure_url [&ref] |
| main.rs:37:54:37:65 | insecure_url | semmle.label | insecure_url |
-| main.rs:53:19:53:40 | ...::get | semmle.label | ...::get |
-| main.rs:53:42:53:68 | "http://172.31.255.255/bar" | semmle.label | "http://172.31.255.255/bar" |
| main.rs:60:20:60:41 | ...::get | semmle.label | ...::get |
| main.rs:60:43:60:65 | "http://172.32.0.0/baz" | semmle.label | "http://172.32.0.0/baz" |
| main.rs:68:13:68:15 | url | semmle.label | url |
diff --git a/rust/ql/test/query-tests/security/CWE-319/main.rs b/rust/ql/test/query-tests/security/CWE-319/main.rs
index 0dd59ce0880..908e6c61c2c 100644
--- a/rust/ql/test/query-tests/security/CWE-319/main.rs
+++ b/rust/ql/test/query-tests/security/CWE-319/main.rs
@@ -50,7 +50,7 @@ fn test_localhost_exemptions() {
let _local4 = reqwest::blocking::get("http://192.168.1.100/internal").unwrap();
let _local5 = reqwest::blocking::get("http://10.0.0.1/admin").unwrap();
let _local6 = reqwest::blocking::get("http://172.16.0.0/foo").unwrap();
- let _local7 = reqwest::blocking::get("http://172.31.255.255/bar").unwrap(); // $ SPURIOUS: Alert[rust/non-https-url]
+ let _local7 = reqwest::blocking::get("http://172.31.255.255/bar").unwrap();
// GOOD: test IPv6 localhost variants
let _local8 = reqwest::blocking::get("http://[::1]:8080/api").unwrap();
From 4b281fdf12fb8a64cd194aee324ded70855b4695 Mon Sep 17 00:00:00 2001
From: Geoffrey White <40627776+geoffw0@users.noreply.github.com>
Date: Tue, 16 Sep 2025 13:02:54 +0100
Subject: [PATCH 025/160] Rust: Use case insensitive regexps.
---
rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll | 4 ++--
rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected | 4 ++++
rust/ql/test/query-tests/security/CWE-319/main.rs | 2 +-
3 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll
index 58466dd0a4f..5e0d534fb7d 100644
--- a/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll
+++ b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll
@@ -37,8 +37,8 @@ module UseOfHttp {
HttpStringLiteral() {
exists(string s | this.getTextValue() = s |
// Match HTTP URLs that are not private/local
- s.regexpMatch("\"http://.*\"") and
- not s.regexpMatch("\"http://(localhost|127\\.0\\.0\\.1|192\\.168\\.[0-9]+\\.[0-9]+|10\\.[0-9]+\\.[0-9]+\\.[0-9]+|172\\.(1[6-9]|2[0-9]|3[01])\\.[0-9]+|\\[::1\\]|\\[0:0:0:0:0:0:0:1\\]).*\"")
+ s.regexpMatch("(?i)\"http://.*\"") and
+ not s.regexpMatch("(?i)\"http://(localhost|127\\.0\\.0\\.1|192\\.168\\.[0-9]+\\.[0-9]+|10\\.[0-9]+\\.[0-9]+\\.[0-9]+|172\\.(1[6-9]|2[0-9]|3[01])\\.[0-9]+|\\[::1\\]|\\[0:0:0:0:0:0:0:1\\]).*\"")
)
}
}
diff --git a/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected
index ef99b001fcf..952bd741d1c 100644
--- a/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected
+++ b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected
@@ -1,5 +1,6 @@
#select
| main.rs:12:22:12:43 | ...::get | main.rs:12:45:12:68 | "http://example.com/api" | main.rs:12:22:12:43 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:12:45:12:68 | "http://example.com/api" | this HTTP URL |
+| main.rs:13:22:13:43 | ...::get | main.rs:13:45:13:68 | "HTTP://EXAMPLE.COM/API" | main.rs:13:22:13:43 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:13:45:13:68 | "HTTP://EXAMPLE.COM/API" | this HTTP URL |
| main.rs:14:22:14:43 | ...::get | main.rs:14:45:14:73 | "http://api.example.com/data" | main.rs:14:22:14:43 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:14:45:14:73 | "http://api.example.com/data" | this HTTP URL |
| main.rs:26:21:26:42 | ...::get | main.rs:23:20:23:39 | "http://example.com" | main.rs:26:21:26:42 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:23:20:23:39 | "http://example.com" | this HTTP URL |
| main.rs:37:30:37:51 | ...::get | main.rs:34:20:34:28 | "http://" | main.rs:37:30:37:51 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:34:20:34:28 | "http://" | this HTTP URL |
@@ -7,6 +8,7 @@
| main.rs:71:24:71:45 | ...::get | main.rs:68:19:68:53 | "http://example.com/sensitive-... | main.rs:71:24:71:45 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:68:19:68:53 | "http://example.com/sensitive-... | this HTTP URL |
edges
| main.rs:12:45:12:68 | "http://example.com/api" | main.rs:12:22:12:43 | ...::get | provenance | MaD:1 Sink:MaD:1 |
+| main.rs:13:45:13:68 | "HTTP://EXAMPLE.COM/API" | main.rs:13:22:13:43 | ...::get | provenance | MaD:1 Sink:MaD:1 |
| main.rs:14:45:14:73 | "http://api.example.com/data" | main.rs:14:22:14:43 | ...::get | provenance | MaD:1 Sink:MaD:1 |
| main.rs:23:9:23:16 | base_url | main.rs:25:28:25:53 | MacroExpr | provenance | |
| main.rs:23:20:23:39 | "http://example.com" | main.rs:23:9:23:16 | base_url | provenance | |
@@ -39,6 +41,8 @@ models
nodes
| main.rs:12:22:12:43 | ...::get | semmle.label | ...::get |
| main.rs:12:45:12:68 | "http://example.com/api" | semmle.label | "http://example.com/api" |
+| main.rs:13:22:13:43 | ...::get | semmle.label | ...::get |
+| main.rs:13:45:13:68 | "HTTP://EXAMPLE.COM/API" | semmle.label | "HTTP://EXAMPLE.COM/API" |
| main.rs:14:22:14:43 | ...::get | semmle.label | ...::get |
| main.rs:14:45:14:73 | "http://api.example.com/data" | semmle.label | "http://api.example.com/data" |
| main.rs:23:9:23:16 | base_url | semmle.label | base_url |
diff --git a/rust/ql/test/query-tests/security/CWE-319/main.rs b/rust/ql/test/query-tests/security/CWE-319/main.rs
index 908e6c61c2c..0a3539923da 100644
--- a/rust/ql/test/query-tests/security/CWE-319/main.rs
+++ b/rust/ql/test/query-tests/security/CWE-319/main.rs
@@ -10,7 +10,7 @@ fn main() {
fn test_direct_literals() {
// BAD: Direct HTTP URLs that should be flagged
let _response1 = reqwest::blocking::get("http://example.com/api").unwrap(); // $ Alert[rust/non-https-url]
- let _response2 = reqwest::blocking::get("HTTP://EXAMPLE.COM/API").unwrap(); // $ MISSING: Alert[rust/non-https-url]
+ let _response2 = reqwest::blocking::get("HTTP://EXAMPLE.COM/API").unwrap(); // $ Alert[rust/non-https-url]
let _response3 = reqwest::blocking::get("http://api.example.com/data").unwrap(); // $ Alert[rust/non-https-url]
// GOOD: HTTPS URLs that should not be flagged
From 0eb602aad2991216268e79bbe5db05472f2156c0 Mon Sep 17 00:00:00 2001
From: Geoffrey White <40627776+geoffw0@users.noreply.github.com>
Date: Tue, 16 Sep 2025 14:00:43 +0100
Subject: [PATCH 026/160] Rust: Update a redirected URL.
---
.../src/queries/security/CWE-319/UseOfHttp.qhelp | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp b/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp
index a8ca1d9c7c7..a1345b189bb 100644
--- a/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp
+++ b/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp
@@ -6,21 +6,21 @@
Constructing URLs with the HTTP protocol can lead to unsecured connections.
-Furthermore, constructing URLs with the HTTP protocol can create problems if other parts of the
-code expect HTTPS URLs. A typical pattern is to use libraries that expect secure connections,
+
Furthermore, constructing URLs with the HTTP protocol can create problems if other parts of the
+code expect HTTPS URLs. A typical pattern is to use libraries that expect secure connections,
which may fail or fall back to insecure behavior when provided with HTTP URLs instead of HTTPS URLs.
-When you construct a URL for network requests, ensure that you use an HTTPS URL rather than an HTTP URL.
+
When you construct a URL for network requests, ensure that you use an HTTPS URL rather than an HTTP URL.
Then, any connections that are made using that URL are secure SSL/TLS connections.
-The following example shows two ways of making a network request using a URL. When the request is
-made using an HTTP URL rather than an HTTPS URL, the connection is unsecured and can be intercepted
+
The following example shows two ways of making a network request using a URL. When the request is
+made using an HTTP URL rather than an HTTPS URL, the connection is unsecured and can be intercepted
by attackers. When the request is made using an HTTPS URL, the connection is a secure SSL/TLS connection.
@@ -34,15 +34,15 @@ by attackers. When the request is made using an HTTPS URL, the connection is a s
OWASP:
-Transport Layer Protection Cheat Sheet.
+Transport Layer Security Cheat Sheet.
OWASP Top 10:
A08:2021 - Software and Data Integrity Failures.
-Rust reqwest documentation:
+Rust reqwest documentation:
reqwest crate.
-
\ No newline at end of file
+
From 31bf86fd1bcb60946c038d1329f132647bc60288 Mon Sep 17 00:00:00 2001
From: Geoffrey White <40627776+geoffw0@users.noreply.github.com>
Date: Tue, 16 Sep 2025 14:04:47 +0100
Subject: [PATCH 027/160] Rust: Improve the flow around the qhelp example.
---
rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp b/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp
index a1345b189bb..e4e0fc5eaa9 100644
--- a/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp
+++ b/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp
@@ -19,13 +19,14 @@ Then, any connections that are made using that URL are secure SSL/TLS connection
-The following example shows two ways of making a network request using a URL. When the request is
+
The following examples show two ways of making a network request using a URL. When the request is
made using an HTTP URL rather than an HTTPS URL, the connection is unsecured and can be intercepted
-by attackers. When the request is made using an HTTPS URL, the connection is a secure SSL/TLS connection.
+by attackers:
-A better approach is to use HTTPS:
+A better approach is to use HTTPS. When the request is made using an HTTPS URL, the connection
+is a secure SSL/TLS connection:
From ffd32efba274f0b1400d592562f24cae4a286ddf Mon Sep 17 00:00:00 2001
From: Chad Bentz <1760475+felickz@users.noreply.github.com>
Date: Tue, 16 Sep 2025 09:08:07 -0400
Subject: [PATCH 028/160] codeql query format
---
ruby/ql/lib/codeql/ruby/frameworks/Grape.qll | 37 ++++++-------------
.../library-tests/frameworks/grape/Grape.ql | 2 +-
2 files changed, 12 insertions(+), 27 deletions(-)
diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll b/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll
index faf762f53a0..ea7bc8c576c 100644
--- a/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll
+++ b/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll
@@ -52,9 +52,7 @@ class GrapeApiClass extends DataFlow::ClassNode {
/**
* Gets a `GrapeEndpoint` defined in this class.
*/
- GrapeEndpoint getAnEndpoint() {
- result.getApiClass() = this
- }
+ GrapeEndpoint getAnEndpoint() { result.getApiClass() = this }
/**
* Gets a `self` that possibly refers to an instance of this class.
@@ -72,9 +70,7 @@ private DataFlow::ConstRef grapeApiBaseClass() {
result = DataFlow::getConstant("Grape").getConstant("API")
}
-private API::Node grapeApiInstance() {
- result = any(GrapeApiClass cls).getSelf().track()
-}
+private API::Node grapeApiInstance() { result = any(GrapeApiClass cls).getSelf().track() }
/**
* A Grape API endpoint (get, post, put, delete, etc.) call within a `Grape::API` class.
@@ -83,15 +79,14 @@ class GrapeEndpoint extends DataFlow::CallNode {
private GrapeApiClass apiClass;
GrapeEndpoint() {
- this = apiClass.getAModuleLevelCall(["get", "post", "put", "delete", "patch", "head", "options"])
+ this =
+ apiClass.getAModuleLevelCall(["get", "post", "put", "delete", "patch", "head", "options"])
}
/**
* Gets the HTTP method for this endpoint (e.g., "GET", "POST", etc.)
*/
- string getHttpMethod() {
- result = this.getMethodName().toUpperCase()
- }
+ string getHttpMethod() { result = this.getMethodName().toUpperCase() }
/**
* Gets the API class containing this endpoint.
@@ -106,9 +101,7 @@ class GrapeEndpoint extends DataFlow::CallNode {
/**
* Gets the path pattern for this endpoint, if specified.
*/
- string getPath() {
- result = this.getArgument(0).getConstantValue().getString()
- }
+ string getPath() { result = this.getArgument(0).getConstantValue().getString() }
}
/**
@@ -116,9 +109,7 @@ class GrapeEndpoint extends DataFlow::CallNode {
* Grape parameters available via the `params` method within an endpoint.
*/
class GrapeParamsSource extends Http::Server::RequestInputAccess::Range {
- GrapeParamsSource() {
- this.asExpr().getExpr() instanceof GrapeParamsCall
- }
+ GrapeParamsSource() { this.asExpr().getExpr() instanceof GrapeParamsCall }
override string getSourceType() { result = "Grape::API#params" }
@@ -174,9 +165,7 @@ private class GrapeHeadersCall extends MethodCall {
* The request object can contain user input.
*/
class GrapeRequestSource extends Http::Server::RequestInputAccess::Range {
- GrapeRequestSource() {
- this.asExpr().getExpr() instanceof GrapeRequestCall
- }
+ GrapeRequestSource() { this.asExpr().getExpr() instanceof GrapeRequestCall }
override string getSourceType() { result = "Grape::API#request" }
@@ -188,9 +177,7 @@ class GrapeRequestSource extends Http::Server::RequestInputAccess::Range {
* Route parameters are extracted from the URL path and can be a source of user input.
*/
class GrapeRouteParamSource extends Http::Server::RequestInputAccess::Range {
- GrapeRouteParamSource() {
- this.asExpr().getExpr() instanceof GrapeRouteParamCall
- }
+ GrapeRouteParamSource() { this.asExpr().getExpr() instanceof GrapeRouteParamCall }
override string getSourceType() { result = "Grape::API#route_param" }
@@ -316,12 +303,10 @@ private class GrapeHelperMethodTaintStep extends AdditionalTaintStep {
exists(GrapeHelperMethod helperMethod, MethodCall call, int i |
// Find calls to helper methods from within Grape endpoints
call.getMethodName() = helperMethod.getName() and
- exists(GrapeEndpoint endpoint |
- call.getParent+() = endpoint.getBody().asExpr().getExpr()
- ) and
+ exists(GrapeEndpoint endpoint | call.getParent+() = endpoint.getBody().asExpr().getExpr()) and
// Map argument to parameter
nodeFrom.asExpr().getExpr() = call.getArgument(i) and
nodeTo.asParameter() = helperMethod.getParameter(i)
)
}
-}
\ No newline at end of file
+}
diff --git a/ruby/ql/test/library-tests/frameworks/grape/Grape.ql b/ruby/ql/test/library-tests/frameworks/grape/Grape.ql
index ebfb304dbe7..c9aa7c29082 100644
--- a/ruby/ql/test/library-tests/frameworks/grape/Grape.ql
+++ b/ruby/ql/test/library-tests/frameworks/grape/Grape.ql
@@ -19,4 +19,4 @@ query predicate grapeRequest(GrapeRequestSource request) { any() }
query predicate grapeRouteParam(GrapeRouteParamSource routeParam) { any() }
-query predicate grapeCookies(GrapeCookiesSource cookies) { any() }
\ No newline at end of file
+query predicate grapeCookies(GrapeCookiesSource cookies) { any() }
From 220197484489f80467cee4cfcb3e975ed018d0d2 Mon Sep 17 00:00:00 2001
From: Alex Eyers-Taylor
Date: Thu, 21 Aug 2025 19:48:21 +0100
Subject: [PATCH 029/160] Jave: Use force local to make parsing local after
global regex finding.
---
.../semmle/code/java/regex/RegexFlowConfigs.qll | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/java/ql/lib/semmle/code/java/regex/RegexFlowConfigs.qll b/java/ql/lib/semmle/code/java/regex/RegexFlowConfigs.qll
index 6a934bdd578..929fa2d6c91 100644
--- a/java/ql/lib/semmle/code/java/regex/RegexFlowConfigs.qll
+++ b/java/ql/lib/semmle/code/java/regex/RegexFlowConfigs.qll
@@ -163,6 +163,12 @@ private module RegexFlowConfig implements DataFlow::ConfigSig {
private module RegexFlow = DataFlow::Global;
+private predicate usedAsRegexImpl(StringLiteral regex, string mode, boolean match_full_string) {
+ RegexFlow::flow(DataFlow::exprNode(regex), _) and
+ mode = "None" and // TODO: proper mode detection
+ (if matchesFullString(regex) then match_full_string = true else match_full_string = false)
+}
+
/**
* Holds if `regex` is used as a regex, with the mode `mode` (if known).
* If regex mode is not known, `mode` will be `"None"`.
@@ -170,11 +176,9 @@ private module RegexFlow = DataFlow::Global;
* As an optimisation, only regexes containing an infinite repitition quatifier (`+`, `*`, or `{x,}`)
* and therefore may be relevant for ReDoS queries are considered.
*/
-predicate usedAsRegex(StringLiteral regex, string mode, boolean match_full_string) {
- RegexFlow::flow(DataFlow::exprNode(regex), _) and
- mode = "None" and // TODO: proper mode detection
- (if matchesFullString(regex) then match_full_string = true else match_full_string = false)
-}
+overlay[local]
+predicate usedAsRegex(StringLiteral regex, string mode, boolean match_full_string) =
+ forceLocal(usedAsRegexImpl/3)(regex, mode, match_full_string)
/**
* Holds if `regex` is used as a regular expression that is matched against a full string,
From 6f1fcbf41bf7484025a208af19a19630dc3a4df9 Mon Sep 17 00:00:00 2001
From: Geoffrey White <40627776+geoffw0@users.noreply.github.com>
Date: Tue, 16 Sep 2025 17:08:22 +0100
Subject: [PATCH 030/160] Rust: Add IPv6 private address range (and explanatory
comments).
---
rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll
index 5e0d534fb7d..bd91cde238f 100644
--- a/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll
+++ b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll
@@ -36,9 +36,12 @@ module UseOfHttp {
class HttpStringLiteral extends StringLiteralExpr {
HttpStringLiteral() {
exists(string s | this.getTextValue() = s |
- // Match HTTP URLs that are not private/local
+ // match HTTP URLs
s.regexpMatch("(?i)\"http://.*\"") and
- not s.regexpMatch("(?i)\"http://(localhost|127\\.0\\.0\\.1|192\\.168\\.[0-9]+\\.[0-9]+|10\\.[0-9]+\\.[0-9]+\\.[0-9]+|172\\.(1[6-9]|2[0-9]|3[01])\\.[0-9]+|\\[::1\\]|\\[0:0:0:0:0:0:0:1\\]).*\"")
+ // exclude private/local addresses:
+ // - IPv4: localhost / 127.0.0.1, 192.168.x.x, 10.x.x.x, 172.16.x.x -> 172.31.x.x
+ // - IPv6 (address inside []): ::1 (or 0:0:0:0:0:0:0:1), fc00::/7 (i.e. anything beginning `fcxx:` or `fdxx:`)
+ not s.regexpMatch("(?i)\"http://(localhost|127\\.0\\.0\\.1|192\\.168\\.[0-9]+\\.[0-9]+|10\\.[0-9]+\\.[0-9]+\\.[0-9]+|172\\.(1[6-9]|2[0-9]|3[01])\\.[0-9]+|\\[::1\\]|\\[0:0:0:0:0:0:0:1\\]|\\[f[cd][0-9a-f]{2}:.*\\]).*\"")
)
}
}
From c5e3be2c4cc30b1d8b92dfde67097577d4867dc0 Mon Sep 17 00:00:00 2001
From: Chad Bentz <1760475+felickz@users.noreply.github.com>
Date: Tue, 16 Sep 2025 17:09:18 -0400
Subject: [PATCH 031/160] Grape - detect params calls inside helper methods -
added unit tests for flow using inline format - removed grape from Arel tests
(temporary)
---
ruby/ql/lib/codeql/ruby/frameworks/Grape.qll | 28 ++++++-
.../frameworks/grape/Flow.expected | 77 +++++++++++++++++++
.../library-tests/frameworks/grape/Flow.ql | 25 ++++++
.../frameworks/grape/Grape.expected | 16 ++++
.../library-tests/frameworks/grape/app.rb | 74 +++++++++++++++++-
.../security/cwe-089/ArelInjection.rb | 64 +--------------
.../security/cwe-089/SqlInjection.expected | 66 ----------------
7 files changed, 216 insertions(+), 134 deletions(-)
create mode 100644 ruby/ql/test/library-tests/frameworks/grape/Flow.expected
create mode 100644 ruby/ql/test/library-tests/frameworks/grape/Flow.ql
diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll b/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll
index ea7bc8c576c..a1646b8654c 100644
--- a/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll
+++ b/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll
@@ -121,11 +121,18 @@ class GrapeParamsSource extends Http::Server::RequestInputAccess::Range {
*/
private class GrapeParamsCall extends ParamsCallImpl {
GrapeParamsCall() {
- // Simplified approach: find params calls that are descendants of Grape API class methods
+ // Params calls within endpoint blocks
exists(GrapeApiClass api |
this.getMethodName() = "params" and
this.getParent+() = api.getADeclaration()
)
+ or
+ // Params calls within helper methods (defined in helpers blocks)
+ exists(GrapeApiClass api, DataFlow::CallNode helpersCall |
+ helpersCall = api.getAModuleLevelCall("helpers") and
+ this.getMethodName() = "params" and
+ this.getParent+() = helpersCall.getBlock().asExpr().getExpr()
+ )
}
}
@@ -295,18 +302,31 @@ private class GrapeHelperMethod extends Method {
/**
* Additional taint step to model dataflow from method arguments to parameters
- * for Grape helper methods defined in `helpers` blocks.
+ * and from return values back to call sites for Grape helper methods defined in `helpers` blocks.
* This bridges the gap where standard dataflow doesn't recognize the Grape DSL semantics.
*/
private class GrapeHelperMethodTaintStep extends AdditionalTaintStep {
override predicate step(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) {
+ // Map arguments to parameters for helper method calls
exists(GrapeHelperMethod helperMethod, MethodCall call, int i |
- // Find calls to helper methods from within Grape endpoints
+ // Find calls to helper methods from within Grape endpoints or other helper methods
call.getMethodName() = helperMethod.getName() and
- exists(GrapeEndpoint endpoint | call.getParent+() = endpoint.getBody().asExpr().getExpr()) and
+ exists(GrapeApiClass api | call.getParent+() = api.getADeclaration()) and
// Map argument to parameter
nodeFrom.asExpr().getExpr() = call.getArgument(i) and
nodeTo.asParameter() = helperMethod.getParameter(i)
)
+ or
+ // Model implicit return values: the last expression in a helper method flows to the call site
+ exists(GrapeHelperMethod helperMethod, MethodCall helperCall, Expr lastExpr |
+ // Find calls to helper methods from within Grape endpoints or other helper methods
+ helperCall.getMethodName() = helperMethod.getName() and
+ exists(GrapeApiClass api | helperCall.getParent+() = api.getADeclaration()) and
+ // Get the last expression in the helper method (Ruby's implicit return)
+ lastExpr = helperMethod.getLastStmt() and
+ // Flow from the last expression in the helper method to the call site
+ nodeFrom.asExpr().getExpr() = lastExpr and
+ nodeTo.asExpr().getExpr() = helperCall
+ )
}
}
diff --git a/ruby/ql/test/library-tests/frameworks/grape/Flow.expected b/ruby/ql/test/library-tests/frameworks/grape/Flow.expected
new file mode 100644
index 00000000000..0fd19d4eace
--- /dev/null
+++ b/ruby/ql/test/library-tests/frameworks/grape/Flow.expected
@@ -0,0 +1,77 @@
+models
+edges
+| app.rb:103:13:103:18 | call to params | app.rb:103:13:103:70 | call to select | provenance | |
+| app.rb:103:13:103:70 | call to select | app.rb:149:21:149:31 | call to user_params | provenance | AdditionalTaintStep |
+| app.rb:103:13:103:70 | call to select | app.rb:165:21:165:31 | call to user_params | provenance | AdditionalTaintStep |
+| app.rb:107:13:107:32 | call to source | app.rb:143:18:143:43 | call to vulnerable_helper | provenance | AdditionalTaintStep |
+| app.rb:111:13:111:33 | call to source | app.rb:150:25:150:37 | call to simple_helper | provenance | AdditionalTaintStep |
+| app.rb:126:9:126:15 | user_id | app.rb:133:14:133:20 | user_id | provenance | |
+| app.rb:126:19:126:24 | call to params | app.rb:126:19:126:34 | ...[...] | provenance | |
+| app.rb:126:19:126:34 | ...[...] | app.rb:126:9:126:15 | user_id | provenance | |
+| app.rb:127:9:127:16 | route_id | app.rb:134:14:134:21 | route_id | provenance | |
+| app.rb:127:20:127:40 | call to route_param | app.rb:127:9:127:16 | route_id | provenance | |
+| app.rb:128:9:128:12 | auth | app.rb:135:14:135:17 | auth | provenance | |
+| app.rb:128:16:128:22 | call to headers | app.rb:128:16:128:38 | ...[...] | provenance | |
+| app.rb:128:16:128:38 | ...[...] | app.rb:128:9:128:12 | auth | provenance | |
+| app.rb:129:9:129:15 | session | app.rb:136:14:136:20 | session | provenance | |
+| app.rb:129:19:129:25 | call to cookies | app.rb:129:19:129:38 | ...[...] | provenance | |
+| app.rb:129:19:129:38 | ...[...] | app.rb:129:9:129:15 | session | provenance | |
+| app.rb:143:9:143:14 | result | app.rb:144:14:144:19 | result | provenance | |
+| app.rb:143:18:143:43 | call to vulnerable_helper | app.rb:143:9:143:14 | result | provenance | |
+| app.rb:149:9:149:17 | user_data | app.rb:151:14:151:22 | user_data | provenance | |
+| app.rb:149:21:149:31 | call to user_params | app.rb:149:9:149:17 | user_data | provenance | |
+| app.rb:150:9:150:21 | simple_result | app.rb:152:14:152:26 | simple_result | provenance | |
+| app.rb:150:25:150:37 | call to simple_helper | app.rb:150:9:150:21 | simple_result | provenance | |
+| app.rb:159:13:159:19 | user_id | app.rb:160:18:160:24 | user_id | provenance | |
+| app.rb:159:23:159:28 | call to params | app.rb:159:23:159:33 | ...[...] | provenance | |
+| app.rb:159:23:159:33 | ...[...] | app.rb:159:13:159:19 | user_id | provenance | |
+| app.rb:165:9:165:17 | user_data | app.rb:166:14:166:22 | user_data | provenance | |
+| app.rb:165:21:165:31 | call to user_params | app.rb:165:9:165:17 | user_data | provenance | |
+nodes
+| app.rb:103:13:103:18 | call to params | semmle.label | call to params |
+| app.rb:103:13:103:70 | call to select | semmle.label | call to select |
+| app.rb:107:13:107:32 | call to source | semmle.label | call to source |
+| app.rb:111:13:111:33 | call to source | semmle.label | call to source |
+| app.rb:126:9:126:15 | user_id | semmle.label | user_id |
+| app.rb:126:19:126:24 | call to params | semmle.label | call to params |
+| app.rb:126:19:126:34 | ...[...] | semmle.label | ...[...] |
+| app.rb:127:9:127:16 | route_id | semmle.label | route_id |
+| app.rb:127:20:127:40 | call to route_param | semmle.label | call to route_param |
+| app.rb:128:9:128:12 | auth | semmle.label | auth |
+| app.rb:128:16:128:22 | call to headers | semmle.label | call to headers |
+| app.rb:128:16:128:38 | ...[...] | semmle.label | ...[...] |
+| app.rb:129:9:129:15 | session | semmle.label | session |
+| app.rb:129:19:129:25 | call to cookies | semmle.label | call to cookies |
+| app.rb:129:19:129:38 | ...[...] | semmle.label | ...[...] |
+| app.rb:133:14:133:20 | user_id | semmle.label | user_id |
+| app.rb:134:14:134:21 | route_id | semmle.label | route_id |
+| app.rb:135:14:135:17 | auth | semmle.label | auth |
+| app.rb:136:14:136:20 | session | semmle.label | session |
+| app.rb:143:9:143:14 | result | semmle.label | result |
+| app.rb:143:18:143:43 | call to vulnerable_helper | semmle.label | call to vulnerable_helper |
+| app.rb:144:14:144:19 | result | semmle.label | result |
+| app.rb:149:9:149:17 | user_data | semmle.label | user_data |
+| app.rb:149:21:149:31 | call to user_params | semmle.label | call to user_params |
+| app.rb:150:9:150:21 | simple_result | semmle.label | simple_result |
+| app.rb:150:25:150:37 | call to simple_helper | semmle.label | call to simple_helper |
+| app.rb:151:14:151:22 | user_data | semmle.label | user_data |
+| app.rb:152:14:152:26 | simple_result | semmle.label | simple_result |
+| app.rb:159:13:159:19 | user_id | semmle.label | user_id |
+| app.rb:159:23:159:28 | call to params | semmle.label | call to params |
+| app.rb:159:23:159:33 | ...[...] | semmle.label | ...[...] |
+| app.rb:160:18:160:24 | user_id | semmle.label | user_id |
+| app.rb:165:9:165:17 | user_data | semmle.label | user_data |
+| app.rb:165:21:165:31 | call to user_params | semmle.label | call to user_params |
+| app.rb:166:14:166:22 | user_data | semmle.label | user_data |
+subpaths
+testFailures
+#select
+| app.rb:133:14:133:20 | user_id | app.rb:126:19:126:24 | call to params | app.rb:133:14:133:20 | user_id | $@ | app.rb:126:19:126:24 | call to params | call to params |
+| app.rb:134:14:134:21 | route_id | app.rb:127:20:127:40 | call to route_param | app.rb:134:14:134:21 | route_id | $@ | app.rb:127:20:127:40 | call to route_param | call to route_param |
+| app.rb:135:14:135:17 | auth | app.rb:128:16:128:22 | call to headers | app.rb:135:14:135:17 | auth | $@ | app.rb:128:16:128:22 | call to headers | call to headers |
+| app.rb:136:14:136:20 | session | app.rb:129:19:129:25 | call to cookies | app.rb:136:14:136:20 | session | $@ | app.rb:129:19:129:25 | call to cookies | call to cookies |
+| app.rb:144:14:144:19 | result | app.rb:107:13:107:32 | call to source | app.rb:144:14:144:19 | result | $@ | app.rb:107:13:107:32 | call to source | call to source |
+| app.rb:151:14:151:22 | user_data | app.rb:103:13:103:18 | call to params | app.rb:151:14:151:22 | user_data | $@ | app.rb:103:13:103:18 | call to params | call to params |
+| app.rb:152:14:152:26 | simple_result | app.rb:111:13:111:33 | call to source | app.rb:152:14:152:26 | simple_result | $@ | app.rb:111:13:111:33 | call to source | call to source |
+| app.rb:160:18:160:24 | user_id | app.rb:159:23:159:28 | call to params | app.rb:160:18:160:24 | user_id | $@ | app.rb:159:23:159:28 | call to params | call to params |
+| app.rb:166:14:166:22 | user_data | app.rb:103:13:103:18 | call to params | app.rb:166:14:166:22 | user_data | $@ | app.rb:103:13:103:18 | call to params | call to params |
diff --git a/ruby/ql/test/library-tests/frameworks/grape/Flow.ql b/ruby/ql/test/library-tests/frameworks/grape/Flow.ql
new file mode 100644
index 00000000000..baa3fa4307f
--- /dev/null
+++ b/ruby/ql/test/library-tests/frameworks/grape/Flow.ql
@@ -0,0 +1,25 @@
+/**
+ * @kind path-problem
+ */
+
+import ruby
+import utils.test.InlineFlowTest
+import PathGraph
+import codeql.ruby.frameworks.Grape
+import codeql.ruby.Concepts
+
+module GrapeConfig implements DataFlow::ConfigSig {
+ predicate isSource(DataFlow::Node source) {
+ source instanceof Http::Server::RequestInputAccess::Range
+ or
+ DefaultFlowConfig::isSource(source)
+ }
+
+ predicate isSink(DataFlow::Node sink) { DefaultFlowConfig::isSink(sink) }
+}
+
+import FlowTest
+
+from PathNode source, PathNode sink
+where flowPath(source, sink)
+select sink, source, sink, "$@", source, source.toString()
diff --git a/ruby/ql/test/library-tests/frameworks/grape/Grape.expected b/ruby/ql/test/library-tests/frameworks/grape/Grape.expected
index af4d936e88d..d39d9430f92 100644
--- a/ruby/ql/test/library-tests/frameworks/grape/Grape.expected
+++ b/ruby/ql/test/library-tests/frameworks/grape/Grape.expected
@@ -1,6 +1,7 @@
grapeApiClasses
| app.rb:1:1:90:3 | MyAPI |
| app.rb:92:1:96:3 | AdminAPI |
+| app.rb:98:1:168:3 | UserAPI |
grapeEndpoints
| app.rb:1:1:90:3 | MyAPI | app.rb:7:3:11:5 | call to get | GET | /hello/:name |
| app.rb:1:1:90:3 | MyAPI | app.rb:17:3:20:5 | call to post | POST | /messages |
@@ -13,6 +14,10 @@ grapeEndpoints
| app.rb:1:1:90:3 | MyAPI | app.rb:78:3:82:5 | call to get | GET | /cookie_test |
| app.rb:1:1:90:3 | MyAPI | app.rb:85:3:89:5 | call to get | GET | /header_test |
| app.rb:92:1:96:3 | AdminAPI | app.rb:93:3:95:5 | call to get | GET | /admin |
+| app.rb:98:1:168:3 | UserAPI | app.rb:124:5:138:7 | call to get | GET | /comprehensive_test/:user_id |
+| app.rb:98:1:168:3 | UserAPI | app.rb:140:5:145:7 | call to get | GET | /helper_test/:user_id |
+| app.rb:98:1:168:3 | UserAPI | app.rb:147:5:153:7 | call to post | POST | /users |
+| app.rb:98:1:168:3 | UserAPI | app.rb:164:5:167:7 | call to post | POST | /users |
grapeParams
| app.rb:8:12:8:17 | call to params |
| app.rb:14:3:16:5 | call to params |
@@ -22,19 +27,30 @@ grapeParams
| app.rb:36:5:36:10 | call to params |
| app.rb:60:12:60:17 | call to params |
| app.rb:94:5:94:10 | call to params |
+| app.rb:103:13:103:18 | call to params |
+| app.rb:126:19:126:24 | call to params |
+| app.rb:142:19:142:24 | call to params |
+| app.rb:159:23:159:28 | call to params |
grapeHeaders
| app.rb:9:18:9:24 | call to headers |
| app.rb:46:5:46:11 | call to headers |
| app.rb:66:3:69:5 | call to headers |
| app.rb:86:12:86:18 | call to headers |
| app.rb:87:14:87:20 | call to headers |
+| app.rb:116:5:118:7 | call to headers |
+| app.rb:128:16:128:22 | call to headers |
grapeRequest
| app.rb:25:12:25:18 | call to request |
+| app.rb:130:21:130:27 | call to request |
grapeRouteParam
| app.rb:51:15:51:35 | call to route_param |
| app.rb:52:15:52:36 | call to route_param |
| app.rb:57:3:63:5 | call to route_param |
+| app.rb:127:20:127:40 | call to route_param |
+| app.rb:156:5:162:7 | call to route_param |
grapeCookies
| app.rb:72:3:75:5 | call to cookies |
| app.rb:79:15:79:21 | call to cookies |
| app.rb:80:16:80:22 | call to cookies |
+| app.rb:120:5:122:7 | call to cookies |
+| app.rb:129:19:129:25 | call to cookies |
diff --git a/ruby/ql/test/library-tests/frameworks/grape/app.rb b/ruby/ql/test/library-tests/frameworks/grape/app.rb
index a034f325f7b..6fbb184cab9 100644
--- a/ruby/ql/test/library-tests/frameworks/grape/app.rb
+++ b/ruby/ql/test/library-tests/frameworks/grape/app.rb
@@ -93,4 +93,76 @@ class AdminAPI < Grape::API
get '/admin' do
params[:token]
end
-end
\ No newline at end of file
+end
+
+class UserAPI < Grape::API
+ VALID_PARAMS = %w(name email password password_confirmation)
+
+ helpers do
+ def user_params
+ params.select{|key,value| VALID_PARAMS.include?(key.to_s)} # Real helper implementation
+ end
+
+ def vulnerable_helper(user_id)
+ source "paramHelper" # Test parameter passing to helper
+ end
+
+ def simple_helper
+ source "simpleHelper" # Test simple helper return
+ end
+ end
+
+ # Headers and cookies blocks for DSL testing
+ headers do
+ requires :Authorization, type: String
+ end
+
+ cookies do
+ requires :session_id, type: String
+ end
+
+ get '/comprehensive_test/:user_id' do
+ # Test all Grape input sources
+ user_id = params[:user_id] # params taint source
+ route_id = route_param(:user_id) # route_param taint source
+ auth = headers[:Authorization] # headers taint source
+ session = cookies[:session_id] # cookies taint source
+ body_data = request.body.read # request taint source
+
+ # Test sinks for all sources
+ sink user_id # $ hasTaintFlow
+ sink route_id # $ hasTaintFlow
+ sink auth # $ hasTaintFlow
+ sink session # $ hasTaintFlow
+ # Note: request.body.read may not be detected by this flow test config
+ end
+
+ get '/helper_test/:user_id' do
+ # Test helper method parameter passing dataflow
+ user_id = params[:user_id]
+ result = vulnerable_helper(user_id)
+ sink result # $ hasTaintFlow=paramHelper
+ end
+
+ post '/users' do
+ # Test helper method return dataflow
+ user_data = user_params
+ simple_result = simple_helper
+ sink user_data # $ hasTaintFlow
+ sink simple_result # $ hasTaintFlow=simpleHelper
+ end
+
+ # Test route_param block pattern
+ route_param :id do
+ get do
+ # params[:id] should be user input from the path
+ user_id = params[:id]
+ sink user_id # $ hasTaintFlow
+ end
+ end
+
+ post '/users' do
+ user_data = user_params
+ sink user_data # $ hasTaintFlow
+ end
+end
diff --git a/ruby/ql/test/query-tests/security/cwe-089/ArelInjection.rb b/ruby/ql/test/query-tests/security/cwe-089/ArelInjection.rb
index 8c9c3bff4fb..1cd6782b241 100644
--- a/ruby/ql/test/query-tests/security/cwe-089/ArelInjection.rb
+++ b/ruby/ql/test/query-tests/security/cwe-089/ArelInjection.rb
@@ -6,66 +6,4 @@ class PotatoController < ActionController::Base
sql = Arel.sql("SELECT * FROM users WHERE name = #{name}")
sql = Arel::Nodes::SqlLiteral.new("SELECT * FROM users WHERE name = #{name}")
end
-end
-
-class PotatoAPI < Grape::API
- get '/unsafe_endpoint' do
- name = params[:user_name]
- # BAD: SQL statement constructed from user input
- sql = Arel.sql("SELECT * FROM users WHERE name = #{name}")
- sql = Arel::Nodes::SqlLiteral.new("SELECT * FROM users WHERE name = #{name}")
- end
-end
-
-class SimpleAPI < Grape::API
- get '/test' do
- x = params[:name]
- Arel.sql("SELECT * FROM users WHERE name = #{x}")
- end
-end
-
- # Test helper method pattern in Grape helpers block
- class TestAPI < Grape::API
- helpers do
- def vulnerable_helper(user_id)
- # BAD: SQL statement constructed from user input passed as parameter
- Arel.sql("SELECT * FROM users WHERE id = #{user_id}")
- end
- end
-
- # Headers and cookies blocks for DSL testing
- headers do
- requires :Authorization, type: String
- end
-
- cookies do
- requires :session_id, type: String
- end
-
- get '/comprehensive_test/:user_id' do
- # BAD: Comprehensive test using all Grape input sources in one SQL query
- user_id = params[:user_id] # params taint source
- route_id = route_param(:user_id) # route_param taint source
- auth = headers[:Authorization] # headers taint source
- session = cookies[:session_id] # cookies taint source
- body_data = request.body.read # request taint source
-
- # All sources flow to SQL injection
- Arel.sql("SELECT * FROM users WHERE id = #{user_id} AND route_id = #{route_id} AND auth = #{auth} AND session = #{session} AND data = #{body_data}")
- end
-
- get '/helper_test' do
- # BAD: Test helper method dataflow
- user_id = params[:user_id]
- vulnerable_helper(user_id)
- end
-
- # Test route_param block pattern
- route_param :id do
- get do
- # BAD: params[:id] should be user input from the path
- user_id = params[:id]
- Arel.sql("SELECT * FROM users WHERE id = #{user_id}")
- end
- end
- end
\ No newline at end of file
+end
\ No newline at end of file
diff --git a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected
index 34128474cb9..069cb34810f 100644
--- a/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected
+++ b/ruby/ql/test/query-tests/security/cwe-089/SqlInjection.expected
@@ -81,32 +81,6 @@ edges
| ArelInjection.rb:4:5:4:8 | name | ArelInjection.rb:7:39:7:80 | "SELECT * FROM users WHERE nam..." | provenance | AdditionalTaintStep |
| ArelInjection.rb:4:12:4:17 | call to params | ArelInjection.rb:4:12:4:29 | ...[...] | provenance | |
| ArelInjection.rb:4:12:4:29 | ...[...] | ArelInjection.rb:4:5:4:8 | name | provenance | |
-| ArelInjection.rb:13:5:13:8 | name | ArelInjection.rb:15:20:15:61 | "SELECT * FROM users WHERE nam..." | provenance | AdditionalTaintStep |
-| ArelInjection.rb:13:5:13:8 | name | ArelInjection.rb:16:39:16:80 | "SELECT * FROM users WHERE nam..." | provenance | AdditionalTaintStep |
-| ArelInjection.rb:13:12:13:17 | call to params | ArelInjection.rb:13:12:13:29 | ...[...] | provenance | |
-| ArelInjection.rb:13:12:13:29 | ...[...] | ArelInjection.rb:13:5:13:8 | name | provenance | |
-| ArelInjection.rb:22:5:22:5 | x | ArelInjection.rb:23:14:23:52 | "SELECT * FROM users WHERE nam..." | provenance | AdditionalTaintStep |
-| ArelInjection.rb:22:9:22:14 | call to params | ArelInjection.rb:22:9:22:21 | ...[...] | provenance | |
-| ArelInjection.rb:22:9:22:21 | ...[...] | ArelInjection.rb:22:5:22:5 | x | provenance | |
-| ArelInjection.rb:30:29:30:35 | user_id | ArelInjection.rb:32:18:32:60 | "SELECT * FROM users WHERE id ..." | provenance | AdditionalTaintStep |
-| ArelInjection.rb:47:7:47:13 | user_id | ArelInjection.rb:54:16:54:153 | "SELECT * FROM users WHERE id ..." | provenance | AdditionalTaintStep |
-| ArelInjection.rb:47:17:47:22 | call to params | ArelInjection.rb:47:17:47:32 | ...[...] | provenance | |
-| ArelInjection.rb:47:17:47:32 | ...[...] | ArelInjection.rb:47:7:47:13 | user_id | provenance | |
-| ArelInjection.rb:48:7:48:14 | route_id | ArelInjection.rb:54:16:54:153 | "SELECT * FROM users WHERE id ..." | provenance | AdditionalTaintStep |
-| ArelInjection.rb:48:18:48:38 | call to route_param | ArelInjection.rb:48:7:48:14 | route_id | provenance | |
-| ArelInjection.rb:49:7:49:10 | auth | ArelInjection.rb:54:16:54:153 | "SELECT * FROM users WHERE id ..." | provenance | AdditionalTaintStep |
-| ArelInjection.rb:49:14:49:20 | call to headers | ArelInjection.rb:49:14:49:36 | ...[...] | provenance | |
-| ArelInjection.rb:49:14:49:36 | ...[...] | ArelInjection.rb:49:7:49:10 | auth | provenance | |
-| ArelInjection.rb:50:7:50:13 | session | ArelInjection.rb:54:16:54:153 | "SELECT * FROM users WHERE id ..." | provenance | AdditionalTaintStep |
-| ArelInjection.rb:50:17:50:23 | call to cookies | ArelInjection.rb:50:17:50:36 | ...[...] | provenance | |
-| ArelInjection.rb:50:17:50:36 | ...[...] | ArelInjection.rb:50:7:50:13 | session | provenance | |
-| ArelInjection.rb:59:7:59:13 | user_id | ArelInjection.rb:60:25:60:31 | user_id | provenance | |
-| ArelInjection.rb:59:17:59:22 | call to params | ArelInjection.rb:59:17:59:32 | ...[...] | provenance | |
-| ArelInjection.rb:59:17:59:32 | ...[...] | ArelInjection.rb:59:7:59:13 | user_id | provenance | |
-| ArelInjection.rb:60:25:60:31 | user_id | ArelInjection.rb:30:29:30:35 | user_id | provenance | AdditionalTaintStep |
-| ArelInjection.rb:67:9:67:15 | user_id | ArelInjection.rb:68:18:68:60 | "SELECT * FROM users WHERE id ..." | provenance | AdditionalTaintStep |
-| ArelInjection.rb:67:19:67:24 | call to params | ArelInjection.rb:67:19:67:29 | ...[...] | provenance | |
-| ArelInjection.rb:67:19:67:29 | ...[...] | ArelInjection.rb:67:9:67:15 | user_id | provenance | |
| PgInjection.rb:6:5:6:8 | name | PgInjection.rb:13:5:13:8 | qry1 : String | provenance | AdditionalTaintStep |
| PgInjection.rb:6:5:6:8 | name | PgInjection.rb:19:5:19:8 | qry2 : String | provenance | AdditionalTaintStep |
| PgInjection.rb:6:5:6:8 | name | PgInjection.rb:31:5:31:8 | qry3 : String | provenance | AdditionalTaintStep |
@@ -235,37 +209,6 @@ nodes
| ArelInjection.rb:4:12:4:29 | ...[...] | semmle.label | ...[...] |
| ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | semmle.label | "SELECT * FROM users WHERE nam..." |
| ArelInjection.rb:7:39:7:80 | "SELECT * FROM users WHERE nam..." | semmle.label | "SELECT * FROM users WHERE nam..." |
-| ArelInjection.rb:13:5:13:8 | name | semmle.label | name |
-| ArelInjection.rb:13:12:13:17 | call to params | semmle.label | call to params |
-| ArelInjection.rb:13:12:13:29 | ...[...] | semmle.label | ...[...] |
-| ArelInjection.rb:15:20:15:61 | "SELECT * FROM users WHERE nam..." | semmle.label | "SELECT * FROM users WHERE nam..." |
-| ArelInjection.rb:16:39:16:80 | "SELECT * FROM users WHERE nam..." | semmle.label | "SELECT * FROM users WHERE nam..." |
-| ArelInjection.rb:22:5:22:5 | x | semmle.label | x |
-| ArelInjection.rb:22:9:22:14 | call to params | semmle.label | call to params |
-| ArelInjection.rb:22:9:22:21 | ...[...] | semmle.label | ...[...] |
-| ArelInjection.rb:23:14:23:52 | "SELECT * FROM users WHERE nam..." | semmle.label | "SELECT * FROM users WHERE nam..." |
-| ArelInjection.rb:30:29:30:35 | user_id | semmle.label | user_id |
-| ArelInjection.rb:32:18:32:60 | "SELECT * FROM users WHERE id ..." | semmle.label | "SELECT * FROM users WHERE id ..." |
-| ArelInjection.rb:47:7:47:13 | user_id | semmle.label | user_id |
-| ArelInjection.rb:47:17:47:22 | call to params | semmle.label | call to params |
-| ArelInjection.rb:47:17:47:32 | ...[...] | semmle.label | ...[...] |
-| ArelInjection.rb:48:7:48:14 | route_id | semmle.label | route_id |
-| ArelInjection.rb:48:18:48:38 | call to route_param | semmle.label | call to route_param |
-| ArelInjection.rb:49:7:49:10 | auth | semmle.label | auth |
-| ArelInjection.rb:49:14:49:20 | call to headers | semmle.label | call to headers |
-| ArelInjection.rb:49:14:49:36 | ...[...] | semmle.label | ...[...] |
-| ArelInjection.rb:50:7:50:13 | session | semmle.label | session |
-| ArelInjection.rb:50:17:50:23 | call to cookies | semmle.label | call to cookies |
-| ArelInjection.rb:50:17:50:36 | ...[...] | semmle.label | ...[...] |
-| ArelInjection.rb:54:16:54:153 | "SELECT * FROM users WHERE id ..." | semmle.label | "SELECT * FROM users WHERE id ..." |
-| ArelInjection.rb:59:7:59:13 | user_id | semmle.label | user_id |
-| ArelInjection.rb:59:17:59:22 | call to params | semmle.label | call to params |
-| ArelInjection.rb:59:17:59:32 | ...[...] | semmle.label | ...[...] |
-| ArelInjection.rb:60:25:60:31 | user_id | semmle.label | user_id |
-| ArelInjection.rb:67:9:67:15 | user_id | semmle.label | user_id |
-| ArelInjection.rb:67:19:67:24 | call to params | semmle.label | call to params |
-| ArelInjection.rb:67:19:67:29 | ...[...] | semmle.label | ...[...] |
-| ArelInjection.rb:68:18:68:60 | "SELECT * FROM users WHERE id ..." | semmle.label | "SELECT * FROM users WHERE id ..." |
| PgInjection.rb:6:5:6:8 | name | semmle.label | name |
| PgInjection.rb:6:12:6:17 | call to params | semmle.label | call to params |
| PgInjection.rb:6:12:6:24 | ...[...] | semmle.label | ...[...] |
@@ -323,15 +266,6 @@ subpaths
| ActiveRecordInjection.rb:216:38:216:53 | "role = #{...}" | ActiveRecordInjection.rb:222:29:222:34 | call to params | ActiveRecordInjection.rb:216:38:216:53 | "role = #{...}" | This SQL query depends on a $@. | ActiveRecordInjection.rb:222:29:222:34 | call to params | user-provided value |
| ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | ArelInjection.rb:4:12:4:17 | call to params | ArelInjection.rb:6:20:6:61 | "SELECT * FROM users WHERE nam..." | This SQL query depends on a $@. | ArelInjection.rb:4:12:4:17 | call to params | user-provided value |
| ArelInjection.rb:7:39:7:80 | "SELECT * FROM users WHERE nam..." | ArelInjection.rb:4:12:4:17 | call to params | ArelInjection.rb:7:39:7:80 | "SELECT * FROM users WHERE nam..." | This SQL query depends on a $@. | ArelInjection.rb:4:12:4:17 | call to params | user-provided value |
-| ArelInjection.rb:15:20:15:61 | "SELECT * FROM users WHERE nam..." | ArelInjection.rb:13:12:13:17 | call to params | ArelInjection.rb:15:20:15:61 | "SELECT * FROM users WHERE nam..." | This SQL query depends on a $@. | ArelInjection.rb:13:12:13:17 | call to params | user-provided value |
-| ArelInjection.rb:16:39:16:80 | "SELECT * FROM users WHERE nam..." | ArelInjection.rb:13:12:13:17 | call to params | ArelInjection.rb:16:39:16:80 | "SELECT * FROM users WHERE nam..." | This SQL query depends on a $@. | ArelInjection.rb:13:12:13:17 | call to params | user-provided value |
-| ArelInjection.rb:23:14:23:52 | "SELECT * FROM users WHERE nam..." | ArelInjection.rb:22:9:22:14 | call to params | ArelInjection.rb:23:14:23:52 | "SELECT * FROM users WHERE nam..." | This SQL query depends on a $@. | ArelInjection.rb:22:9:22:14 | call to params | user-provided value |
-| ArelInjection.rb:32:18:32:60 | "SELECT * FROM users WHERE id ..." | ArelInjection.rb:59:17:59:22 | call to params | ArelInjection.rb:32:18:32:60 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ArelInjection.rb:59:17:59:22 | call to params | user-provided value |
-| ArelInjection.rb:54:16:54:153 | "SELECT * FROM users WHERE id ..." | ArelInjection.rb:47:17:47:22 | call to params | ArelInjection.rb:54:16:54:153 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ArelInjection.rb:47:17:47:22 | call to params | user-provided value |
-| ArelInjection.rb:54:16:54:153 | "SELECT * FROM users WHERE id ..." | ArelInjection.rb:48:18:48:38 | call to route_param | ArelInjection.rb:54:16:54:153 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ArelInjection.rb:48:18:48:38 | call to route_param | user-provided value |
-| ArelInjection.rb:54:16:54:153 | "SELECT * FROM users WHERE id ..." | ArelInjection.rb:49:14:49:20 | call to headers | ArelInjection.rb:54:16:54:153 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ArelInjection.rb:49:14:49:20 | call to headers | user-provided value |
-| ArelInjection.rb:54:16:54:153 | "SELECT * FROM users WHERE id ..." | ArelInjection.rb:50:17:50:23 | call to cookies | ArelInjection.rb:54:16:54:153 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ArelInjection.rb:50:17:50:23 | call to cookies | user-provided value |
-| ArelInjection.rb:68:18:68:60 | "SELECT * FROM users WHERE id ..." | ArelInjection.rb:67:19:67:24 | call to params | ArelInjection.rb:68:18:68:60 | "SELECT * FROM users WHERE id ..." | This SQL query depends on a $@. | ArelInjection.rb:67:19:67:24 | call to params | user-provided value |
| PgInjection.rb:14:15:14:18 | qry1 | PgInjection.rb:6:12:6:17 | call to params | PgInjection.rb:14:15:14:18 | qry1 | This SQL query depends on a $@. | PgInjection.rb:6:12:6:17 | call to params | user-provided value |
| PgInjection.rb:15:21:15:24 | qry1 | PgInjection.rb:6:12:6:17 | call to params | PgInjection.rb:15:21:15:24 | qry1 | This SQL query depends on a $@. | PgInjection.rb:6:12:6:17 | call to params | user-provided value |
| PgInjection.rb:20:22:20:25 | qry2 | PgInjection.rb:6:12:6:17 | call to params | PgInjection.rb:20:22:20:25 | qry2 | This SQL query depends on a $@. | PgInjection.rb:6:12:6:17 | call to params | user-provided value |
From 1bccf42556fa214a6e7d44e3f0322cc09d008b09 Mon Sep 17 00:00:00 2001
From: Geoffrey White <40627776+geoffw0@users.noreply.github.com>
Date: Wed, 17 Sep 2025 13:59:54 +0100
Subject: [PATCH 032/160] Rust: Update test results following fix on main.
---
.../library-tests/dataflow/local/DataFlowStep.expected | 5 +++--
.../library-tests/dataflow/local/inline-flow.expected | 8 ++++++++
rust/ql/test/library-tests/dataflow/local/main.rs | 2 +-
3 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected
index 0af30149e74..b2fc845081c 100644
--- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected
+++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected
@@ -111,11 +111,12 @@ localStep
| main.rs:77:9:77:9 | k | main.rs:77:5:77:5 | j |
| main.rs:77:9:77:9 | k | main.rs:79:10:79:10 | k |
| main.rs:81:9:81:13 | mut l | main.rs:81:13:81:13 | l |
+| main.rs:81:13:81:13 | [SSA] l | main.rs:82:9:82:9 | l |
+| main.rs:81:13:81:13 | l | main.rs:81:13:81:13 | [SSA] l |
| main.rs:81:17:81:25 | source(...) | main.rs:81:9:81:13 | mut l |
-| main.rs:82:5:82:5 | [SSA] l | main.rs:82:9:82:9 | l |
+| main.rs:82:5:82:5 | [SSA] l | main.rs:83:10:83:10 | l |
| main.rs:82:5:82:5 | l | main.rs:82:5:82:5 | [SSA] l |
| main.rs:82:9:82:9 | l | main.rs:82:5:82:5 | l |
-| main.rs:82:9:82:9 | l | main.rs:83:10:83:10 | l |
| main.rs:87:9:87:9 | [SSA] a | main.rs:88:5:88:5 | a |
| main.rs:87:9:87:9 | a | main.rs:87:9:87:9 | [SSA] a |
| main.rs:87:9:87:9 | a | main.rs:87:9:87:9 | a |
diff --git a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected
index eafe3a7452e..00640ed9aa4 100644
--- a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected
+++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected
@@ -31,6 +31,9 @@ edges
| main.rs:76:9:76:9 | k | main.rs:79:10:79:10 | k | provenance | |
| main.rs:76:13:76:21 | source(...) | main.rs:76:9:76:9 | k | provenance | |
| main.rs:77:5:77:5 | j | main.rs:78:10:78:10 | j | provenance | |
+| main.rs:81:9:81:13 | mut l | main.rs:82:5:82:5 | l | provenance | |
+| main.rs:81:17:81:25 | source(...) | main.rs:81:9:81:13 | mut l | provenance | |
+| main.rs:82:5:82:5 | l | main.rs:83:10:83:10 | l | provenance | |
| main.rs:115:9:115:9 | i [&ref] | main.rs:116:11:116:11 | i [&ref] | provenance | |
| main.rs:115:13:115:31 | ...::new(...) [&ref] | main.rs:115:9:115:9 | i [&ref] | provenance | |
| main.rs:115:22:115:30 | source(...) | main.rs:115:13:115:31 | ...::new(...) [&ref] | provenance | MaD:1 |
@@ -279,6 +282,10 @@ nodes
| main.rs:77:5:77:5 | j | semmle.label | j |
| main.rs:78:10:78:10 | j | semmle.label | j |
| main.rs:79:10:79:10 | k | semmle.label | k |
+| main.rs:81:9:81:13 | mut l | semmle.label | mut l |
+| main.rs:81:17:81:25 | source(...) | semmle.label | source(...) |
+| main.rs:82:5:82:5 | l | semmle.label | l |
+| main.rs:83:10:83:10 | l | semmle.label | l |
| main.rs:115:9:115:9 | i [&ref] | semmle.label | i [&ref] |
| main.rs:115:13:115:31 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] |
| main.rs:115:22:115:30 | source(...) | semmle.label | source(...) |
@@ -553,6 +560,7 @@ testFailures
| main.rs:71:10:71:10 | i | main.rs:70:9:70:17 | source(...) | main.rs:71:10:71:10 | i | $@ | main.rs:70:9:70:17 | source(...) | source(...) |
| main.rs:78:10:78:10 | j | main.rs:76:13:76:21 | source(...) | main.rs:78:10:78:10 | j | $@ | main.rs:76:13:76:21 | source(...) | source(...) |
| main.rs:79:10:79:10 | k | main.rs:76:13:76:21 | source(...) | main.rs:79:10:79:10 | k | $@ | main.rs:76:13:76:21 | source(...) | source(...) |
+| main.rs:83:10:83:10 | l | main.rs:81:17:81:25 | source(...) | main.rs:83:10:83:10 | l | $@ | main.rs:81:17:81:25 | source(...) | source(...) |
| main.rs:116:10:116:11 | * ... | main.rs:115:22:115:30 | source(...) | main.rs:116:10:116:11 | * ... | $@ | main.rs:115:22:115:30 | source(...) | source(...) |
| main.rs:124:10:124:12 | a.0 | main.rs:123:14:123:22 | source(...) | main.rs:124:10:124:12 | a.0 | $@ | main.rs:123:14:123:22 | source(...) | source(...) |
| main.rs:132:10:132:11 | a1 | main.rs:129:17:129:26 | source(...) | main.rs:132:10:132:11 | a1 | $@ | main.rs:129:17:129:26 | source(...) | source(...) |
diff --git a/rust/ql/test/library-tests/dataflow/local/main.rs b/rust/ql/test/library-tests/dataflow/local/main.rs
index d352eb0cbf1..7cab42da52b 100644
--- a/rust/ql/test/library-tests/dataflow/local/main.rs
+++ b/rust/ql/test/library-tests/dataflow/local/main.rs
@@ -80,7 +80,7 @@ fn assignment() {
let mut l = source(8);
l = l;
- sink(l); // $ MISSING: hasValueFlow=8
+ sink(l); // $ hasValueFlow=8
}
fn block_expression1() -> i64 {
From 34b40a14e876481909726ce811663a9683d1d62a Mon Sep 17 00:00:00 2001
From: Alex Eyers-Taylor
Date: Wed, 17 Sep 2025 16:22:22 +0100
Subject: [PATCH 033/160] Java: Make a TC overlay caller.
---
java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll | 1 +
1 file changed, 1 insertion(+)
diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll
index 4b436edc6aa..23e9f680c97 100644
--- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll
+++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll
@@ -83,6 +83,7 @@ overlay[caller?]
pragma[inline]
predicate localFlow(Node node1, Node node2) { node1 = node2 or localFlowStepPlus(node1, node2) }
+overlay[caller?]
private predicate localFlowStepPlus(Node node1, Node node2) = fastTC(localFlowStep/2)(node1, node2)
/**
From 3cd737e40d43fe5108a2f5710bb733e2c37ce454 Mon Sep 17 00:00:00 2001
From: Kasper Svendsen
Date: Thu, 18 Sep 2025 10:32:20 +0200
Subject: [PATCH 034/160] Overlay: Future-proof Java config discarding
---
java/ql/lib/semmle/code/java/Overlay.qll | 20 +++++++++++---------
1 file changed, 11 insertions(+), 9 deletions(-)
diff --git a/java/ql/lib/semmle/code/java/Overlay.qll b/java/ql/lib/semmle/code/java/Overlay.qll
index 1d1a3896ba7..27e8badc233 100644
--- a/java/ql/lib/semmle/code/java/Overlay.qll
+++ b/java/ql/lib/semmle/code/java/Overlay.qll
@@ -73,22 +73,24 @@ private predicate discardReferableLocatable(@locatable el) {
)
}
+/** Gets the raw file for a configLocatable. */
overlay[local]
-private predicate baseConfigLocatable(@configLocatable l) { not isOverlay() and exists(l) }
+private string getRawFileForConfig(@configLocatable el) {
+ exists(@location loc, @file file |
+ configLocations(el, loc) and
+ locations_default(loc, file, _, _, _, _) and
+ files(file, result)
+ )
+}
overlay[local]
-private predicate overlayHasConfigLocatables() {
- isOverlay() and
- exists(@configLocatable el)
+private string baseConfigLocatable(@configLocatable el) {
+ not isOverlay() and result = getRawFileForConfig(el)
}
overlay[discard_entity]
private predicate discardBaseConfigLocatable(@configLocatable el) {
- // The properties extractor is currently not incremental, so if
- // the overlay contains any config locatables, the overlay should
- // contain a full extraction and all config locatables from base
- // should be discarded.
- baseConfigLocatable(el) and overlayHasConfigLocatables()
+ overlayChangedFiles(baseConfigLocatable(el))
}
overlay[local]
From dbb9a26f78938a5ddd4763d56e9c7cdb54f204c5 Mon Sep 17 00:00:00 2001
From: Kasper Svendsen
Date: Thu, 18 Sep 2025 10:35:11 +0200
Subject: [PATCH 035/160] Overlay: Future-proof Java XML discarding
---
java/ql/lib/semmle/code/java/Overlay.qll | 22 +---------------------
java/ql/lib/semmle/code/xml/XML.qll | 11 +++++++++++
2 files changed, 12 insertions(+), 21 deletions(-)
diff --git a/java/ql/lib/semmle/code/java/Overlay.qll b/java/ql/lib/semmle/code/java/Overlay.qll
index 27e8badc233..0f6033d87b3 100644
--- a/java/ql/lib/semmle/code/java/Overlay.qll
+++ b/java/ql/lib/semmle/code/java/Overlay.qll
@@ -18,7 +18,7 @@ predicate isOverlay() { databaseMetadata("isOverlay", "true") }
overlay[local]
string getRawFile(@locatable el) {
exists(@location loc, @file file |
- hasLocation(el, loc) and
+ (hasLocation(el, loc) or xmllocations(el, loc)) and
locations_default(loc, file, _, _, _, _) and
files(file, result)
)
@@ -92,23 +92,3 @@ overlay[discard_entity]
private predicate discardBaseConfigLocatable(@configLocatable el) {
overlayChangedFiles(baseConfigLocatable(el))
}
-
-overlay[local]
-private predicate baseXmlLocatable(@xmllocatable l) {
- not isOverlay() and not files(l, _) and not xmlNs(l, _, _, _)
-}
-
-overlay[local]
-private predicate overlayHasXmlLocatable() {
- isOverlay() and
- exists(@xmllocatable l | not files(l, _) and not xmlNs(l, _, _, _))
-}
-
-overlay[discard_entity]
-private predicate discardBaseXmlLocatable(@xmllocatable el) {
- // The XML extractor is currently not incremental, so if
- // the overlay contains any XML locatables, the overlay should
- // contain a full extraction and all XML locatables from base
- // should be discarded.
- baseXmlLocatable(el) and overlayHasXmlLocatable()
-}
diff --git a/java/ql/lib/semmle/code/xml/XML.qll b/java/ql/lib/semmle/code/xml/XML.qll
index e4073362fc6..cd00991eb65 100644
--- a/java/ql/lib/semmle/code/xml/XML.qll
+++ b/java/ql/lib/semmle/code/xml/XML.qll
@@ -6,6 +6,7 @@ module;
import semmle.files.FileSystem
private import codeql.xml.Xml
+private import semmle.code.java.Overlay
private module Input implements InputSig {
class XmlLocatableBase = @xmllocatable or @xmlnamespaceable;
@@ -69,3 +70,13 @@ private module Input implements InputSig {
}
import Make
+
+private class DiscardableXmlAttribute extends DiscardableLocatable, @xmlattribute { }
+
+private class DiscardableXmlElement extends DiscardableLocatable, @xmlelement { }
+
+private class DiscardableXmlComment extends DiscardableLocatable, @xmlcomment { }
+
+private class DiscardableXmlCharacters extends DiscardableLocatable, @xmlcharacters { }
+
+private class DiscardableXmlDtd extends DiscardableLocatable, @xmldtd { }
From c831a8c2d92d7dd7be628f16b3df9eb528184868 Mon Sep 17 00:00:00 2001
From: Tom Hvitved
Date: Wed, 17 Sep 2025 13:43:24 +0200
Subject: [PATCH 036/160] Rust: Add more path resolution tests
---
.../PathResolutionConsistency.expected | 3 +-
.../library-tests/path-resolution/main.rs | 10 +-
.../library-tests/path-resolution/my2/mod.rs | 10 +-
.../path-resolution/my2/my3/mod.rs | 2 +
.../path-resolution/path-resolution.expected | 813 +++++++++---------
5 files changed, 431 insertions(+), 407 deletions(-)
diff --git a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected
index 9d1761069fe..d945cb4c6c2 100644
--- a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected
+++ b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected
@@ -1,3 +1,4 @@
multipleCallTargets
-| main.rs:118:9:118:11 | f(...) |
+| main.rs:124:9:124:11 | f(...) |
+| main.rs:774:5:774:7 | f(...) |
| proc_macro.rs:9:5:9:10 | ...::new(...) |
diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs
index 1de91a60fe4..db8e4c0f39d 100644
--- a/rust/ql/test/library-tests/path-resolution/main.rs
+++ b/rust/ql/test/library-tests/path-resolution/main.rs
@@ -8,7 +8,13 @@ mod my2; // I14
use my2::*; // $ item=I14
-use my2::nested2::nested3::nested4::{f, g}; // $ item=I11 item=I12 item=I13
+#[rustfmt::skip]
+use my2::nested2::nested3::nested4::{ // $ item=I11
+ f, // $ item=I12
+ g, // $ item=I13
+};
+
+use my2::nested8_f; // $ item=I119
mod m1 {
fn f() {
@@ -765,7 +771,7 @@ fn main() {
my::nested::nested1::nested2::f(); // $ item=I4
my::f(); // $ item=I38
nested2::nested3::nested4::f(); // $ item=I12
- f(); // $ item=I12
+ f(); // $ item=I12 $ SPURIOUS: item=I119
g(); // $ item=I13
crate::h(); // $ item=I25
m1::m2::g(); // $ item=I19
diff --git a/rust/ql/test/library-tests/path-resolution/my2/mod.rs b/rust/ql/test/library-tests/path-resolution/my2/mod.rs
index 43c1a05e91f..85edb683202 100644
--- a/rust/ql/test/library-tests/path-resolution/my2/mod.rs
+++ b/rust/ql/test/library-tests/path-resolution/my2/mod.rs
@@ -7,11 +7,17 @@ fn g() {
pub use nested2::nested5::*; // $ item=I114
-pub use nested2::nested7::nested8::{self}; // $ item=I118
+#[rustfmt::skip]
+pub use nested2::nested7::nested8::{ // $ item=I118
+ self, // $ item=I118
+ f as nested8_f // $ item=I119
+};
+
+use nested2::nested5::nested6::f as nested6_f; // $ item=I116
pub mod my3;
#[path = "renamed.rs"]
mod mymod;
-use mymod::f; // $ item=I1001
+pub use mymod::f; // $ item=I1001
diff --git a/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs b/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs
index 6b54377728b..e2d413841c3 100644
--- a/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs
+++ b/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs
@@ -6,3 +6,5 @@ pub fn f() {
use super::super::h; // $ item=I25
use super::g; // $ item=I9
+
+use super::nested6_f; // $ MISSING: item=I116
diff --git a/rust/ql/test/library-tests/path-resolution/path-resolution.expected b/rust/ql/test/library-tests/path-resolution/path-resolution.expected
index a51816a5228..8f12af96c02 100644
--- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected
+++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected
@@ -2,38 +2,38 @@ mod
| lib.rs:1:1:1:11 | mod my |
| main.rs:1:1:1:7 | mod my |
| main.rs:7:1:7:8 | mod my2 |
-| main.rs:13:1:37:1 | mod m1 |
-| main.rs:18:5:36:5 | mod m2 |
-| main.rs:29:9:35:9 | mod m3 |
-| main.rs:39:1:46:1 | mod m4 |
-| main.rs:103:1:107:1 | mod m5 |
-| main.rs:109:1:120:1 | mod m6 |
-| main.rs:122:1:141:1 | mod m7 |
-| main.rs:143:1:197:1 | mod m8 |
-| main.rs:199:1:207:1 | mod m9 |
-| main.rs:209:1:228:1 | mod m10 |
-| main.rs:230:1:267:1 | mod m11 |
-| main.rs:240:5:240:12 | mod f |
-| main.rs:269:1:281:1 | mod m12 |
-| main.rs:283:1:296:1 | mod m13 |
-| main.rs:287:5:295:5 | mod m14 |
-| main.rs:298:1:367:1 | mod m15 |
-| main.rs:369:1:461:1 | mod m16 |
-| main.rs:463:1:513:1 | mod trait_visibility |
-| main.rs:464:5:486:5 | mod m |
-| main.rs:515:1:545:1 | mod m17 |
-| main.rs:547:1:565:1 | mod m18 |
-| main.rs:552:5:564:5 | mod m19 |
-| main.rs:557:9:563:9 | mod m20 |
-| main.rs:567:1:592:1 | mod m21 |
-| main.rs:568:5:574:5 | mod m22 |
-| main.rs:576:5:591:5 | mod m33 |
-| main.rs:594:1:619:1 | mod m23 |
-| main.rs:621:1:689:1 | mod m24 |
-| main.rs:706:1:758:1 | mod associated_types |
+| main.rs:19:1:43:1 | mod m1 |
+| main.rs:24:5:42:5 | mod m2 |
+| main.rs:35:9:41:9 | mod m3 |
+| main.rs:45:1:52:1 | mod m4 |
+| main.rs:109:1:113:1 | mod m5 |
+| main.rs:115:1:126:1 | mod m6 |
+| main.rs:128:1:147:1 | mod m7 |
+| main.rs:149:1:203:1 | mod m8 |
+| main.rs:205:1:213:1 | mod m9 |
+| main.rs:215:1:234:1 | mod m10 |
+| main.rs:236:1:273:1 | mod m11 |
+| main.rs:246:5:246:12 | mod f |
+| main.rs:275:1:287:1 | mod m12 |
+| main.rs:289:1:302:1 | mod m13 |
+| main.rs:293:5:301:5 | mod m14 |
+| main.rs:304:1:373:1 | mod m15 |
+| main.rs:375:1:467:1 | mod m16 |
+| main.rs:469:1:519:1 | mod trait_visibility |
+| main.rs:470:5:492:5 | mod m |
+| main.rs:521:1:551:1 | mod m17 |
+| main.rs:553:1:571:1 | mod m18 |
+| main.rs:558:5:570:5 | mod m19 |
+| main.rs:563:9:569:9 | mod m20 |
+| main.rs:573:1:598:1 | mod m21 |
+| main.rs:574:5:580:5 | mod m22 |
+| main.rs:582:5:597:5 | mod m33 |
+| main.rs:600:1:625:1 | mod m23 |
+| main.rs:627:1:695:1 | mod m24 |
+| main.rs:712:1:764:1 | mod associated_types |
| my2/mod.rs:1:1:1:16 | mod nested2 |
-| my2/mod.rs:12:1:12:12 | mod my3 |
-| my2/mod.rs:14:1:15:10 | mod mymod |
+| my2/mod.rs:18:1:18:12 | mod my3 |
+| my2/mod.rs:20:1:21:10 | mod mymod |
| my2/nested2.rs:1:1:11:1 | mod nested3 |
| my2/nested2.rs:2:5:10:5 | mod nested4 |
| my2/nested2.rs:13:1:19:1 | mod nested5 |
@@ -52,385 +52,394 @@ resolvePath
| main.rs:5:5:5:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
| main.rs:5:5:5:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
| main.rs:9:5:9:7 | my2 | main.rs:7:1:7:8 | mod my2 |
-| main.rs:11:5:11:7 | my2 | main.rs:7:1:7:8 | mod my2 |
-| main.rs:11:5:11:16 | ...::nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
-| main.rs:11:5:11:25 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
-| main.rs:11:5:11:34 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
-| main.rs:11:38:11:38 | f | my2/nested2.rs:3:9:5:9 | fn f |
-| main.rs:11:41:11:41 | g | my2/nested2.rs:7:9:9:9 | fn g |
-| main.rs:25:13:25:13 | f | main.rs:19:9:21:9 | fn f |
-| main.rs:26:13:26:17 | super | main.rs:13:1:37:1 | mod m1 |
-| main.rs:26:13:26:20 | ...::f | main.rs:14:5:16:5 | fn f |
-| main.rs:30:17:30:21 | super | main.rs:18:5:36:5 | mod m2 |
-| main.rs:30:17:30:24 | ...::f | main.rs:19:9:21:9 | fn f |
-| main.rs:33:17:33:17 | f | main.rs:19:9:21:9 | fn f |
-| main.rs:40:9:40:13 | super | main.rs:1:1:799:2 | SourceFile |
-| main.rs:40:9:40:17 | ...::m1 | main.rs:13:1:37:1 | mod m1 |
-| main.rs:40:9:40:21 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
-| main.rs:40:9:40:24 | ...::g | main.rs:23:9:27:9 | fn g |
-| main.rs:44:9:44:9 | g | main.rs:23:9:27:9 | fn g |
-| main.rs:56:13:56:14 | m1 | main.rs:13:1:37:1 | mod m1 |
-| main.rs:56:13:56:18 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
-| main.rs:56:13:56:21 | ...::g | main.rs:23:9:27:9 | fn g |
-| main.rs:57:9:57:9 | g | main.rs:23:9:27:9 | fn g |
-| main.rs:61:17:61:19 | Foo | main.rs:59:9:59:21 | struct Foo |
-| main.rs:64:13:64:15 | Foo | main.rs:53:5:53:17 | struct Foo |
-| main.rs:66:5:66:5 | f | main.rs:55:5:62:5 | fn f |
-| main.rs:68:5:68:8 | self | main.rs:1:1:799:2 | SourceFile |
-| main.rs:68:5:68:11 | ...::i | main.rs:71:1:83:1 | fn i |
-| main.rs:74:13:74:15 | Foo | main.rs:48:1:48:13 | struct Foo |
-| main.rs:78:16:78:18 | i32 | {EXTERNAL LOCATION} | struct i32 |
-| main.rs:81:17:81:19 | Foo | main.rs:77:9:79:9 | struct Foo |
-| main.rs:85:5:85:7 | my2 | main.rs:7:1:7:8 | mod my2 |
-| main.rs:85:5:85:16 | ...::nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
-| main.rs:87:5:87:21 | my2_nested2_alias | my2/mod.rs:1:1:1:16 | mod nested2 |
-| main.rs:87:5:87:30 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
-| main.rs:87:34:87:40 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
-| main.rs:87:34:87:43 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
-| main.rs:87:57:87:63 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
-| main.rs:87:57:87:66 | ...::g | my2/nested2.rs:7:9:9:9 | fn g |
-| main.rs:87:80:87:86 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
-| main.rs:100:5:100:22 | f_defined_in_macro | main.rs:99:18:99:42 | fn f_defined_in_macro |
-| main.rs:117:13:117:17 | super | main.rs:1:1:799:2 | SourceFile |
-| main.rs:117:13:117:21 | ...::m5 | main.rs:103:1:107:1 | mod m5 |
-| main.rs:118:9:118:9 | f | main.rs:104:5:106:5 | fn f |
-| main.rs:118:9:118:9 | f | main.rs:110:5:112:5 | fn f |
-| main.rs:125:13:125:15 | i32 | {EXTERNAL LOCATION} | struct i32 |
-| main.rs:128:16:128:18 | i32 | {EXTERNAL LOCATION} | struct i32 |
-| main.rs:134:19:134:24 | MyEnum | main.rs:123:5:131:5 | enum MyEnum |
-| main.rs:137:17:137:22 | MyEnum | main.rs:123:5:131:5 | enum MyEnum |
-| main.rs:137:17:137:25 | ...::A | main.rs:124:9:126:9 | A |
-| main.rs:138:17:138:22 | MyEnum | main.rs:123:5:131:5 | enum MyEnum |
-| main.rs:138:17:138:25 | ...::B | main.rs:126:12:129:9 | B |
-| main.rs:139:9:139:14 | MyEnum | main.rs:123:5:131:5 | enum MyEnum |
-| main.rs:139:9:139:17 | ...::C | main.rs:129:12:130:9 | C |
-| main.rs:149:13:149:13 | f | main.rs:156:5:158:5 | fn f |
-| main.rs:150:13:150:16 | Self | main.rs:144:5:152:5 | trait MyTrait |
-| main.rs:150:13:150:19 | ...::f | main.rs:145:9:145:20 | fn f |
-| main.rs:161:10:161:16 | MyTrait | main.rs:144:5:152:5 | trait MyTrait |
-| main.rs:161:22:161:29 | MyStruct | main.rs:154:5:154:22 | struct MyStruct |
-| main.rs:164:13:164:13 | f | main.rs:156:5:158:5 | fn f |
-| main.rs:165:13:165:16 | Self | main.rs:160:5:171:5 | impl MyTrait for MyStruct { ... } |
-| main.rs:165:13:165:19 | ...::g | main.rs:168:9:170:9 | fn g |
-| main.rs:174:10:174:17 | MyStruct | main.rs:154:5:154:22 | struct MyStruct |
-| main.rs:177:13:177:13 | f | main.rs:156:5:158:5 | fn f |
-| main.rs:183:17:183:24 | MyStruct | main.rs:154:5:154:22 | struct MyStruct |
-| main.rs:184:9:184:15 | MyTrait | main.rs:144:5:152:5 | trait MyTrait |
-| main.rs:184:9:184:18 | ...::f | main.rs:145:9:145:20 | fn f |
-| main.rs:185:9:185:16 | MyStruct | main.rs:154:5:154:22 | struct MyStruct |
-| main.rs:185:9:185:19 | ...::f | main.rs:161:33:166:9 | fn f |
-| main.rs:186:10:186:17 | MyStruct | main.rs:154:5:154:22 | struct MyStruct |
-| main.rs:187:10:187:16 | MyTrait | main.rs:144:5:152:5 | trait MyTrait |
-| main.rs:190:17:190:24 | MyStruct | main.rs:154:5:154:22 | struct MyStruct |
-| main.rs:192:17:192:24 | MyStruct | main.rs:154:5:154:22 | struct MyStruct |
-| main.rs:194:9:194:16 | MyStruct | main.rs:154:5:154:22 | struct MyStruct |
-| main.rs:194:9:194:19 | ...::h | main.rs:174:21:178:9 | fn h |
-| main.rs:203:19:203:22 | self | main.rs:199:1:207:1 | mod m9 |
-| main.rs:203:19:203:32 | ...::MyStruct | main.rs:200:5:200:26 | struct MyStruct |
-| main.rs:205:9:205:12 | self | main.rs:199:1:207:1 | mod m9 |
-| main.rs:205:9:205:22 | ...::MyStruct | main.rs:200:5:200:26 | struct MyStruct |
-| main.rs:215:12:215:12 | T | main.rs:212:7:212:7 | T |
-| main.rs:220:12:220:12 | T | main.rs:219:14:219:14 | T |
-| main.rs:222:7:224:7 | MyStruct::<...> | main.rs:210:5:216:5 | struct MyStruct |
-| main.rs:223:9:223:9 | T | main.rs:219:14:219:14 | T |
-| main.rs:226:9:226:16 | MyStruct | main.rs:210:5:216:5 | struct MyStruct |
-| main.rs:236:17:236:19 | Foo | main.rs:231:5:231:21 | struct Foo |
-| main.rs:237:9:237:11 | Foo | main.rs:233:5:233:15 | fn Foo |
-| main.rs:246:9:246:11 | Bar | main.rs:242:5:244:5 | enum Bar |
-| main.rs:246:9:246:19 | ...::FooBar | main.rs:243:9:243:17 | FooBar |
-| main.rs:251:13:251:15 | Foo | main.rs:231:5:231:21 | struct Foo |
-| main.rs:252:17:252:22 | FooBar | main.rs:243:9:243:17 | FooBar |
-| main.rs:253:17:253:22 | FooBar | main.rs:248:5:248:18 | fn FooBar |
-| main.rs:261:9:261:9 | E | main.rs:256:15:259:5 | enum E |
-| main.rs:261:9:261:12 | ...::C | main.rs:258:9:258:9 | C |
-| main.rs:264:17:264:17 | S | main.rs:256:5:256:13 | struct S |
-| main.rs:265:17:265:17 | C | main.rs:258:9:258:9 | C |
-| main.rs:278:16:278:16 | T | main.rs:272:7:272:7 | T |
-| main.rs:279:14:279:17 | Self | main.rs:270:5:280:5 | trait MyParamTrait |
-| main.rs:279:14:279:33 | ...::AssociatedType | main.rs:274:9:274:28 | type AssociatedType |
-| main.rs:288:13:288:16 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) |
-| main.rs:288:13:288:21 | ...::m13 | main.rs:283:1:296:1 | mod m13 |
-| main.rs:288:13:288:24 | ...::f | main.rs:284:5:284:17 | fn f |
-| main.rs:288:13:288:24 | ...::f | main.rs:284:19:285:19 | struct f |
-| main.rs:291:17:291:17 | f | main.rs:284:19:285:19 | struct f |
-| main.rs:292:21:292:21 | f | main.rs:284:19:285:19 | struct f |
-| main.rs:293:13:293:13 | f | main.rs:284:5:284:17 | fn f |
-| main.rs:307:9:307:14 | Trait1 | main.rs:299:5:303:5 | trait Trait1 |
-| main.rs:310:13:310:16 | Self | main.rs:305:5:313:5 | trait Trait2 |
-| main.rs:310:13:310:19 | ...::g | main.rs:302:9:302:20 | fn g |
-| main.rs:320:9:320:12 | Self | main.rs:315:5:328:5 | trait Trait3 |
-| main.rs:320:15:320:20 | Trait1 | main.rs:299:5:303:5 | trait Trait1 |
-| main.rs:321:9:321:10 | TT | main.rs:317:9:317:10 | TT |
-| main.rs:321:13:321:18 | Trait1 | main.rs:299:5:303:5 | trait Trait1 |
-| main.rs:323:25:323:26 | TT | main.rs:317:9:317:10 | TT |
-| main.rs:324:13:324:16 | Self | main.rs:315:5:328:5 | trait Trait3 |
-| main.rs:324:13:324:19 | ...::g | main.rs:302:9:302:20 | fn g |
-| main.rs:325:13:325:14 | TT | main.rs:317:9:317:10 | TT |
-| main.rs:325:13:325:17 | ...::g | main.rs:302:9:302:20 | fn g |
-| main.rs:333:10:333:15 | Trait1 | main.rs:299:5:303:5 | trait Trait1 |
-| main.rs:334:11:334:11 | S | main.rs:330:5:330:13 | struct S |
-| main.rs:337:13:337:16 | Self | main.rs:332:5:344:5 | impl Trait1 for S { ... } |
-| main.rs:337:13:337:19 | ...::g | main.rs:341:9:343:9 | fn g |
-| main.rs:347:10:347:15 | Trait2 | main.rs:305:5:313:5 | trait Trait2 |
-| main.rs:348:11:348:11 | S | main.rs:330:5:330:13 | struct S |
-| main.rs:357:17:357:17 | S | main.rs:330:5:330:13 | struct S |
-| main.rs:358:10:358:10 | S | main.rs:330:5:330:13 | struct S |
-| main.rs:359:14:359:19 | Trait1 | main.rs:299:5:303:5 | trait Trait1 |
-| main.rs:361:10:361:10 | S | main.rs:330:5:330:13 | struct S |
-| main.rs:362:14:362:19 | Trait2 | main.rs:305:5:313:5 | trait Trait2 |
-| main.rs:364:9:364:9 | S | main.rs:330:5:330:13 | struct S |
-| main.rs:364:9:364:12 | ...::g | main.rs:341:9:343:9 | fn g |
-| main.rs:374:24:374:24 | T | main.rs:372:7:372:7 | T |
-| main.rs:376:24:376:24 | T | main.rs:372:7:372:7 | T |
-| main.rs:379:24:379:24 | T | main.rs:372:7:372:7 | T |
-| main.rs:380:13:380:16 | Self | main.rs:370:5:386:5 | trait Trait1 |
-| main.rs:380:13:380:19 | ...::g | main.rs:376:9:377:9 | fn g |
-| main.rs:384:18:384:18 | T | main.rs:372:7:372:7 | T |
-| main.rs:392:9:394:9 | Trait1::<...> | main.rs:370:5:386:5 | trait Trait1 |
-| main.rs:393:11:393:11 | T | main.rs:390:7:390:7 | T |
-| main.rs:395:24:395:24 | T | main.rs:390:7:390:7 | T |
-| main.rs:397:13:397:16 | Self | main.rs:388:5:401:5 | trait Trait2 |
-| main.rs:397:13:397:19 | ...::g | main.rs:376:9:377:9 | fn g |
-| main.rs:399:13:399:16 | Self | main.rs:388:5:401:5 | trait Trait2 |
-| main.rs:399:13:399:19 | ...::c | main.rs:384:9:385:9 | Const |
-| main.rs:406:10:408:5 | Trait1::<...> | main.rs:370:5:386:5 | trait Trait1 |
-| main.rs:407:7:407:7 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:409:11:409:11 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:410:24:410:24 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:412:13:412:16 | Self | main.rs:405:5:423:5 | impl Trait1::<...> for S { ... } |
-| main.rs:412:13:412:19 | ...::g | main.rs:416:9:419:9 | fn g |
-| main.rs:416:24:416:24 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:418:13:418:16 | Self | main.rs:405:5:423:5 | impl Trait1::<...> for S { ... } |
-| main.rs:418:13:418:19 | ...::c | main.rs:421:9:422:9 | Const |
-| main.rs:421:18:421:18 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:421:22:421:22 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:426:10:428:5 | Trait2::<...> | main.rs:388:5:401:5 | trait Trait2 |
-| main.rs:427:7:427:7 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:429:11:429:11 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:430:24:430:24 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:432:13:432:16 | Self | main.rs:425:5:434:5 | impl Trait2::<...> for S { ... } |
-| main.rs:439:17:439:17 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:440:10:440:10 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:441:14:443:11 | Trait1::<...> | main.rs:370:5:386:5 | trait Trait1 |
-| main.rs:442:13:442:13 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:445:10:445:10 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:446:14:448:11 | Trait2::<...> | main.rs:388:5:401:5 | trait Trait2 |
-| main.rs:447:13:447:13 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:450:9:450:9 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:450:9:450:12 | ...::g | main.rs:416:9:419:9 | fn g |
-| main.rs:452:9:452:9 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:452:9:452:12 | ...::h | main.rs:379:9:382:9 | fn h |
-| main.rs:454:9:454:9 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:454:9:454:12 | ...::c | main.rs:421:9:422:9 | Const |
-| main.rs:455:10:455:10 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:456:14:458:11 | Trait1::<...> | main.rs:370:5:386:5 | trait Trait1 |
-| main.rs:457:13:457:13 | S | main.rs:403:5:403:13 | struct S |
-| main.rs:475:14:475:16 | Foo | main.rs:465:9:467:9 | trait Foo |
-| main.rs:475:22:475:22 | X | main.rs:473:9:473:21 | struct X |
-| main.rs:481:14:481:16 | Bar | main.rs:469:9:471:9 | trait Bar |
-| main.rs:481:22:481:22 | X | main.rs:473:9:473:21 | struct X |
-| main.rs:488:9:488:9 | m | main.rs:464:5:486:5 | mod m |
-| main.rs:488:9:488:12 | ...::X | main.rs:473:9:473:21 | struct X |
-| main.rs:491:17:491:17 | X | main.rs:473:9:473:21 | struct X |
-| main.rs:494:17:494:17 | m | main.rs:464:5:486:5 | mod m |
-| main.rs:494:17:494:22 | ...::Foo | main.rs:465:9:467:9 | trait Foo |
-| main.rs:495:13:495:13 | X | main.rs:473:9:473:21 | struct X |
-| main.rs:495:13:495:23 | ...::a_method | main.rs:475:26:478:13 | fn a_method |
-| main.rs:499:17:499:17 | m | main.rs:464:5:486:5 | mod m |
-| main.rs:499:17:499:22 | ...::Bar | main.rs:469:9:471:9 | trait Bar |
-| main.rs:500:13:500:13 | X | main.rs:473:9:473:21 | struct X |
-| main.rs:500:13:500:23 | ...::a_method | main.rs:481:26:484:13 | fn a_method |
-| main.rs:504:17:504:17 | m | main.rs:464:5:486:5 | mod m |
-| main.rs:504:17:504:22 | ...::Bar | main.rs:469:9:471:9 | trait Bar |
-| main.rs:505:13:505:13 | X | main.rs:473:9:473:21 | struct X |
-| main.rs:505:13:505:23 | ...::a_method | main.rs:481:26:484:13 | fn a_method |
-| main.rs:510:13:510:13 | m | main.rs:464:5:486:5 | mod m |
-| main.rs:510:13:510:18 | ...::Bar | main.rs:469:9:471:9 | trait Bar |
-| main.rs:510:13:510:28 | ...::a_method | main.rs:470:13:470:31 | fn a_method |
-| main.rs:523:10:523:16 | MyTrait | main.rs:516:5:518:5 | trait MyTrait |
-| main.rs:524:9:524:9 | S | main.rs:520:5:520:13 | struct S |
-| main.rs:532:7:532:13 | MyTrait | main.rs:516:5:518:5 | trait MyTrait |
-| main.rs:533:10:533:10 | T | main.rs:531:10:531:10 | T |
-| main.rs:535:9:535:9 | T | main.rs:531:10:531:10 | T |
-| main.rs:535:9:535:12 | ...::f | main.rs:517:9:517:20 | fn f |
-| main.rs:536:9:536:15 | MyTrait | main.rs:516:5:518:5 | trait MyTrait |
-| main.rs:536:9:536:18 | ...::f | main.rs:517:9:517:20 | fn f |
-| main.rs:541:9:541:9 | g | main.rs:530:5:537:5 | fn g |
-| main.rs:542:11:542:11 | S | main.rs:520:5:520:13 | struct S |
-| main.rs:560:17:560:21 | super | main.rs:552:5:564:5 | mod m19 |
-| main.rs:560:17:560:24 | ...::f | main.rs:553:9:555:9 | fn f |
-| main.rs:561:17:561:21 | super | main.rs:552:5:564:5 | mod m19 |
-| main.rs:561:17:561:28 | ...::super | main.rs:547:1:565:1 | mod m18 |
-| main.rs:561:17:561:31 | ...::f | main.rs:548:5:550:5 | fn f |
-| main.rs:578:13:578:17 | super | main.rs:567:1:592:1 | mod m21 |
-| main.rs:578:13:578:22 | ...::m22 | main.rs:568:5:574:5 | mod m22 |
-| main.rs:578:13:578:30 | ...::MyEnum | main.rs:569:9:571:9 | enum MyEnum |
-| main.rs:579:13:579:16 | self | main.rs:569:9:571:9 | enum MyEnum |
-| main.rs:583:13:583:17 | super | main.rs:567:1:592:1 | mod m21 |
-| main.rs:583:13:583:22 | ...::m22 | main.rs:568:5:574:5 | mod m22 |
-| main.rs:583:13:583:32 | ...::MyStruct | main.rs:573:9:573:28 | struct MyStruct |
-| main.rs:584:13:584:16 | self | main.rs:573:9:573:28 | struct MyStruct |
-| main.rs:588:21:588:26 | MyEnum | main.rs:569:9:571:9 | enum MyEnum |
-| main.rs:588:21:588:29 | ...::A | main.rs:570:13:570:13 | A |
-| main.rs:589:21:589:28 | MyStruct | main.rs:573:9:573:28 | struct MyStruct |
-| main.rs:605:10:607:5 | Trait1::<...> | main.rs:595:5:600:5 | trait Trait1 |
-| main.rs:606:7:606:10 | Self | main.rs:602:5:602:13 | struct S |
-| main.rs:608:11:608:11 | S | main.rs:602:5:602:13 | struct S |
-| main.rs:616:17:616:17 | S | main.rs:602:5:602:13 | struct S |
-| main.rs:632:15:632:15 | T | main.rs:631:26:631:26 | T |
-| main.rs:637:9:637:24 | GenericStruct::<...> | main.rs:630:5:633:5 | struct GenericStruct |
-| main.rs:637:23:637:23 | T | main.rs:636:10:636:10 | T |
-| main.rs:639:9:639:9 | T | main.rs:636:10:636:10 | T |
-| main.rs:639:12:639:17 | TraitA | main.rs:622:5:624:5 | trait TraitA |
-| main.rs:648:9:648:24 | GenericStruct::<...> | main.rs:630:5:633:5 | struct GenericStruct |
-| main.rs:648:23:648:23 | T | main.rs:647:10:647:10 | T |
-| main.rs:650:9:650:9 | T | main.rs:647:10:647:10 | T |
-| main.rs:650:12:650:17 | TraitB | main.rs:626:5:628:5 | trait TraitB |
-| main.rs:651:9:651:9 | T | main.rs:647:10:647:10 | T |
-| main.rs:651:12:651:17 | TraitA | main.rs:622:5:624:5 | trait TraitA |
-| main.rs:662:10:662:15 | TraitA | main.rs:622:5:624:5 | trait TraitA |
-| main.rs:662:21:662:31 | Implementor | main.rs:659:5:659:23 | struct Implementor |
-| main.rs:669:10:669:15 | TraitB | main.rs:626:5:628:5 | trait TraitB |
-| main.rs:669:21:669:31 | Implementor | main.rs:659:5:659:23 | struct Implementor |
-| main.rs:677:24:677:34 | Implementor | main.rs:659:5:659:23 | struct Implementor |
-| main.rs:678:23:678:35 | GenericStruct | main.rs:630:5:633:5 | struct GenericStruct |
-| main.rs:684:9:684:36 | GenericStruct::<...> | main.rs:630:5:633:5 | struct GenericStruct |
-| main.rs:684:9:684:50 | ...::call_trait_a | main.rs:641:9:643:9 | fn call_trait_a |
-| main.rs:684:25:684:35 | Implementor | main.rs:659:5:659:23 | struct Implementor |
-| main.rs:687:9:687:36 | GenericStruct::<...> | main.rs:630:5:633:5 | struct GenericStruct |
-| main.rs:687:9:687:47 | ...::call_both | main.rs:653:9:656:9 | fn call_both |
-| main.rs:687:25:687:35 | Implementor | main.rs:659:5:659:23 | struct Implementor |
-| main.rs:693:3:693:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
-| main.rs:693:3:693:24 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix |
-| main.rs:697:6:697:12 | AStruct | main.rs:696:1:696:17 | struct AStruct |
-| main.rs:699:7:699:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
-| main.rs:699:7:699:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix |
-| main.rs:702:7:702:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
-| main.rs:702:7:702:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix |
-| main.rs:707:9:707:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
-| main.rs:707:9:707:19 | ...::marker | {EXTERNAL LOCATION} | mod marker |
-| main.rs:707:9:707:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData |
-| main.rs:708:9:708:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
-| main.rs:708:9:708:19 | ...::result | {EXTERNAL LOCATION} | mod result |
-| main.rs:708:9:708:27 | ...::Result | {EXTERNAL LOCATION} | enum Result |
-| main.rs:716:19:716:22 | Self | main.rs:710:5:718:5 | trait Reduce |
-| main.rs:716:19:716:29 | ...::Input | main.rs:711:9:711:19 | type Input |
-| main.rs:717:14:717:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result |
-| main.rs:717:21:717:24 | Self | main.rs:710:5:718:5 | trait Reduce |
-| main.rs:717:21:717:32 | ...::Output | main.rs:712:21:713:20 | type Output |
-| main.rs:717:35:717:38 | Self | main.rs:710:5:718:5 | trait Reduce |
-| main.rs:717:35:717:45 | ...::Error | main.rs:711:21:712:19 | type Error |
-| main.rs:721:17:721:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData |
-| main.rs:721:29:721:33 | Input | main.rs:720:19:720:23 | Input |
-| main.rs:722:17:722:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData |
-| main.rs:722:29:722:33 | Error | main.rs:720:26:720:30 | Error |
-| main.rs:729:11:729:16 | Reduce | main.rs:710:5:718:5 | trait Reduce |
-| main.rs:730:13:733:9 | MyImpl::<...> | main.rs:720:5:723:5 | struct MyImpl |
-| main.rs:731:13:731:17 | Input | main.rs:727:13:727:17 | Input |
-| main.rs:732:13:732:17 | Error | main.rs:728:13:728:17 | Error |
-| main.rs:735:22:738:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result |
-| main.rs:736:13:736:17 | Input | main.rs:727:13:727:17 | Input |
-| main.rs:737:13:737:16 | Self | main.rs:725:5:757:5 | impl Reduce for MyImpl::<...> { ... } |
-| main.rs:737:13:737:23 | ...::Error | main.rs:739:11:743:9 | type Error |
-| main.rs:740:22:742:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option |
-| main.rs:741:11:741:15 | Error | main.rs:728:13:728:17 | Error |
-| main.rs:745:13:745:17 | Input | main.rs:727:13:727:17 | Input |
-| main.rs:750:19:750:22 | Self | main.rs:725:5:757:5 | impl Reduce for MyImpl::<...> { ... } |
-| main.rs:750:19:750:29 | ...::Input | main.rs:735:9:739:9 | type Input |
-| main.rs:751:14:754:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result |
-| main.rs:752:13:752:16 | Self | main.rs:725:5:757:5 | impl Reduce for MyImpl::<...> { ... } |
-| main.rs:752:13:752:24 | ...::Output | main.rs:743:11:746:9 | type Output |
-| main.rs:753:13:753:16 | Self | main.rs:725:5:757:5 | impl Reduce for MyImpl::<...> { ... } |
-| main.rs:753:13:753:23 | ...::Error | main.rs:739:11:743:9 | type Error |
-| main.rs:760:5:760:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
-| main.rs:760:11:760:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
-| main.rs:762:15:762:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
-| main.rs:762:15:762:25 | ...::string | {EXTERNAL LOCATION} | mod string |
-| main.rs:762:15:762:33 | ...::String | {EXTERNAL LOCATION} | struct String |
-| main.rs:765:5:765:6 | my | main.rs:1:1:1:7 | mod my |
-| main.rs:765:5:765:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
-| main.rs:765:5:765:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
-| main.rs:765:5:765:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
-| main.rs:765:5:765:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
-| main.rs:766:5:766:6 | my | main.rs:1:1:1:7 | mod my |
-| main.rs:766:5:766:9 | ...::f | my.rs:5:1:7:1 | fn f |
-| main.rs:767:5:767:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
-| main.rs:767:5:767:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
-| main.rs:767:5:767:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
-| main.rs:767:5:767:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
-| main.rs:768:5:768:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
-| main.rs:769:5:769:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
-| main.rs:770:5:770:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) |
-| main.rs:770:5:770:12 | ...::h | main.rs:50:1:69:1 | fn h |
-| main.rs:771:5:771:6 | m1 | main.rs:13:1:37:1 | mod m1 |
-| main.rs:771:5:771:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
-| main.rs:771:5:771:13 | ...::g | main.rs:23:9:27:9 | fn g |
-| main.rs:772:5:772:6 | m1 | main.rs:13:1:37:1 | mod m1 |
-| main.rs:772:5:772:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 |
-| main.rs:772:5:772:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 |
-| main.rs:772:5:772:17 | ...::h | main.rs:30:27:34:13 | fn h |
-| main.rs:773:5:773:6 | m4 | main.rs:39:1:46:1 | mod m4 |
-| main.rs:773:5:773:9 | ...::i | main.rs:42:5:45:5 | fn i |
-| main.rs:774:5:774:5 | h | main.rs:50:1:69:1 | fn h |
-| main.rs:775:5:775:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
-| main.rs:776:5:776:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
-| main.rs:777:5:777:5 | j | main.rs:97:1:101:1 | fn j |
-| main.rs:778:5:778:6 | m6 | main.rs:109:1:120:1 | mod m6 |
-| main.rs:778:5:778:9 | ...::g | main.rs:114:5:119:5 | fn g |
-| main.rs:779:5:779:6 | m7 | main.rs:122:1:141:1 | mod m7 |
-| main.rs:779:5:779:9 | ...::f | main.rs:133:5:140:5 | fn f |
-| main.rs:780:5:780:6 | m8 | main.rs:143:1:197:1 | mod m8 |
-| main.rs:780:5:780:9 | ...::g | main.rs:181:5:196:5 | fn g |
-| main.rs:781:5:781:6 | m9 | main.rs:199:1:207:1 | mod m9 |
-| main.rs:781:5:781:9 | ...::f | main.rs:202:5:206:5 | fn f |
-| main.rs:782:5:782:7 | m11 | main.rs:230:1:267:1 | mod m11 |
-| main.rs:782:5:782:10 | ...::f | main.rs:235:5:238:5 | fn f |
-| main.rs:783:5:783:7 | m15 | main.rs:298:1:367:1 | mod m15 |
-| main.rs:783:5:783:10 | ...::f | main.rs:354:5:366:5 | fn f |
-| main.rs:784:5:784:7 | m16 | main.rs:369:1:461:1 | mod m16 |
-| main.rs:784:5:784:10 | ...::f | main.rs:436:5:460:5 | fn f |
-| main.rs:785:5:785:20 | trait_visibility | main.rs:463:1:513:1 | mod trait_visibility |
-| main.rs:785:5:785:23 | ...::f | main.rs:490:5:512:5 | fn f |
-| main.rs:786:5:786:7 | m17 | main.rs:515:1:545:1 | mod m17 |
-| main.rs:786:5:786:10 | ...::f | main.rs:539:5:544:5 | fn f |
-| main.rs:787:5:787:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
-| main.rs:787:5:787:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
-| main.rs:788:5:788:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
-| main.rs:788:5:788:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f |
-| main.rs:789:5:789:7 | my3 | my2/mod.rs:12:1:12:12 | mod my3 |
-| main.rs:789:5:789:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f |
-| main.rs:790:5:790:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
-| main.rs:791:5:791:7 | m18 | main.rs:547:1:565:1 | mod m18 |
-| main.rs:791:5:791:12 | ...::m19 | main.rs:552:5:564:5 | mod m19 |
-| main.rs:791:5:791:17 | ...::m20 | main.rs:557:9:563:9 | mod m20 |
-| main.rs:791:5:791:20 | ...::g | main.rs:558:13:562:13 | fn g |
-| main.rs:792:5:792:7 | m23 | main.rs:594:1:619:1 | mod m23 |
-| main.rs:792:5:792:10 | ...::f | main.rs:614:5:618:5 | fn f |
-| main.rs:793:5:793:7 | m24 | main.rs:621:1:689:1 | mod m24 |
-| main.rs:793:5:793:10 | ...::f | main.rs:675:5:688:5 | fn f |
-| main.rs:794:5:794:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) |
-| main.rs:794:5:794:11 | ...::h | main.rs:50:1:69:1 | fn h |
-| main.rs:796:5:796:11 | AStruct | main.rs:696:1:696:17 | struct AStruct |
-| main.rs:797:5:797:11 | AStruct | main.rs:696:1:696:17 | struct AStruct |
+| main.rs:12:5:12:7 | my2 | main.rs:7:1:7:8 | mod my2 |
+| main.rs:12:5:12:16 | ...::nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
+| main.rs:12:5:12:25 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
+| main.rs:12:5:12:34 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
+| main.rs:13:5:13:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
+| main.rs:14:5:14:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
+| main.rs:17:5:17:7 | my2 | main.rs:7:1:7:8 | mod my2 |
+| main.rs:17:5:17:18 | ...::nested8_f | my2/nested2.rs:23:9:25:9 | fn f |
+| main.rs:31:13:31:13 | f | main.rs:25:9:27:9 | fn f |
+| main.rs:32:13:32:17 | super | main.rs:19:1:43:1 | mod m1 |
+| main.rs:32:13:32:20 | ...::f | main.rs:20:5:22:5 | fn f |
+| main.rs:36:17:36:21 | super | main.rs:24:5:42:5 | mod m2 |
+| main.rs:36:17:36:24 | ...::f | main.rs:25:9:27:9 | fn f |
+| main.rs:39:17:39:17 | f | main.rs:25:9:27:9 | fn f |
+| main.rs:46:9:46:13 | super | main.rs:1:1:805:2 | SourceFile |
+| main.rs:46:9:46:17 | ...::m1 | main.rs:19:1:43:1 | mod m1 |
+| main.rs:46:9:46:21 | ...::m2 | main.rs:24:5:42:5 | mod m2 |
+| main.rs:46:9:46:24 | ...::g | main.rs:29:9:33:9 | fn g |
+| main.rs:50:9:50:9 | g | main.rs:29:9:33:9 | fn g |
+| main.rs:62:13:62:14 | m1 | main.rs:19:1:43:1 | mod m1 |
+| main.rs:62:13:62:18 | ...::m2 | main.rs:24:5:42:5 | mod m2 |
+| main.rs:62:13:62:21 | ...::g | main.rs:29:9:33:9 | fn g |
+| main.rs:63:9:63:9 | g | main.rs:29:9:33:9 | fn g |
+| main.rs:67:17:67:19 | Foo | main.rs:65:9:65:21 | struct Foo |
+| main.rs:70:13:70:15 | Foo | main.rs:59:5:59:17 | struct Foo |
+| main.rs:72:5:72:5 | f | main.rs:61:5:68:5 | fn f |
+| main.rs:74:5:74:8 | self | main.rs:1:1:805:2 | SourceFile |
+| main.rs:74:5:74:11 | ...::i | main.rs:77:1:89:1 | fn i |
+| main.rs:80:13:80:15 | Foo | main.rs:54:1:54:13 | struct Foo |
+| main.rs:84:16:84:18 | i32 | {EXTERNAL LOCATION} | struct i32 |
+| main.rs:87:17:87:19 | Foo | main.rs:83:9:85:9 | struct Foo |
+| main.rs:91:5:91:7 | my2 | main.rs:7:1:7:8 | mod my2 |
+| main.rs:91:5:91:16 | ...::nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
+| main.rs:93:5:93:21 | my2_nested2_alias | my2/mod.rs:1:1:1:16 | mod nested2 |
+| main.rs:93:5:93:30 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
+| main.rs:93:34:93:40 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
+| main.rs:93:34:93:43 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
+| main.rs:93:57:93:63 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
+| main.rs:93:57:93:66 | ...::g | my2/nested2.rs:7:9:9:9 | fn g |
+| main.rs:93:80:93:86 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
+| main.rs:106:5:106:22 | f_defined_in_macro | main.rs:105:18:105:42 | fn f_defined_in_macro |
+| main.rs:123:13:123:17 | super | main.rs:1:1:805:2 | SourceFile |
+| main.rs:123:13:123:21 | ...::m5 | main.rs:109:1:113:1 | mod m5 |
+| main.rs:124:9:124:9 | f | main.rs:110:5:112:5 | fn f |
+| main.rs:124:9:124:9 | f | main.rs:116:5:118:5 | fn f |
+| main.rs:131:13:131:15 | i32 | {EXTERNAL LOCATION} | struct i32 |
+| main.rs:134:16:134:18 | i32 | {EXTERNAL LOCATION} | struct i32 |
+| main.rs:140:19:140:24 | MyEnum | main.rs:129:5:137:5 | enum MyEnum |
+| main.rs:143:17:143:22 | MyEnum | main.rs:129:5:137:5 | enum MyEnum |
+| main.rs:143:17:143:25 | ...::A | main.rs:130:9:132:9 | A |
+| main.rs:144:17:144:22 | MyEnum | main.rs:129:5:137:5 | enum MyEnum |
+| main.rs:144:17:144:25 | ...::B | main.rs:132:12:135:9 | B |
+| main.rs:145:9:145:14 | MyEnum | main.rs:129:5:137:5 | enum MyEnum |
+| main.rs:145:9:145:17 | ...::C | main.rs:135:12:136:9 | C |
+| main.rs:155:13:155:13 | f | main.rs:162:5:164:5 | fn f |
+| main.rs:156:13:156:16 | Self | main.rs:150:5:158:5 | trait MyTrait |
+| main.rs:156:13:156:19 | ...::f | main.rs:151:9:151:20 | fn f |
+| main.rs:167:10:167:16 | MyTrait | main.rs:150:5:158:5 | trait MyTrait |
+| main.rs:167:22:167:29 | MyStruct | main.rs:160:5:160:22 | struct MyStruct |
+| main.rs:170:13:170:13 | f | main.rs:162:5:164:5 | fn f |
+| main.rs:171:13:171:16 | Self | main.rs:166:5:177:5 | impl MyTrait for MyStruct { ... } |
+| main.rs:171:13:171:19 | ...::g | main.rs:174:9:176:9 | fn g |
+| main.rs:180:10:180:17 | MyStruct | main.rs:160:5:160:22 | struct MyStruct |
+| main.rs:183:13:183:13 | f | main.rs:162:5:164:5 | fn f |
+| main.rs:189:17:189:24 | MyStruct | main.rs:160:5:160:22 | struct MyStruct |
+| main.rs:190:9:190:15 | MyTrait | main.rs:150:5:158:5 | trait MyTrait |
+| main.rs:190:9:190:18 | ...::f | main.rs:151:9:151:20 | fn f |
+| main.rs:191:9:191:16 | MyStruct | main.rs:160:5:160:22 | struct MyStruct |
+| main.rs:191:9:191:19 | ...::f | main.rs:167:33:172:9 | fn f |
+| main.rs:192:10:192:17 | MyStruct | main.rs:160:5:160:22 | struct MyStruct |
+| main.rs:193:10:193:16 | MyTrait | main.rs:150:5:158:5 | trait MyTrait |
+| main.rs:196:17:196:24 | MyStruct | main.rs:160:5:160:22 | struct MyStruct |
+| main.rs:198:17:198:24 | MyStruct | main.rs:160:5:160:22 | struct MyStruct |
+| main.rs:200:9:200:16 | MyStruct | main.rs:160:5:160:22 | struct MyStruct |
+| main.rs:200:9:200:19 | ...::h | main.rs:180:21:184:9 | fn h |
+| main.rs:209:19:209:22 | self | main.rs:205:1:213:1 | mod m9 |
+| main.rs:209:19:209:32 | ...::MyStruct | main.rs:206:5:206:26 | struct MyStruct |
+| main.rs:211:9:211:12 | self | main.rs:205:1:213:1 | mod m9 |
+| main.rs:211:9:211:22 | ...::MyStruct | main.rs:206:5:206:26 | struct MyStruct |
+| main.rs:221:12:221:12 | T | main.rs:218:7:218:7 | T |
+| main.rs:226:12:226:12 | T | main.rs:225:14:225:14 | T |
+| main.rs:228:7:230:7 | MyStruct::<...> | main.rs:216:5:222:5 | struct MyStruct |
+| main.rs:229:9:229:9 | T | main.rs:225:14:225:14 | T |
+| main.rs:232:9:232:16 | MyStruct | main.rs:216:5:222:5 | struct MyStruct |
+| main.rs:242:17:242:19 | Foo | main.rs:237:5:237:21 | struct Foo |
+| main.rs:243:9:243:11 | Foo | main.rs:239:5:239:15 | fn Foo |
+| main.rs:252:9:252:11 | Bar | main.rs:248:5:250:5 | enum Bar |
+| main.rs:252:9:252:19 | ...::FooBar | main.rs:249:9:249:17 | FooBar |
+| main.rs:257:13:257:15 | Foo | main.rs:237:5:237:21 | struct Foo |
+| main.rs:258:17:258:22 | FooBar | main.rs:249:9:249:17 | FooBar |
+| main.rs:259:17:259:22 | FooBar | main.rs:254:5:254:18 | fn FooBar |
+| main.rs:267:9:267:9 | E | main.rs:262:15:265:5 | enum E |
+| main.rs:267:9:267:12 | ...::C | main.rs:264:9:264:9 | C |
+| main.rs:270:17:270:17 | S | main.rs:262:5:262:13 | struct S |
+| main.rs:271:17:271:17 | C | main.rs:264:9:264:9 | C |
+| main.rs:284:16:284:16 | T | main.rs:278:7:278:7 | T |
+| main.rs:285:14:285:17 | Self | main.rs:276:5:286:5 | trait MyParamTrait |
+| main.rs:285:14:285:33 | ...::AssociatedType | main.rs:280:9:280:28 | type AssociatedType |
+| main.rs:294:13:294:16 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) |
+| main.rs:294:13:294:21 | ...::m13 | main.rs:289:1:302:1 | mod m13 |
+| main.rs:294:13:294:24 | ...::f | main.rs:290:5:290:17 | fn f |
+| main.rs:294:13:294:24 | ...::f | main.rs:290:19:291:19 | struct f |
+| main.rs:297:17:297:17 | f | main.rs:290:19:291:19 | struct f |
+| main.rs:298:21:298:21 | f | main.rs:290:19:291:19 | struct f |
+| main.rs:299:13:299:13 | f | main.rs:290:5:290:17 | fn f |
+| main.rs:313:9:313:14 | Trait1 | main.rs:305:5:309:5 | trait Trait1 |
+| main.rs:316:13:316:16 | Self | main.rs:311:5:319:5 | trait Trait2 |
+| main.rs:316:13:316:19 | ...::g | main.rs:308:9:308:20 | fn g |
+| main.rs:326:9:326:12 | Self | main.rs:321:5:334:5 | trait Trait3 |
+| main.rs:326:15:326:20 | Trait1 | main.rs:305:5:309:5 | trait Trait1 |
+| main.rs:327:9:327:10 | TT | main.rs:323:9:323:10 | TT |
+| main.rs:327:13:327:18 | Trait1 | main.rs:305:5:309:5 | trait Trait1 |
+| main.rs:329:25:329:26 | TT | main.rs:323:9:323:10 | TT |
+| main.rs:330:13:330:16 | Self | main.rs:321:5:334:5 | trait Trait3 |
+| main.rs:330:13:330:19 | ...::g | main.rs:308:9:308:20 | fn g |
+| main.rs:331:13:331:14 | TT | main.rs:323:9:323:10 | TT |
+| main.rs:331:13:331:17 | ...::g | main.rs:308:9:308:20 | fn g |
+| main.rs:339:10:339:15 | Trait1 | main.rs:305:5:309:5 | trait Trait1 |
+| main.rs:340:11:340:11 | S | main.rs:336:5:336:13 | struct S |
+| main.rs:343:13:343:16 | Self | main.rs:338:5:350:5 | impl Trait1 for S { ... } |
+| main.rs:343:13:343:19 | ...::g | main.rs:347:9:349:9 | fn g |
+| main.rs:353:10:353:15 | Trait2 | main.rs:311:5:319:5 | trait Trait2 |
+| main.rs:354:11:354:11 | S | main.rs:336:5:336:13 | struct S |
+| main.rs:363:17:363:17 | S | main.rs:336:5:336:13 | struct S |
+| main.rs:364:10:364:10 | S | main.rs:336:5:336:13 | struct S |
+| main.rs:365:14:365:19 | Trait1 | main.rs:305:5:309:5 | trait Trait1 |
+| main.rs:367:10:367:10 | S | main.rs:336:5:336:13 | struct S |
+| main.rs:368:14:368:19 | Trait2 | main.rs:311:5:319:5 | trait Trait2 |
+| main.rs:370:9:370:9 | S | main.rs:336:5:336:13 | struct S |
+| main.rs:370:9:370:12 | ...::g | main.rs:347:9:349:9 | fn g |
+| main.rs:380:24:380:24 | T | main.rs:378:7:378:7 | T |
+| main.rs:382:24:382:24 | T | main.rs:378:7:378:7 | T |
+| main.rs:385:24:385:24 | T | main.rs:378:7:378:7 | T |
+| main.rs:386:13:386:16 | Self | main.rs:376:5:392:5 | trait Trait1 |
+| main.rs:386:13:386:19 | ...::g | main.rs:382:9:383:9 | fn g |
+| main.rs:390:18:390:18 | T | main.rs:378:7:378:7 | T |
+| main.rs:398:9:400:9 | Trait1::<...> | main.rs:376:5:392:5 | trait Trait1 |
+| main.rs:399:11:399:11 | T | main.rs:396:7:396:7 | T |
+| main.rs:401:24:401:24 | T | main.rs:396:7:396:7 | T |
+| main.rs:403:13:403:16 | Self | main.rs:394:5:407:5 | trait Trait2 |
+| main.rs:403:13:403:19 | ...::g | main.rs:382:9:383:9 | fn g |
+| main.rs:405:13:405:16 | Self | main.rs:394:5:407:5 | trait Trait2 |
+| main.rs:405:13:405:19 | ...::c | main.rs:390:9:391:9 | Const |
+| main.rs:412:10:414:5 | Trait1::<...> | main.rs:376:5:392:5 | trait Trait1 |
+| main.rs:413:7:413:7 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:415:11:415:11 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:416:24:416:24 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:418:13:418:16 | Self | main.rs:411:5:429:5 | impl Trait1::<...> for S { ... } |
+| main.rs:418:13:418:19 | ...::g | main.rs:422:9:425:9 | fn g |
+| main.rs:422:24:422:24 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:424:13:424:16 | Self | main.rs:411:5:429:5 | impl Trait1::<...> for S { ... } |
+| main.rs:424:13:424:19 | ...::c | main.rs:427:9:428:9 | Const |
+| main.rs:427:18:427:18 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:427:22:427:22 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:432:10:434:5 | Trait2::<...> | main.rs:394:5:407:5 | trait Trait2 |
+| main.rs:433:7:433:7 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:435:11:435:11 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:436:24:436:24 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:438:13:438:16 | Self | main.rs:431:5:440:5 | impl Trait2::<...> for S { ... } |
+| main.rs:445:17:445:17 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:446:10:446:10 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:447:14:449:11 | Trait1::<...> | main.rs:376:5:392:5 | trait Trait1 |
+| main.rs:448:13:448:13 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:451:10:451:10 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:452:14:454:11 | Trait2::<...> | main.rs:394:5:407:5 | trait Trait2 |
+| main.rs:453:13:453:13 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:456:9:456:9 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:456:9:456:12 | ...::g | main.rs:422:9:425:9 | fn g |
+| main.rs:458:9:458:9 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:458:9:458:12 | ...::h | main.rs:385:9:388:9 | fn h |
+| main.rs:460:9:460:9 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:460:9:460:12 | ...::c | main.rs:427:9:428:9 | Const |
+| main.rs:461:10:461:10 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:462:14:464:11 | Trait1::<...> | main.rs:376:5:392:5 | trait Trait1 |
+| main.rs:463:13:463:13 | S | main.rs:409:5:409:13 | struct S |
+| main.rs:481:14:481:16 | Foo | main.rs:471:9:473:9 | trait Foo |
+| main.rs:481:22:481:22 | X | main.rs:479:9:479:21 | struct X |
+| main.rs:487:14:487:16 | Bar | main.rs:475:9:477:9 | trait Bar |
+| main.rs:487:22:487:22 | X | main.rs:479:9:479:21 | struct X |
+| main.rs:494:9:494:9 | m | main.rs:470:5:492:5 | mod m |
+| main.rs:494:9:494:12 | ...::X | main.rs:479:9:479:21 | struct X |
+| main.rs:497:17:497:17 | X | main.rs:479:9:479:21 | struct X |
+| main.rs:500:17:500:17 | m | main.rs:470:5:492:5 | mod m |
+| main.rs:500:17:500:22 | ...::Foo | main.rs:471:9:473:9 | trait Foo |
+| main.rs:501:13:501:13 | X | main.rs:479:9:479:21 | struct X |
+| main.rs:501:13:501:23 | ...::a_method | main.rs:481:26:484:13 | fn a_method |
+| main.rs:505:17:505:17 | m | main.rs:470:5:492:5 | mod m |
+| main.rs:505:17:505:22 | ...::Bar | main.rs:475:9:477:9 | trait Bar |
+| main.rs:506:13:506:13 | X | main.rs:479:9:479:21 | struct X |
+| main.rs:506:13:506:23 | ...::a_method | main.rs:487:26:490:13 | fn a_method |
+| main.rs:510:17:510:17 | m | main.rs:470:5:492:5 | mod m |
+| main.rs:510:17:510:22 | ...::Bar | main.rs:475:9:477:9 | trait Bar |
+| main.rs:511:13:511:13 | X | main.rs:479:9:479:21 | struct X |
+| main.rs:511:13:511:23 | ...::a_method | main.rs:487:26:490:13 | fn a_method |
+| main.rs:516:13:516:13 | m | main.rs:470:5:492:5 | mod m |
+| main.rs:516:13:516:18 | ...::Bar | main.rs:475:9:477:9 | trait Bar |
+| main.rs:516:13:516:28 | ...::a_method | main.rs:476:13:476:31 | fn a_method |
+| main.rs:529:10:529:16 | MyTrait | main.rs:522:5:524:5 | trait MyTrait |
+| main.rs:530:9:530:9 | S | main.rs:526:5:526:13 | struct S |
+| main.rs:538:7:538:13 | MyTrait | main.rs:522:5:524:5 | trait MyTrait |
+| main.rs:539:10:539:10 | T | main.rs:537:10:537:10 | T |
+| main.rs:541:9:541:9 | T | main.rs:537:10:537:10 | T |
+| main.rs:541:9:541:12 | ...::f | main.rs:523:9:523:20 | fn f |
+| main.rs:542:9:542:15 | MyTrait | main.rs:522:5:524:5 | trait MyTrait |
+| main.rs:542:9:542:18 | ...::f | main.rs:523:9:523:20 | fn f |
+| main.rs:547:9:547:9 | g | main.rs:536:5:543:5 | fn g |
+| main.rs:548:11:548:11 | S | main.rs:526:5:526:13 | struct S |
+| main.rs:566:17:566:21 | super | main.rs:558:5:570:5 | mod m19 |
+| main.rs:566:17:566:24 | ...::f | main.rs:559:9:561:9 | fn f |
+| main.rs:567:17:567:21 | super | main.rs:558:5:570:5 | mod m19 |
+| main.rs:567:17:567:28 | ...::super | main.rs:553:1:571:1 | mod m18 |
+| main.rs:567:17:567:31 | ...::f | main.rs:554:5:556:5 | fn f |
+| main.rs:584:13:584:17 | super | main.rs:573:1:598:1 | mod m21 |
+| main.rs:584:13:584:22 | ...::m22 | main.rs:574:5:580:5 | mod m22 |
+| main.rs:584:13:584:30 | ...::MyEnum | main.rs:575:9:577:9 | enum MyEnum |
+| main.rs:585:13:585:16 | self | main.rs:575:9:577:9 | enum MyEnum |
+| main.rs:589:13:589:17 | super | main.rs:573:1:598:1 | mod m21 |
+| main.rs:589:13:589:22 | ...::m22 | main.rs:574:5:580:5 | mod m22 |
+| main.rs:589:13:589:32 | ...::MyStruct | main.rs:579:9:579:28 | struct MyStruct |
+| main.rs:590:13:590:16 | self | main.rs:579:9:579:28 | struct MyStruct |
+| main.rs:594:21:594:26 | MyEnum | main.rs:575:9:577:9 | enum MyEnum |
+| main.rs:594:21:594:29 | ...::A | main.rs:576:13:576:13 | A |
+| main.rs:595:21:595:28 | MyStruct | main.rs:579:9:579:28 | struct MyStruct |
+| main.rs:611:10:613:5 | Trait1::<...> | main.rs:601:5:606:5 | trait Trait1 |
+| main.rs:612:7:612:10 | Self | main.rs:608:5:608:13 | struct S |
+| main.rs:614:11:614:11 | S | main.rs:608:5:608:13 | struct S |
+| main.rs:622:17:622:17 | S | main.rs:608:5:608:13 | struct S |
+| main.rs:638:15:638:15 | T | main.rs:637:26:637:26 | T |
+| main.rs:643:9:643:24 | GenericStruct::<...> | main.rs:636:5:639:5 | struct GenericStruct |
+| main.rs:643:23:643:23 | T | main.rs:642:10:642:10 | T |
+| main.rs:645:9:645:9 | T | main.rs:642:10:642:10 | T |
+| main.rs:645:12:645:17 | TraitA | main.rs:628:5:630:5 | trait TraitA |
+| main.rs:654:9:654:24 | GenericStruct::<...> | main.rs:636:5:639:5 | struct GenericStruct |
+| main.rs:654:23:654:23 | T | main.rs:653:10:653:10 | T |
+| main.rs:656:9:656:9 | T | main.rs:653:10:653:10 | T |
+| main.rs:656:12:656:17 | TraitB | main.rs:632:5:634:5 | trait TraitB |
+| main.rs:657:9:657:9 | T | main.rs:653:10:653:10 | T |
+| main.rs:657:12:657:17 | TraitA | main.rs:628:5:630:5 | trait TraitA |
+| main.rs:668:10:668:15 | TraitA | main.rs:628:5:630:5 | trait TraitA |
+| main.rs:668:21:668:31 | Implementor | main.rs:665:5:665:23 | struct Implementor |
+| main.rs:675:10:675:15 | TraitB | main.rs:632:5:634:5 | trait TraitB |
+| main.rs:675:21:675:31 | Implementor | main.rs:665:5:665:23 | struct Implementor |
+| main.rs:683:24:683:34 | Implementor | main.rs:665:5:665:23 | struct Implementor |
+| main.rs:684:23:684:35 | GenericStruct | main.rs:636:5:639:5 | struct GenericStruct |
+| main.rs:690:9:690:36 | GenericStruct::<...> | main.rs:636:5:639:5 | struct GenericStruct |
+| main.rs:690:9:690:50 | ...::call_trait_a | main.rs:647:9:649:9 | fn call_trait_a |
+| main.rs:690:25:690:35 | Implementor | main.rs:665:5:665:23 | struct Implementor |
+| main.rs:693:9:693:36 | GenericStruct::<...> | main.rs:636:5:639:5 | struct GenericStruct |
+| main.rs:693:9:693:47 | ...::call_both | main.rs:659:9:662:9 | fn call_both |
+| main.rs:693:25:693:35 | Implementor | main.rs:665:5:665:23 | struct Implementor |
+| main.rs:699:3:699:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
+| main.rs:699:3:699:24 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix |
+| main.rs:703:6:703:12 | AStruct | main.rs:702:1:702:17 | struct AStruct |
+| main.rs:705:7:705:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
+| main.rs:705:7:705:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix |
+| main.rs:708:7:708:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
+| main.rs:708:7:708:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix |
+| main.rs:713:9:713:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
+| main.rs:713:9:713:19 | ...::marker | {EXTERNAL LOCATION} | mod marker |
+| main.rs:713:9:713:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData |
+| main.rs:714:9:714:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
+| main.rs:714:9:714:19 | ...::result | {EXTERNAL LOCATION} | mod result |
+| main.rs:714:9:714:27 | ...::Result | {EXTERNAL LOCATION} | enum Result |
+| main.rs:722:19:722:22 | Self | main.rs:716:5:724:5 | trait Reduce |
+| main.rs:722:19:722:29 | ...::Input | main.rs:717:9:717:19 | type Input |
+| main.rs:723:14:723:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result |
+| main.rs:723:21:723:24 | Self | main.rs:716:5:724:5 | trait Reduce |
+| main.rs:723:21:723:32 | ...::Output | main.rs:718:21:719:20 | type Output |
+| main.rs:723:35:723:38 | Self | main.rs:716:5:724:5 | trait Reduce |
+| main.rs:723:35:723:45 | ...::Error | main.rs:717:21:718:19 | type Error |
+| main.rs:727:17:727:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData |
+| main.rs:727:29:727:33 | Input | main.rs:726:19:726:23 | Input |
+| main.rs:728:17:728:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData |
+| main.rs:728:29:728:33 | Error | main.rs:726:26:726:30 | Error |
+| main.rs:735:11:735:16 | Reduce | main.rs:716:5:724:5 | trait Reduce |
+| main.rs:736:13:739:9 | MyImpl::<...> | main.rs:726:5:729:5 | struct MyImpl |
+| main.rs:737:13:737:17 | Input | main.rs:733:13:733:17 | Input |
+| main.rs:738:13:738:17 | Error | main.rs:734:13:734:17 | Error |
+| main.rs:741:22:744:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result |
+| main.rs:742:13:742:17 | Input | main.rs:733:13:733:17 | Input |
+| main.rs:743:13:743:16 | Self | main.rs:731:5:763:5 | impl Reduce for MyImpl::<...> { ... } |
+| main.rs:743:13:743:23 | ...::Error | main.rs:745:11:749:9 | type Error |
+| main.rs:746:22:748:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option |
+| main.rs:747:11:747:15 | Error | main.rs:734:13:734:17 | Error |
+| main.rs:751:13:751:17 | Input | main.rs:733:13:733:17 | Input |
+| main.rs:756:19:756:22 | Self | main.rs:731:5:763:5 | impl Reduce for MyImpl::<...> { ... } |
+| main.rs:756:19:756:29 | ...::Input | main.rs:741:9:745:9 | type Input |
+| main.rs:757:14:760:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result |
+| main.rs:758:13:758:16 | Self | main.rs:731:5:763:5 | impl Reduce for MyImpl::<...> { ... } |
+| main.rs:758:13:758:24 | ...::Output | main.rs:749:11:752:9 | type Output |
+| main.rs:759:13:759:16 | Self | main.rs:731:5:763:5 | impl Reduce for MyImpl::<...> { ... } |
+| main.rs:759:13:759:23 | ...::Error | main.rs:745:11:749:9 | type Error |
+| main.rs:766:5:766:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
+| main.rs:766:11:766:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
+| main.rs:768:15:768:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
+| main.rs:768:15:768:25 | ...::string | {EXTERNAL LOCATION} | mod string |
+| main.rs:768:15:768:33 | ...::String | {EXTERNAL LOCATION} | struct String |
+| main.rs:771:5:771:6 | my | main.rs:1:1:1:7 | mod my |
+| main.rs:771:5:771:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
+| main.rs:771:5:771:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
+| main.rs:771:5:771:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
+| main.rs:771:5:771:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
+| main.rs:772:5:772:6 | my | main.rs:1:1:1:7 | mod my |
+| main.rs:772:5:772:9 | ...::f | my.rs:5:1:7:1 | fn f |
+| main.rs:773:5:773:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
+| main.rs:773:5:773:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
+| main.rs:773:5:773:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
+| main.rs:773:5:773:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
+| main.rs:774:5:774:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
+| main.rs:774:5:774:5 | f | my2/nested2.rs:23:9:25:9 | fn f |
+| main.rs:775:5:775:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
+| main.rs:776:5:776:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) |
+| main.rs:776:5:776:12 | ...::h | main.rs:56:1:75:1 | fn h |
+| main.rs:777:5:777:6 | m1 | main.rs:19:1:43:1 | mod m1 |
+| main.rs:777:5:777:10 | ...::m2 | main.rs:24:5:42:5 | mod m2 |
+| main.rs:777:5:777:13 | ...::g | main.rs:29:9:33:9 | fn g |
+| main.rs:778:5:778:6 | m1 | main.rs:19:1:43:1 | mod m1 |
+| main.rs:778:5:778:10 | ...::m2 | main.rs:24:5:42:5 | mod m2 |
+| main.rs:778:5:778:14 | ...::m3 | main.rs:35:9:41:9 | mod m3 |
+| main.rs:778:5:778:17 | ...::h | main.rs:36:27:40:13 | fn h |
+| main.rs:779:5:779:6 | m4 | main.rs:45:1:52:1 | mod m4 |
+| main.rs:779:5:779:9 | ...::i | main.rs:48:5:51:5 | fn i |
+| main.rs:780:5:780:5 | h | main.rs:56:1:75:1 | fn h |
+| main.rs:781:5:781:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
+| main.rs:782:5:782:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
+| main.rs:783:5:783:5 | j | main.rs:103:1:107:1 | fn j |
+| main.rs:784:5:784:6 | m6 | main.rs:115:1:126:1 | mod m6 |
+| main.rs:784:5:784:9 | ...::g | main.rs:120:5:125:5 | fn g |
+| main.rs:785:5:785:6 | m7 | main.rs:128:1:147:1 | mod m7 |
+| main.rs:785:5:785:9 | ...::f | main.rs:139:5:146:5 | fn f |
+| main.rs:786:5:786:6 | m8 | main.rs:149:1:203:1 | mod m8 |
+| main.rs:786:5:786:9 | ...::g | main.rs:187:5:202:5 | fn g |
+| main.rs:787:5:787:6 | m9 | main.rs:205:1:213:1 | mod m9 |
+| main.rs:787:5:787:9 | ...::f | main.rs:208:5:212:5 | fn f |
+| main.rs:788:5:788:7 | m11 | main.rs:236:1:273:1 | mod m11 |
+| main.rs:788:5:788:10 | ...::f | main.rs:241:5:244:5 | fn f |
+| main.rs:789:5:789:7 | m15 | main.rs:304:1:373:1 | mod m15 |
+| main.rs:789:5:789:10 | ...::f | main.rs:360:5:372:5 | fn f |
+| main.rs:790:5:790:7 | m16 | main.rs:375:1:467:1 | mod m16 |
+| main.rs:790:5:790:10 | ...::f | main.rs:442:5:466:5 | fn f |
+| main.rs:791:5:791:20 | trait_visibility | main.rs:469:1:519:1 | mod trait_visibility |
+| main.rs:791:5:791:23 | ...::f | main.rs:496:5:518:5 | fn f |
+| main.rs:792:5:792:7 | m17 | main.rs:521:1:551:1 | mod m17 |
+| main.rs:792:5:792:10 | ...::f | main.rs:545:5:550:5 | fn f |
+| main.rs:793:5:793:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
+| main.rs:793:5:793:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
+| main.rs:794:5:794:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
+| main.rs:794:5:794:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f |
+| main.rs:795:5:795:7 | my3 | my2/mod.rs:18:1:18:12 | mod my3 |
+| main.rs:795:5:795:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f |
+| main.rs:796:5:796:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
+| main.rs:797:5:797:7 | m18 | main.rs:553:1:571:1 | mod m18 |
+| main.rs:797:5:797:12 | ...::m19 | main.rs:558:5:570:5 | mod m19 |
+| main.rs:797:5:797:17 | ...::m20 | main.rs:563:9:569:9 | mod m20 |
+| main.rs:797:5:797:20 | ...::g | main.rs:564:13:568:13 | fn g |
+| main.rs:798:5:798:7 | m23 | main.rs:600:1:625:1 | mod m23 |
+| main.rs:798:5:798:10 | ...::f | main.rs:620:5:624:5 | fn f |
+| main.rs:799:5:799:7 | m24 | main.rs:627:1:695:1 | mod m24 |
+| main.rs:799:5:799:10 | ...::f | main.rs:681:5:694:5 | fn f |
+| main.rs:800:5:800:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) |
+| main.rs:800:5:800:11 | ...::h | main.rs:56:1:75:1 | fn h |
+| main.rs:802:5:802:11 | AStruct | main.rs:702:1:702:17 | struct AStruct |
+| main.rs:803:5:803:11 | AStruct | main.rs:702:1:702:17 | struct AStruct |
| my2/mod.rs:5:5:5:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
| my2/mod.rs:5:5:5:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
| my2/mod.rs:5:5:5:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
| my2/mod.rs:5:5:5:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
| my2/mod.rs:8:9:8:15 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
| my2/mod.rs:8:9:8:24 | ...::nested5 | my2/nested2.rs:13:1:19:1 | mod nested5 |
-| my2/mod.rs:10:9:10:15 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
-| my2/mod.rs:10:9:10:24 | ...::nested7 | my2/nested2.rs:21:1:27:1 | mod nested7 |
-| my2/mod.rs:10:9:10:33 | ...::nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
-| my2/mod.rs:10:37:10:40 | self | my2/nested2.rs:22:5:26:5 | mod nested8 |
-| my2/mod.rs:17:5:17:9 | mymod | my2/mod.rs:14:1:15:10 | mod mymod |
-| my2/mod.rs:17:5:17:12 | ...::f | my2/renamed.rs:1:1:1:13 | fn f |
+| my2/mod.rs:11:9:11:15 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
+| my2/mod.rs:11:9:11:24 | ...::nested7 | my2/nested2.rs:21:1:27:1 | mod nested7 |
+| my2/mod.rs:11:9:11:33 | ...::nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
+| my2/mod.rs:12:5:12:8 | self | my2/nested2.rs:22:5:26:5 | mod nested8 |
+| my2/mod.rs:13:5:13:5 | f | my2/nested2.rs:23:9:25:9 | fn f |
+| my2/mod.rs:16:5:16:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
+| my2/mod.rs:16:5:16:20 | ...::nested5 | my2/nested2.rs:13:1:19:1 | mod nested5 |
+| my2/mod.rs:16:5:16:29 | ...::nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
+| my2/mod.rs:16:5:16:32 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
+| my2/mod.rs:23:9:23:13 | mymod | my2/mod.rs:20:1:21:10 | mod mymod |
+| my2/mod.rs:23:9:23:16 | ...::f | my2/renamed.rs:1:1:1:13 | fn f |
| my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g |
-| my2/my3/mod.rs:4:5:4:5 | h | main.rs:50:1:69:1 | fn h |
-| my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:17:30 | SourceFile |
-| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:799:2 | SourceFile |
-| my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:50:1:69:1 | fn h |
-| my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:17:30 | SourceFile |
+| my2/my3/mod.rs:4:5:4:5 | h | main.rs:56:1:75:1 | fn h |
+| my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:23:34 | SourceFile |
+| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:805:2 | SourceFile |
+| my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:56:1:75:1 | fn h |
+| my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:23:34 | SourceFile |
| my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g |
+| my2/my3/mod.rs:10:5:10:9 | super | my2/mod.rs:1:1:23:34 | SourceFile |
| my.rs:3:5:3:10 | nested | my.rs:1:1:1:15 | mod nested |
| my.rs:3:5:3:13 | ...::g | my/nested.rs:19:1:22:1 | fn g |
| my.rs:11:5:11:5 | g | my/nested.rs:19:1:22:1 | fn g |
From f6bdfba3b328e8f9d42f5af0fa0cae8363122e84 Mon Sep 17 00:00:00 2001
From: Tom Hvitved
Date: Wed, 17 Sep 2025 13:43:39 +0200
Subject: [PATCH 037/160] Rust: Path resolution improvements
---
.../codeql/rust/internal/PathResolution.qll | 60 +-
.../PathResolutionConsistency.expected | 2 +
.../dataflow/sources/InlineFlow.expected | 840 +++++++++---------
.../library-tests/dataflow/sources/test.rs | 4 +-
.../PathResolutionConsistency.expected | 1 -
.../library-tests/path-resolution/main.rs | 2 +-
.../path-resolution/my2/my3/mod.rs | 2 +-
.../path-resolution/path-resolution.expected | 2 +-
8 files changed, 497 insertions(+), 416 deletions(-)
diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll
index 4b718fc4399..f819632ce10 100644
--- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll
+++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll
@@ -72,9 +72,9 @@ private ItemNode getAChildSuccessor(ItemNode item, string name, SuccessorKind ki
if item instanceof ImplOrTraitItemNode and result instanceof AssocItem
then kind.isExternal()
else
- if result instanceof Use
- then kind.isInternal()
- else kind.isBoth()
+ if result.isPublic()
+ then kind.isBoth()
+ else kind.isInternal()
)
}
@@ -165,6 +165,20 @@ abstract class ItemNode extends Locatable {
/** Gets the visibility of this item, if any. */
abstract Visibility getVisibility();
+ /**
+ * Holds if this item is public.
+ *
+ * This is the case when this item either has `pub` visibility (but is not
+ * a `use`; a `use` itself is not visible from the outside), or when this
+ * item is a variant.
+ */
+ predicate isPublic() {
+ exists(this.getVisibility()) and
+ not this instanceof Use
+ or
+ this instanceof Variant
+ }
+
/** Gets the `i`th type parameter of this item, if any. */
abstract TypeParam getTypeParam(int i);
@@ -380,9 +394,7 @@ abstract private class ModuleLikeNode extends ItemNode {
private class SourceFileItemNode extends ModuleLikeNode, SourceFile {
pragma[nomagic]
- ModuleLikeNode getSuper() {
- result = any(ModuleItemNode mod | fileImport(mod, this)).getASuccessor("super")
- }
+ ModuleLikeNode getSuper() { fileImport(result.getAnItemInScope(), this) }
override string getName() { result = "(source file)" }
@@ -1300,7 +1312,8 @@ private predicate useTreeDeclares(UseTree tree, string name) {
*/
pragma[nomagic]
private predicate declaresDirectly(ItemNode item, Namespace ns, string name) {
- exists(ItemNode child, SuccessorKind kind | child = getAChildSuccessor(item, name, kind) |
+ exists(ItemNode child, SuccessorKind kind |
+ child = getAChildSuccessor(item, name, kind) and
child.getNamespace() = ns and
kind.isInternalOrBoth()
)
@@ -1491,6 +1504,13 @@ private ItemNode resolvePathCandQualifier(RelevantPath qualifier, RelevantPath p
name = path.getText()
}
+pragma[nomagic]
+private Crate getCrate0(Locatable l) { result.getASourceFile().getFile() = l.getFile() }
+
+bindingset[l]
+pragma[inline_late]
+private Crate getCrate(Locatable l) { result = getCrate0(l) }
+
/**
* Gets the item that `path` resolves to in `ns` when `qualifier` is the
* qualifier of `path` and `qualifier` resolves to `q`, if any.
@@ -1501,8 +1521,17 @@ private ItemNode resolvePathCandQualified(
) {
exists(string name, SuccessorKind kind |
q = resolvePathCandQualifier(qualifier, path, name) and
- result = getASuccessor(q, name, ns, kind) and
+ result = getASuccessor(q, name, ns, kind)
+ |
kind.isExternalOrBoth()
+ or
+ // Non-public items are visible to paths in descendant modules of the declaring
+ // module; the declaration may happen via a `use` statement, where the item
+ // being used is _not_ itself in an ancestor module, and we currently don't track
+ // that information in `getASuccessor`. So, for simplicity, we allow for non-public
+ // items when the path and the item are in the same crate.
+ getCrate(path) = getCrate(result) and
+ not result instanceof TypeParam
)
}
@@ -1646,10 +1675,12 @@ private ItemNode resolveUseTreeListItemQualifier(
pragma[nomagic]
private ItemNode resolveUseTreeListItem(Use use, UseTree tree) {
- tree = use.getUseTree() and
- result = resolvePathCand(tree.getPath())
- or
- result = resolveUseTreeListItem(use, tree, tree.getPath(), _)
+ exists(Path path | path = tree.getPath() |
+ tree = use.getUseTree() and
+ result = resolvePathCand(path)
+ or
+ result = resolveUseTreeListItem(use, tree, path, _)
+ )
}
/** Holds if `use` imports `item` as `name`. */
@@ -1673,7 +1704,10 @@ private predicate useImportEdge(Use use, string name, ItemNode item, SuccessorKi
item = used and
(
not tree.hasRename() and
- name = item.getName()
+ exists(string pathName |
+ pathName = tree.getPath().getText() and
+ if pathName = "self" then name = item.getName() else name = pathName
+ )
or
exists(Rename rename | rename = tree.getRename() |
name = rename.getName().getText()
diff --git a/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected
index 5ba71c14933..0fb7a59f6f4 100644
--- a/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected
+++ b/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected
@@ -11,6 +11,8 @@ multipleCallTargets
| test.rs:179:30:179:68 | ...::_print(...) |
| test.rs:188:26:188:105 | ...::_print(...) |
| test.rs:229:22:229:72 | ... .read_to_string(...) |
+| test.rs:664:22:664:43 | file.read(...) |
+| test.rs:673:22:673:41 | f1.read(...) |
| test.rs:697:18:697:38 | ...::_print(...) |
| test.rs:702:18:702:45 | ...::_print(...) |
| test.rs:720:38:720:42 | ...::_print(...) |
diff --git a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected
index 88a728253d8..db0cb969d5a 100644
--- a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected
+++ b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected
@@ -1,138 +1,140 @@
models
-| 1 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote |
-| 2 | Source: ::send_request; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote |
-| 3 | Source: ::file_name; ReturnValue; file |
-| 4 | Source: ::path; ReturnValue; file |
-| 5 | Source: ::open; ReturnValue.Field[core::result::Result::Ok(0)]; file |
-| 6 | Source: ::open; ReturnValue.Field[core::result::Result::Ok(0)]; file |
-| 7 | Source: ::connect; ReturnValue.Field[core::result::Result::Ok(0)]; remote |
-| 8 | Source: ::connect_timeout; ReturnValue.Field[core::result::Result::Ok(0)]; remote |
-| 9 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file |
-| 10 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file |
-| 11 | Source: ::file_name; ReturnValue; file |
-| 12 | Source: ::path; ReturnValue; file |
-| 13 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote |
-| 14 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote |
-| 15 | Source: reqwest::get; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote |
-| 16 | Source: std::env::args; ReturnValue.Element; commandargs |
-| 17 | Source: std::env::args_os; ReturnValue.Element; commandargs |
-| 18 | Source: std::env::current_dir; ReturnValue.Field[core::result::Result::Ok(0)]; commandargs |
-| 19 | Source: std::env::current_exe; ReturnValue.Field[core::result::Result::Ok(0)]; commandargs |
-| 20 | Source: std::env::home_dir; ReturnValue.Field[core::option::Option::Some(0)]; commandargs |
-| 21 | Source: std::env::var; ReturnValue.Field[core::result::Result::Ok(0)]; environment |
-| 22 | Source: std::env::var_os; ReturnValue.Field[core::option::Option::Some(0)]; environment |
-| 23 | Source: std::fs::read; ReturnValue.Field[core::result::Result::Ok(0)]; file |
-| 24 | Source: std::fs::read; ReturnValue; file |
-| 25 | Source: std::fs::read_link; ReturnValue.Field[core::result::Result::Ok(0)]; file |
-| 26 | Source: std::fs::read_to_string; ReturnValue.Field[core::result::Result::Ok(0)]; file |
-| 27 | Source: std::fs::read_to_string; ReturnValue; file |
-| 28 | Source: std::io::stdio::stdin; ReturnValue; stdin |
-| 29 | Source: tokio::fs::read::read; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file |
-| 30 | Source: tokio::fs::read_link::read_link; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file |
-| 31 | Source: tokio::fs::read_to_string::read_to_string; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file |
-| 32 | Source: tokio::io::stdin::stdin; ReturnValue; stdin |
-| 33 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value |
-| 34 | Summary: <_ as core::iter::traits::iterator::Iterator>::collect; Argument[self].Element; ReturnValue.Element; value |
-| 35 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value |
-| 36 | Summary: <_ as futures_io::if_std::AsyncBufRead>::poll_fill_buf; Argument[self].Reference; ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]; taint |
-| 37 | Summary: <_ as futures_util::io::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 38 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self].Reference; Argument[0].Reference; taint |
-| 39 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint |
-| 40 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self].Reference; Argument[1].Reference; taint |
-| 41 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint |
-| 42 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint |
-| 43 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint |
-| 44 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint |
-| 45 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint |
-| 46 | Summary: <_ as std::io::BufRead>::lines; Argument[self]; ReturnValue; taint |
-| 47 | Summary: <_ as std::io::BufRead>::read_line; Argument[self]; Argument[0].Reference; taint |
-| 48 | Summary: <_ as std::io::BufRead>::read_until; Argument[self]; Argument[1].Reference; taint |
-| 49 | Summary: <_ as std::io::BufRead>::split; Argument[self]; ReturnValue; taint |
-| 50 | Summary: <_ as std::io::Read>::bytes; Argument[self]; ReturnValue; taint |
-| 51 | Summary: <_ as std::io::Read>::chain; Argument[0]; ReturnValue; taint |
-| 52 | Summary: <_ as std::io::Read>::chain; Argument[self]; ReturnValue; taint |
-| 53 | Summary: <_ as std::io::Read>::read; Argument[self]; Argument[0].Reference; taint |
-| 54 | Summary: <_ as std::io::Read>::read_exact; Argument[self]; Argument[0].Reference; taint |
-| 55 | Summary: <_ as std::io::Read>::read_to_end; Argument[self]; Argument[0].Reference; taint |
-| 56 | Summary: <_ as std::io::Read>::read_to_string; Argument[self]; Argument[0].Reference; taint |
-| 57 | Summary: <_ as std::io::Read>::take; Argument[self]; ReturnValue; taint |
-| 58 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 59 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::lines; Argument[self]; ReturnValue; taint |
-| 60 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint |
-| 61 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint |
-| 62 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::split; Argument[self]; ReturnValue; taint |
-| 63 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint |
-| 64 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf; Argument[self]; Argument[0].Reference; taint |
-| 65 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact; Argument[self]; Argument[0].Reference; taint |
-| 66 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 67 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 68 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 69 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint |
-| 70 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self]; Argument[0].Reference; taint |
-| 71 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 72 | Summary: ::as_bytes; Argument[self]; ReturnValue; value |
-| 73 | Summary: ::as_str; Argument[self]; ReturnValue; value |
-| 74 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
-| 75 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
-| 76 | Summary: ::new; Argument[0].Reference; ReturnValue; value |
-| 77 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::__pointer]; value |
-| 78 | Summary: ::new; Argument[0]; ReturnValue; value |
-| 79 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
-| 80 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
-| 81 | Summary: ::as_bytes; Argument[self]; ReturnValue; value |
-| 82 | Summary: ::as_str; Argument[self]; ReturnValue; value |
-| 83 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
-| 84 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 85 | Summary: ::new; Argument[0]; ReturnValue; taint |
-| 86 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 87 | Summary: ::chunk; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint |
-| 88 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 89 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
-| 90 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
-| 91 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
-| 92 | Summary: ::read; Argument[self]; Argument[0].Reference; taint |
-| 93 | Summary: ::read; Argument[self]; Argument[0]; taint |
-| 94 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint |
-| 95 | Summary: ::read_to_end; Argument[self]; Argument[0]; taint |
-| 96 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint |
-| 97 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint |
-| 98 | Summary: ::next; Argument[self]; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; taint |
-| 99 | Summary: ::fill_buf; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
-| 100 | Summary: ::buffer; Argument[self]; ReturnValue; taint |
-| 101 | Summary: ::new; Argument[0]; ReturnValue; taint |
-| 102 | Summary: ::read; Argument[self]; Argument[0].Reference; taint |
-| 103 | Summary: ::read; Argument[self]; Argument[0]; taint |
-| 104 | Summary: ::read_exact; Argument[self]; Argument[0].Reference; taint |
-| 105 | Summary: ::read_exact; Argument[self]; Argument[0]; taint |
-| 106 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint |
-| 107 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint |
-| 108 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint |
-| 109 | Summary: ::lock; Argument[self]; ReturnValue; taint |
-| 110 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint |
-| 111 | Summary: ::read; Argument[self]; Argument[0].Reference; taint |
-| 112 | Summary: ::as_path; Argument[self]; ReturnValue; value |
-| 113 | Summary: ::buffer; Argument[self]; ReturnValue; taint |
-| 114 | Summary: ::new; Argument[0]; ReturnValue; taint |
-| 115 | Summary: ::next_line; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint |
-| 116 | Summary: ::next_segment; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint |
-| 117 | Summary: ::peek; Argument[self]; Argument[0].Reference; taint |
-| 118 | Summary: ::try_read; Argument[self]; Argument[0].Reference; taint |
-| 119 | Summary: ::try_read_buf; Argument[self]; Argument[0].Reference; taint |
+| 1 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file |
+| 2 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file |
+| 3 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote |
+| 4 | Source: ::send_request; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote |
+| 5 | Source: ::file_name; ReturnValue; file |
+| 6 | Source: ::path; ReturnValue; file |
+| 7 | Source: ::open; ReturnValue.Field[core::result::Result::Ok(0)]; file |
+| 8 | Source: ::open; ReturnValue.Field[core::result::Result::Ok(0)]; file |
+| 9 | Source: ::connect; ReturnValue.Field[core::result::Result::Ok(0)]; remote |
+| 10 | Source: ::connect_timeout; ReturnValue.Field[core::result::Result::Ok(0)]; remote |
+| 11 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file |
+| 12 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file |
+| 13 | Source: ::file_name; ReturnValue; file |
+| 14 | Source: ::path; ReturnValue; file |
+| 15 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote |
+| 16 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote |
+| 17 | Source: reqwest::get; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote |
+| 18 | Source: std::env::args; ReturnValue.Element; commandargs |
+| 19 | Source: std::env::args_os; ReturnValue.Element; commandargs |
+| 20 | Source: std::env::current_dir; ReturnValue.Field[core::result::Result::Ok(0)]; commandargs |
+| 21 | Source: std::env::current_exe; ReturnValue.Field[core::result::Result::Ok(0)]; commandargs |
+| 22 | Source: std::env::home_dir; ReturnValue.Field[core::option::Option::Some(0)]; commandargs |
+| 23 | Source: std::env::var; ReturnValue.Field[core::result::Result::Ok(0)]; environment |
+| 24 | Source: std::env::var_os; ReturnValue.Field[core::option::Option::Some(0)]; environment |
+| 25 | Source: std::fs::read; ReturnValue.Field[core::result::Result::Ok(0)]; file |
+| 26 | Source: std::fs::read; ReturnValue; file |
+| 27 | Source: std::fs::read_link; ReturnValue.Field[core::result::Result::Ok(0)]; file |
+| 28 | Source: std::fs::read_to_string; ReturnValue.Field[core::result::Result::Ok(0)]; file |
+| 29 | Source: std::fs::read_to_string; ReturnValue; file |
+| 30 | Source: std::io::stdio::stdin; ReturnValue; stdin |
+| 31 | Source: tokio::fs::read::read; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file |
+| 32 | Source: tokio::fs::read_link::read_link; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file |
+| 33 | Source: tokio::fs::read_to_string::read_to_string; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file |
+| 34 | Source: tokio::io::stdin::stdin; ReturnValue; stdin |
+| 35 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value |
+| 36 | Summary: <_ as core::iter::traits::iterator::Iterator>::collect; Argument[self].Element; ReturnValue.Element; value |
+| 37 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value |
+| 38 | Summary: <_ as futures_io::if_std::AsyncBufRead>::poll_fill_buf; Argument[self].Reference; ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]; taint |
+| 39 | Summary: <_ as futures_util::io::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 40 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self].Reference; Argument[0].Reference; taint |
+| 41 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint |
+| 42 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self].Reference; Argument[1].Reference; taint |
+| 43 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint |
+| 44 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint |
+| 45 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint |
+| 46 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint |
+| 47 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint |
+| 48 | Summary: <_ as std::io::BufRead>::lines; Argument[self]; ReturnValue; taint |
+| 49 | Summary: <_ as std::io::BufRead>::read_line; Argument[self]; Argument[0].Reference; taint |
+| 50 | Summary: <_ as std::io::BufRead>::read_until; Argument[self]; Argument[1].Reference; taint |
+| 51 | Summary: <_ as std::io::BufRead>::split; Argument[self]; ReturnValue; taint |
+| 52 | Summary: <_ as std::io::Read>::bytes; Argument[self]; ReturnValue; taint |
+| 53 | Summary: <_ as std::io::Read>::chain; Argument[0]; ReturnValue; taint |
+| 54 | Summary: <_ as std::io::Read>::chain; Argument[self]; ReturnValue; taint |
+| 55 | Summary: <_ as std::io::Read>::read; Argument[self]; Argument[0].Reference; taint |
+| 56 | Summary: <_ as std::io::Read>::read_exact; Argument[self]; Argument[0].Reference; taint |
+| 57 | Summary: <_ as std::io::Read>::read_to_end; Argument[self]; Argument[0].Reference; taint |
+| 58 | Summary: <_ as std::io::Read>::read_to_string; Argument[self]; Argument[0].Reference; taint |
+| 59 | Summary: <_ as std::io::Read>::take; Argument[self]; ReturnValue; taint |
+| 60 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 61 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::lines; Argument[self]; ReturnValue; taint |
+| 62 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint |
+| 63 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint |
+| 64 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::split; Argument[self]; ReturnValue; taint |
+| 65 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint |
+| 66 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf; Argument[self]; Argument[0].Reference; taint |
+| 67 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact; Argument[self]; Argument[0].Reference; taint |
+| 68 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 69 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 70 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 71 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint |
+| 72 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self]; Argument[0].Reference; taint |
+| 73 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 74 | Summary: ::as_bytes; Argument[self]; ReturnValue; value |
+| 75 | Summary: ::as_str; Argument[self]; ReturnValue; value |
+| 76 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
+| 77 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
+| 78 | Summary: ::new; Argument[0].Reference; ReturnValue; value |
+| 79 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::__pointer]; value |
+| 80 | Summary: ::new; Argument[0]; ReturnValue; value |
+| 81 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
+| 82 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
+| 83 | Summary: ::as_bytes; Argument[self]; ReturnValue; value |
+| 84 | Summary: ::as_str; Argument[self]; ReturnValue; value |
+| 85 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
+| 86 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 87 | Summary: ::new; Argument[0]; ReturnValue; taint |
+| 88 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 89 | Summary: ::chunk; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint |
+| 90 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 91 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
+| 92 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
+| 93 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
+| 94 | Summary: ::read; Argument[self]; Argument[0].Reference; taint |
+| 95 | Summary: ::read; Argument[self]; Argument[0]; taint |
+| 96 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint |
+| 97 | Summary: ::read_to_end; Argument[self]; Argument[0]; taint |
+| 98 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint |
+| 99 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint |
+| 100 | Summary: ::next; Argument[self]; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; taint |
+| 101 | Summary: ::fill_buf; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
+| 102 | Summary: ::buffer; Argument[self]; ReturnValue; taint |
+| 103 | Summary: ::new; Argument[0]; ReturnValue; taint |
+| 104 | Summary: ::read; Argument[self]; Argument[0].Reference; taint |
+| 105 | Summary: ::read; Argument[self]; Argument[0]; taint |
+| 106 | Summary: ::read_exact; Argument[self]; Argument[0].Reference; taint |
+| 107 | Summary: ::read_exact; Argument[self]; Argument[0]; taint |
+| 108 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint |
+| 109 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint |
+| 110 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint |
+| 111 | Summary: ::lock; Argument[self]; ReturnValue; taint |
+| 112 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint |
+| 113 | Summary: ::read; Argument[self]; Argument[0].Reference; taint |
+| 114 | Summary: ::as_path; Argument[self]; ReturnValue; value |
+| 115 | Summary: ::buffer; Argument[self]; ReturnValue; taint |
+| 116 | Summary: ::new; Argument[0]; ReturnValue; taint |
+| 117 | Summary: ::next_line; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint |
+| 118 | Summary: ::next_segment; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint |
+| 119 | Summary: ::peek; Argument[self]; Argument[0].Reference; taint |
+| 120 | Summary: ::try_read; Argument[self]; Argument[0].Reference; taint |
+| 121 | Summary: ::try_read_buf; Argument[self]; Argument[0].Reference; taint |
edges
-| test.rs:8:10:8:22 | ...::var | test.rs:8:10:8:30 | ...::var(...) | provenance | Src:MaD:21 |
-| test.rs:9:10:9:25 | ...::var_os | test.rs:9:10:9:33 | ...::var_os(...) | provenance | Src:MaD:22 |
+| test.rs:8:10:8:22 | ...::var | test.rs:8:10:8:30 | ...::var(...) | provenance | Src:MaD:23 |
+| test.rs:9:10:9:25 | ...::var_os | test.rs:9:10:9:33 | ...::var_os(...) | provenance | Src:MaD:24 |
| test.rs:11:9:11:12 | var1 | test.rs:14:10:14:13 | var1 | provenance | |
-| test.rs:11:16:11:28 | ...::var | test.rs:11:16:11:36 | ...::var(...) [Ok] | provenance | Src:MaD:21 |
-| test.rs:11:16:11:36 | ...::var(...) [Ok] | test.rs:11:16:11:59 | ... .expect(...) | provenance | MaD:79 |
+| test.rs:11:16:11:28 | ...::var | test.rs:11:16:11:36 | ...::var(...) [Ok] | provenance | Src:MaD:23 |
+| test.rs:11:16:11:36 | ...::var(...) [Ok] | test.rs:11:16:11:59 | ... .expect(...) | provenance | MaD:81 |
| test.rs:11:16:11:59 | ... .expect(...) | test.rs:11:9:11:12 | var1 | provenance | |
| test.rs:12:9:12:12 | var2 | test.rs:15:10:15:13 | var2 | provenance | |
-| test.rs:12:16:12:31 | ...::var_os | test.rs:12:16:12:39 | ...::var_os(...) [Some] | provenance | Src:MaD:22 |
-| test.rs:12:16:12:39 | ...::var_os(...) [Some] | test.rs:12:16:12:48 | ... .unwrap() | provenance | MaD:75 |
+| test.rs:12:16:12:31 | ...::var_os | test.rs:12:16:12:39 | ...::var_os(...) [Some] | provenance | Src:MaD:24 |
+| test.rs:12:16:12:39 | ...::var_os(...) [Some] | test.rs:12:16:12:48 | ... .unwrap() | provenance | MaD:77 |
| test.rs:12:16:12:48 | ... .unwrap() | test.rs:12:9:12:12 | var2 | provenance | |
| test.rs:29:9:29:12 | args [element] | test.rs:30:20:30:23 | args [element] | provenance | |
| test.rs:29:9:29:12 | args [element] | test.rs:31:17:31:20 | args [element] | provenance | |
-| test.rs:29:29:29:42 | ...::args | test.rs:29:29:29:44 | ...::args(...) [element] | provenance | Src:MaD:16 |
-| test.rs:29:29:29:44 | ...::args(...) [element] | test.rs:29:29:29:54 | ... .collect() [element] | provenance | MaD:34 |
+| test.rs:29:29:29:42 | ...::args | test.rs:29:29:29:44 | ...::args(...) [element] | provenance | Src:MaD:18 |
+| test.rs:29:29:29:44 | ...::args(...) [element] | test.rs:29:29:29:54 | ... .collect() [element] | provenance | MaD:36 |
| test.rs:29:29:29:54 | ... .collect() [element] | test.rs:29:9:29:12 | args [element] | provenance | |
| test.rs:30:9:30:15 | my_path [&ref] | test.rs:36:10:36:16 | my_path | provenance | |
| test.rs:30:19:30:26 | &... [&ref] | test.rs:30:9:30:15 | my_path [&ref] | provenance | |
@@ -143,89 +145,89 @@ edges
| test.rs:31:17:31:20 | args [element] | test.rs:31:17:31:23 | args[1] | provenance | |
| test.rs:31:17:31:23 | args[1] | test.rs:31:16:31:23 | &... [&ref] | provenance | |
| test.rs:32:9:32:12 | arg2 | test.rs:38:10:38:13 | arg2 | provenance | |
-| test.rs:32:16:32:29 | ...::args | test.rs:32:16:32:31 | ...::args(...) [element] | provenance | Src:MaD:16 |
-| test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:35 |
-| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:75 |
+| test.rs:32:16:32:29 | ...::args | test.rs:32:16:32:31 | ...::args(...) [element] | provenance | Src:MaD:18 |
+| test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:37 |
+| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:77 |
| test.rs:32:16:32:47 | ... .unwrap() | test.rs:32:9:32:12 | arg2 | provenance | |
| test.rs:33:9:33:12 | arg3 | test.rs:39:10:39:13 | arg3 | provenance | |
-| test.rs:33:16:33:32 | ...::args_os | test.rs:33:16:33:34 | ...::args_os(...) [element] | provenance | Src:MaD:17 |
-| test.rs:33:16:33:34 | ...::args_os(...) [element] | test.rs:33:16:33:41 | ... .nth(...) [Some] | provenance | MaD:35 |
-| test.rs:33:16:33:41 | ... .nth(...) [Some] | test.rs:33:16:33:50 | ... .unwrap() | provenance | MaD:75 |
+| test.rs:33:16:33:32 | ...::args_os | test.rs:33:16:33:34 | ...::args_os(...) [element] | provenance | Src:MaD:19 |
+| test.rs:33:16:33:34 | ...::args_os(...) [element] | test.rs:33:16:33:41 | ... .nth(...) [Some] | provenance | MaD:37 |
+| test.rs:33:16:33:41 | ... .nth(...) [Some] | test.rs:33:16:33:50 | ... .unwrap() | provenance | MaD:77 |
| test.rs:33:16:33:50 | ... .unwrap() | test.rs:33:9:33:12 | arg3 | provenance | |
| test.rs:34:9:34:12 | arg4 | test.rs:40:10:40:13 | arg4 | provenance | |
-| test.rs:34:16:34:29 | ...::args | test.rs:34:16:34:31 | ...::args(...) [element] | provenance | Src:MaD:16 |
-| test.rs:34:16:34:31 | ...::args(...) [element] | test.rs:34:16:34:38 | ... .nth(...) [Some] | provenance | MaD:35 |
-| test.rs:34:16:34:38 | ... .nth(...) [Some] | test.rs:34:16:34:47 | ... .unwrap() | provenance | MaD:75 |
-| test.rs:34:16:34:47 | ... .unwrap() | test.rs:34:16:34:64 | ... .parse() [Ok] | provenance | MaD:83 |
-| test.rs:34:16:34:64 | ... .parse() [Ok] | test.rs:34:16:34:73 | ... .unwrap() | provenance | MaD:80 |
+| test.rs:34:16:34:29 | ...::args | test.rs:34:16:34:31 | ...::args(...) [element] | provenance | Src:MaD:18 |
+| test.rs:34:16:34:31 | ...::args(...) [element] | test.rs:34:16:34:38 | ... .nth(...) [Some] | provenance | MaD:37 |
+| test.rs:34:16:34:38 | ... .nth(...) [Some] | test.rs:34:16:34:47 | ... .unwrap() | provenance | MaD:77 |
+| test.rs:34:16:34:47 | ... .unwrap() | test.rs:34:16:34:64 | ... .parse() [Ok] | provenance | MaD:85 |
+| test.rs:34:16:34:64 | ... .parse() [Ok] | test.rs:34:16:34:73 | ... .unwrap() | provenance | MaD:82 |
| test.rs:34:16:34:73 | ... .unwrap() | test.rs:34:9:34:12 | arg4 | provenance | |
| test.rs:42:9:42:11 | arg | test.rs:43:14:43:16 | arg | provenance | |
-| test.rs:42:16:42:29 | ...::args | test.rs:42:16:42:31 | ...::args(...) [element] | provenance | Src:MaD:16 |
+| test.rs:42:16:42:29 | ...::args | test.rs:42:16:42:31 | ...::args(...) [element] | provenance | Src:MaD:18 |
| test.rs:42:16:42:31 | ...::args(...) [element] | test.rs:42:9:42:11 | arg | provenance | |
| test.rs:46:9:46:11 | arg | test.rs:47:14:47:16 | arg | provenance | |
-| test.rs:46:16:46:32 | ...::args_os | test.rs:46:16:46:34 | ...::args_os(...) [element] | provenance | Src:MaD:17 |
+| test.rs:46:16:46:32 | ...::args_os | test.rs:46:16:46:34 | ...::args_os(...) [element] | provenance | Src:MaD:19 |
| test.rs:46:16:46:34 | ...::args_os(...) [element] | test.rs:46:9:46:11 | arg | provenance | |
| test.rs:52:9:52:11 | dir | test.rs:56:10:56:12 | dir | provenance | |
-| test.rs:52:15:52:35 | ...::current_dir | test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | provenance | Src:MaD:18 |
-| test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | test.rs:52:15:52:54 | ... .expect(...) | provenance | MaD:79 |
+| test.rs:52:15:52:35 | ...::current_dir | test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | provenance | Src:MaD:20 |
+| test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | test.rs:52:15:52:54 | ... .expect(...) | provenance | MaD:81 |
| test.rs:52:15:52:54 | ... .expect(...) | test.rs:52:9:52:11 | dir | provenance | |
| test.rs:53:9:53:11 | exe | test.rs:57:10:57:12 | exe | provenance | |
-| test.rs:53:15:53:35 | ...::current_exe | test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | provenance | Src:MaD:19 |
-| test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | test.rs:53:15:53:54 | ... .expect(...) | provenance | MaD:79 |
+| test.rs:53:15:53:35 | ...::current_exe | test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | provenance | Src:MaD:21 |
+| test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | test.rs:53:15:53:54 | ... .expect(...) | provenance | MaD:81 |
| test.rs:53:15:53:54 | ... .expect(...) | test.rs:53:9:53:11 | exe | provenance | |
| test.rs:54:9:54:12 | home | test.rs:58:10:58:13 | home | provenance | |
-| test.rs:54:16:54:33 | ...::home_dir | test.rs:54:16:54:35 | ...::home_dir(...) [Some] | provenance | Src:MaD:20 |
-| test.rs:54:16:54:35 | ...::home_dir(...) [Some] | test.rs:54:16:54:52 | ... .expect(...) | provenance | MaD:74 |
+| test.rs:54:16:54:33 | ...::home_dir | test.rs:54:16:54:35 | ...::home_dir(...) [Some] | provenance | Src:MaD:22 |
+| test.rs:54:16:54:35 | ...::home_dir(...) [Some] | test.rs:54:16:54:52 | ... .expect(...) | provenance | MaD:76 |
| test.rs:54:16:54:52 | ... .expect(...) | test.rs:54:9:54:12 | home | provenance | |
| test.rs:62:9:62:22 | remote_string1 | test.rs:63:10:63:23 | remote_string1 | provenance | |
-| test.rs:62:26:62:47 | ...::get | test.rs:62:26:62:62 | ...::get(...) [Ok] | provenance | Src:MaD:14 |
+| test.rs:62:26:62:47 | ...::get | test.rs:62:26:62:62 | ...::get(...) [Ok] | provenance | Src:MaD:16 |
| test.rs:62:26:62:62 | ...::get(...) [Ok] | test.rs:62:26:62:63 | TryExpr | provenance | |
-| test.rs:62:26:62:63 | TryExpr | test.rs:62:26:62:70 | ... .text() [Ok] | provenance | MaD:90 |
+| test.rs:62:26:62:63 | TryExpr | test.rs:62:26:62:70 | ... .text() [Ok] | provenance | MaD:92 |
| test.rs:62:26:62:70 | ... .text() [Ok] | test.rs:62:26:62:71 | TryExpr | provenance | |
| test.rs:62:26:62:71 | TryExpr | test.rs:62:9:62:22 | remote_string1 | provenance | |
| test.rs:65:9:65:22 | remote_string2 | test.rs:66:10:66:23 | remote_string2 | provenance | |
-| test.rs:65:26:65:47 | ...::get | test.rs:65:26:65:62 | ...::get(...) [Ok] | provenance | Src:MaD:14 |
-| test.rs:65:26:65:62 | ...::get(...) [Ok] | test.rs:65:26:65:71 | ... .unwrap() | provenance | MaD:80 |
-| test.rs:65:26:65:71 | ... .unwrap() | test.rs:65:26:65:78 | ... .text() [Ok] | provenance | MaD:90 |
-| test.rs:65:26:65:78 | ... .text() [Ok] | test.rs:65:26:65:87 | ... .unwrap() | provenance | MaD:80 |
+| test.rs:65:26:65:47 | ...::get | test.rs:65:26:65:62 | ...::get(...) [Ok] | provenance | Src:MaD:16 |
+| test.rs:65:26:65:62 | ...::get(...) [Ok] | test.rs:65:26:65:71 | ... .unwrap() | provenance | MaD:82 |
+| test.rs:65:26:65:71 | ... .unwrap() | test.rs:65:26:65:78 | ... .text() [Ok] | provenance | MaD:92 |
+| test.rs:65:26:65:78 | ... .text() [Ok] | test.rs:65:26:65:87 | ... .unwrap() | provenance | MaD:82 |
| test.rs:65:26:65:87 | ... .unwrap() | test.rs:65:9:65:22 | remote_string2 | provenance | |
| test.rs:68:9:68:22 | remote_string3 | test.rs:69:10:69:23 | remote_string3 | provenance | |
-| test.rs:68:26:68:47 | ...::get | test.rs:68:26:68:62 | ...::get(...) [Ok] | provenance | Src:MaD:14 |
-| test.rs:68:26:68:62 | ...::get(...) [Ok] | test.rs:68:26:68:71 | ... .unwrap() | provenance | MaD:80 |
-| test.rs:68:26:68:71 | ... .unwrap() | test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:91 |
-| test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | test.rs:68:26:68:107 | ... .unwrap() | provenance | MaD:80 |
+| test.rs:68:26:68:47 | ...::get | test.rs:68:26:68:62 | ...::get(...) [Ok] | provenance | Src:MaD:16 |
+| test.rs:68:26:68:62 | ...::get(...) [Ok] | test.rs:68:26:68:71 | ... .unwrap() | provenance | MaD:82 |
+| test.rs:68:26:68:71 | ... .unwrap() | test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:93 |
+| test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | test.rs:68:26:68:107 | ... .unwrap() | provenance | MaD:82 |
| test.rs:68:26:68:107 | ... .unwrap() | test.rs:68:9:68:22 | remote_string3 | provenance | |
| test.rs:71:9:71:22 | remote_string4 | test.rs:72:10:72:23 | remote_string4 | provenance | |
-| test.rs:71:26:71:47 | ...::get | test.rs:71:26:71:62 | ...::get(...) [Ok] | provenance | Src:MaD:14 |
-| test.rs:71:26:71:62 | ...::get(...) [Ok] | test.rs:71:26:71:71 | ... .unwrap() | provenance | MaD:80 |
-| test.rs:71:26:71:71 | ... .unwrap() | test.rs:71:26:71:79 | ... .bytes() [Ok] | provenance | MaD:89 |
-| test.rs:71:26:71:79 | ... .bytes() [Ok] | test.rs:71:26:71:88 | ... .unwrap() | provenance | MaD:80 |
+| test.rs:71:26:71:47 | ...::get | test.rs:71:26:71:62 | ...::get(...) [Ok] | provenance | Src:MaD:16 |
+| test.rs:71:26:71:62 | ...::get(...) [Ok] | test.rs:71:26:71:71 | ... .unwrap() | provenance | MaD:82 |
+| test.rs:71:26:71:71 | ... .unwrap() | test.rs:71:26:71:79 | ... .bytes() [Ok] | provenance | MaD:91 |
+| test.rs:71:26:71:79 | ... .bytes() [Ok] | test.rs:71:26:71:88 | ... .unwrap() | provenance | MaD:82 |
| test.rs:71:26:71:88 | ... .unwrap() | test.rs:71:9:71:22 | remote_string4 | provenance | |
| test.rs:74:9:74:22 | remote_string5 | test.rs:75:10:75:23 | remote_string5 | provenance | |
-| test.rs:74:26:74:37 | ...::get | test.rs:74:26:74:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:15 |
+| test.rs:74:26:74:37 | ...::get | test.rs:74:26:74:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:17 |
| test.rs:74:26:74:52 | ...::get(...) [future, Ok] | test.rs:74:26:74:58 | await ... [Ok] | provenance | |
| test.rs:74:26:74:58 | await ... [Ok] | test.rs:74:26:74:59 | TryExpr | provenance | |
-| test.rs:74:26:74:59 | TryExpr | test.rs:74:26:74:66 | ... .text() [future, Ok] | provenance | MaD:88 |
+| test.rs:74:26:74:59 | TryExpr | test.rs:74:26:74:66 | ... .text() [future, Ok] | provenance | MaD:90 |
| test.rs:74:26:74:66 | ... .text() [future, Ok] | test.rs:74:26:74:72 | await ... [Ok] | provenance | |
| test.rs:74:26:74:72 | await ... [Ok] | test.rs:74:26:74:73 | TryExpr | provenance | |
| test.rs:74:26:74:73 | TryExpr | test.rs:74:9:74:22 | remote_string5 | provenance | |
| test.rs:77:9:77:22 | remote_string6 | test.rs:78:10:78:23 | remote_string6 | provenance | |
-| test.rs:77:26:77:37 | ...::get | test.rs:77:26:77:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:15 |
+| test.rs:77:26:77:37 | ...::get | test.rs:77:26:77:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:17 |
| test.rs:77:26:77:52 | ...::get(...) [future, Ok] | test.rs:77:26:77:58 | await ... [Ok] | provenance | |
| test.rs:77:26:77:58 | await ... [Ok] | test.rs:77:26:77:59 | TryExpr | provenance | |
-| test.rs:77:26:77:59 | TryExpr | test.rs:77:26:77:67 | ... .bytes() [future, Ok] | provenance | MaD:86 |
+| test.rs:77:26:77:59 | TryExpr | test.rs:77:26:77:67 | ... .bytes() [future, Ok] | provenance | MaD:88 |
| test.rs:77:26:77:67 | ... .bytes() [future, Ok] | test.rs:77:26:77:73 | await ... [Ok] | provenance | |
| test.rs:77:26:77:73 | await ... [Ok] | test.rs:77:26:77:74 | TryExpr | provenance | |
| test.rs:77:26:77:74 | TryExpr | test.rs:77:9:77:22 | remote_string6 | provenance | |
-| test.rs:80:9:80:20 | mut request1 | test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:87 |
-| test.rs:80:9:80:20 | mut request1 | test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:87 |
-| test.rs:80:24:80:35 | ...::get | test.rs:80:24:80:50 | ...::get(...) [future, Ok] | provenance | Src:MaD:15 |
+| test.rs:80:9:80:20 | mut request1 | test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:89 |
+| test.rs:80:9:80:20 | mut request1 | test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:89 |
+| test.rs:80:24:80:35 | ...::get | test.rs:80:24:80:50 | ...::get(...) [future, Ok] | provenance | Src:MaD:17 |
| test.rs:80:24:80:50 | ...::get(...) [future, Ok] | test.rs:80:24:80:56 | await ... [Ok] | provenance | |
| test.rs:80:24:80:56 | await ... [Ok] | test.rs:80:24:80:57 | TryExpr | provenance | |
| test.rs:80:24:80:57 | TryExpr | test.rs:80:9:80:20 | mut request1 | provenance | |
| test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | test.rs:81:10:81:31 | await ... [Ok, Some] | provenance | |
| test.rs:81:10:81:31 | await ... [Ok, Some] | test.rs:81:10:81:32 | TryExpr [Some] | provenance | |
-| test.rs:81:10:81:32 | TryExpr [Some] | test.rs:81:10:81:41 | ... .unwrap() | provenance | MaD:75 |
+| test.rs:81:10:81:32 | TryExpr [Some] | test.rs:81:10:81:41 | ... .unwrap() | provenance | MaD:77 |
| test.rs:82:15:82:25 | Some(...) [Some] | test.rs:82:20:82:24 | chunk | provenance | |
| test.rs:82:20:82:24 | chunk | test.rs:83:14:83:18 | chunk | provenance | |
| test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | test.rs:82:29:82:50 | await ... [Ok, Some] | provenance | |
@@ -236,129 +238,129 @@ edges
| test.rs:114:24:114:51 | sender.send_request(...) [future, Ok] | test.rs:114:24:114:57 | await ... [Ok] | provenance | |
| test.rs:114:24:114:57 | await ... [Ok] | test.rs:114:24:114:58 | TryExpr | provenance | |
| test.rs:114:24:114:58 | TryExpr | test.rs:114:13:114:20 | response | provenance | |
-| test.rs:114:31:114:42 | send_request | test.rs:114:24:114:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:2 |
+| test.rs:114:31:114:42 | send_request | test.rs:114:24:114:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:4 |
| test.rs:115:15:115:22 | response | test.rs:115:14:115:22 | &response | provenance | |
| test.rs:121:9:121:20 | mut response | test.rs:122:11:122:18 | response | provenance | |
| test.rs:121:24:121:51 | sender.send_request(...) [future, Ok] | test.rs:121:24:121:57 | await ... [Ok] | provenance | |
| test.rs:121:24:121:57 | await ... [Ok] | test.rs:121:24:121:58 | TryExpr | provenance | |
| test.rs:121:24:121:58 | TryExpr | test.rs:121:9:121:20 | mut response | provenance | |
-| test.rs:121:31:121:42 | send_request | test.rs:121:24:121:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:2 |
+| test.rs:121:31:121:42 | send_request | test.rs:121:24:121:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:4 |
| test.rs:122:11:122:18 | response | test.rs:122:10:122:18 | &response | provenance | |
-| test.rs:211:22:211:35 | ...::stdin | test.rs:211:22:211:37 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 |
-| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer | provenance | MaD:103 |
-| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:53 |
-| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:102 |
+| test.rs:211:22:211:35 | ...::stdin | test.rs:211:22:211:37 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 |
+| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer | provenance | MaD:105 |
+| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:55 |
+| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:104 |
| test.rs:211:44:211:54 | [post] &mut buffer | test.rs:212:15:212:20 | buffer | provenance | |
| test.rs:211:44:211:54 | [post] &mut buffer [&ref] | test.rs:211:49:211:54 | [post] buffer | provenance | |
| test.rs:211:49:211:54 | [post] buffer | test.rs:212:15:212:20 | buffer | provenance | |
| test.rs:212:15:212:20 | buffer | test.rs:212:14:212:20 | &buffer | provenance | |
-| test.rs:217:22:217:35 | ...::stdin | test.rs:217:22:217:37 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 |
-| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:55 |
-| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:106 |
+| test.rs:217:22:217:35 | ...::stdin | test.rs:217:22:217:37 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 |
+| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:57 |
+| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:108 |
| test.rs:217:51:217:61 | [post] &mut buffer [&ref] | test.rs:217:56:217:61 | [post] buffer | provenance | |
| test.rs:217:56:217:61 | [post] buffer | test.rs:218:15:218:20 | buffer | provenance | |
| test.rs:218:15:218:20 | buffer | test.rs:218:14:218:20 | &buffer | provenance | |
-| test.rs:223:22:223:35 | ...::stdin | test.rs:223:22:223:37 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 |
-| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer | provenance | MaD:108 |
-| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:56 |
-| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:107 |
+| test.rs:223:22:223:35 | ...::stdin | test.rs:223:22:223:37 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 |
+| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer | provenance | MaD:110 |
+| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:58 |
+| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:109 |
| test.rs:223:54:223:64 | [post] &mut buffer | test.rs:224:15:224:20 | buffer | provenance | |
| test.rs:223:54:223:64 | [post] &mut buffer [&ref] | test.rs:223:59:223:64 | [post] buffer | provenance | |
| test.rs:223:59:223:64 | [post] buffer | test.rs:224:15:224:20 | buffer | provenance | |
| test.rs:224:15:224:20 | buffer | test.rs:224:14:224:20 | &buffer | provenance | |
-| test.rs:229:22:229:35 | ...::stdin | test.rs:229:22:229:37 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 |
-| test.rs:229:22:229:37 | ...::stdin(...) | test.rs:229:22:229:44 | ... .lock() | provenance | MaD:109 |
-| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:56 |
-| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:110 |
+| test.rs:229:22:229:35 | ...::stdin | test.rs:229:22:229:37 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 |
+| test.rs:229:22:229:37 | ...::stdin(...) | test.rs:229:22:229:44 | ... .lock() | provenance | MaD:111 |
+| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:58 |
+| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:112 |
| test.rs:229:61:229:71 | [post] &mut buffer [&ref] | test.rs:229:66:229:71 | [post] buffer | provenance | |
| test.rs:229:66:229:71 | [post] buffer | test.rs:230:15:230:20 | buffer | provenance | |
| test.rs:230:15:230:20 | buffer | test.rs:230:14:230:20 | &buffer | provenance | |
-| test.rs:235:9:235:22 | ...::stdin | test.rs:235:9:235:24 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 |
-| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer | provenance | MaD:105 |
-| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:54 |
-| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:104 |
+| test.rs:235:9:235:22 | ...::stdin | test.rs:235:9:235:24 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 |
+| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer | provenance | MaD:107 |
+| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:56 |
+| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:106 |
| test.rs:235:37:235:47 | [post] &mut buffer | test.rs:236:15:236:20 | buffer | provenance | |
| test.rs:235:37:235:47 | [post] &mut buffer [&ref] | test.rs:235:42:235:47 | [post] buffer | provenance | |
| test.rs:235:42:235:47 | [post] buffer | test.rs:236:15:236:20 | buffer | provenance | |
| test.rs:236:15:236:20 | buffer | test.rs:236:14:236:20 | &buffer | provenance | |
-| test.rs:239:17:239:30 | ...::stdin | test.rs:239:17:239:32 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 |
-| test.rs:239:17:239:32 | ...::stdin(...) | test.rs:239:17:239:40 | ... .bytes() | provenance | MaD:50 |
+| test.rs:239:17:239:30 | ...::stdin | test.rs:239:17:239:32 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 |
+| test.rs:239:17:239:32 | ...::stdin(...) | test.rs:239:17:239:40 | ... .bytes() | provenance | MaD:52 |
| test.rs:239:17:239:40 | ... .bytes() | test.rs:240:14:240:17 | byte | provenance | |
-| test.rs:246:13:246:22 | mut reader | test.rs:247:20:247:36 | reader.fill_buf() [Ok] | provenance | MaD:99 |
+| test.rs:246:13:246:22 | mut reader | test.rs:247:20:247:36 | reader.fill_buf() [Ok] | provenance | MaD:101 |
| test.rs:246:26:246:66 | ...::new(...) | test.rs:246:13:246:22 | mut reader | provenance | |
-| test.rs:246:50:246:63 | ...::stdin | test.rs:246:50:246:65 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 |
-| test.rs:246:50:246:65 | ...::stdin(...) | test.rs:246:26:246:66 | ...::new(...) | provenance | MaD:101 |
+| test.rs:246:50:246:63 | ...::stdin | test.rs:246:50:246:65 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 |
+| test.rs:246:50:246:65 | ...::stdin(...) | test.rs:246:26:246:66 | ...::new(...) | provenance | MaD:103 |
| test.rs:247:13:247:16 | data | test.rs:248:15:248:18 | data | provenance | |
| test.rs:247:20:247:36 | reader.fill_buf() [Ok] | test.rs:247:20:247:37 | TryExpr | provenance | |
| test.rs:247:20:247:37 | TryExpr | test.rs:247:13:247:16 | data | provenance | |
| test.rs:248:15:248:18 | data | test.rs:248:14:248:18 | &data | provenance | |
-| test.rs:252:13:252:18 | reader | test.rs:253:20:253:34 | reader.buffer() | provenance | MaD:100 |
+| test.rs:252:13:252:18 | reader | test.rs:253:20:253:34 | reader.buffer() | provenance | MaD:102 |
| test.rs:252:22:252:62 | ...::new(...) | test.rs:252:13:252:18 | reader | provenance | |
-| test.rs:252:46:252:59 | ...::stdin | test.rs:252:46:252:61 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 |
-| test.rs:252:46:252:61 | ...::stdin(...) | test.rs:252:22:252:62 | ...::new(...) | provenance | MaD:101 |
+| test.rs:252:46:252:59 | ...::stdin | test.rs:252:46:252:61 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 |
+| test.rs:252:46:252:61 | ...::stdin(...) | test.rs:252:22:252:62 | ...::new(...) | provenance | MaD:103 |
| test.rs:253:13:253:16 | data | test.rs:254:15:254:18 | data | provenance | |
| test.rs:253:20:253:34 | reader.buffer() | test.rs:253:13:253:16 | data | provenance | |
| test.rs:254:15:254:18 | data | test.rs:254:14:254:18 | &data | provenance | |
-| test.rs:259:13:259:22 | mut reader | test.rs:260:26:260:36 | [post] &mut buffer [&ref] | provenance | MaD:47 |
+| test.rs:259:13:259:22 | mut reader | test.rs:260:26:260:36 | [post] &mut buffer [&ref] | provenance | MaD:49 |
| test.rs:259:26:259:66 | ...::new(...) | test.rs:259:13:259:22 | mut reader | provenance | |
-| test.rs:259:50:259:63 | ...::stdin | test.rs:259:50:259:65 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 |
-| test.rs:259:50:259:65 | ...::stdin(...) | test.rs:259:26:259:66 | ...::new(...) | provenance | MaD:101 |
+| test.rs:259:50:259:63 | ...::stdin | test.rs:259:50:259:65 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 |
+| test.rs:259:50:259:65 | ...::stdin(...) | test.rs:259:26:259:66 | ...::new(...) | provenance | MaD:103 |
| test.rs:260:26:260:36 | [post] &mut buffer [&ref] | test.rs:260:31:260:36 | [post] buffer | provenance | |
| test.rs:260:31:260:36 | [post] buffer | test.rs:261:15:261:20 | buffer | provenance | |
| test.rs:261:15:261:20 | buffer | test.rs:261:14:261:20 | &buffer | provenance | |
-| test.rs:266:13:266:22 | mut reader | test.rs:267:33:267:43 | [post] &mut buffer [&ref] | provenance | MaD:48 |
+| test.rs:266:13:266:22 | mut reader | test.rs:267:33:267:43 | [post] &mut buffer [&ref] | provenance | MaD:50 |
| test.rs:266:26:266:66 | ...::new(...) | test.rs:266:13:266:22 | mut reader | provenance | |
-| test.rs:266:50:266:63 | ...::stdin | test.rs:266:50:266:65 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 |
-| test.rs:266:50:266:65 | ...::stdin(...) | test.rs:266:26:266:66 | ...::new(...) | provenance | MaD:101 |
+| test.rs:266:50:266:63 | ...::stdin | test.rs:266:50:266:65 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 |
+| test.rs:266:50:266:65 | ...::stdin(...) | test.rs:266:26:266:66 | ...::new(...) | provenance | MaD:103 |
| test.rs:267:33:267:43 | [post] &mut buffer [&ref] | test.rs:267:38:267:43 | [post] buffer | provenance | |
| test.rs:267:38:267:43 | [post] buffer | test.rs:268:15:268:20 | buffer | provenance | |
| test.rs:267:38:267:43 | [post] buffer | test.rs:269:14:269:22 | buffer[0] | provenance | |
| test.rs:268:15:268:20 | buffer | test.rs:268:14:268:20 | &buffer | provenance | |
-| test.rs:273:13:273:28 | mut reader_split | test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | provenance | MaD:98 |
-| test.rs:273:13:273:28 | mut reader_split | test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | provenance | MaD:98 |
-| test.rs:273:32:273:72 | ...::new(...) | test.rs:273:32:273:84 | ... .split(...) | provenance | MaD:49 |
+| test.rs:273:13:273:28 | mut reader_split | test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | provenance | MaD:100 |
+| test.rs:273:13:273:28 | mut reader_split | test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | provenance | MaD:100 |
+| test.rs:273:32:273:72 | ...::new(...) | test.rs:273:32:273:84 | ... .split(...) | provenance | MaD:51 |
| test.rs:273:32:273:84 | ... .split(...) | test.rs:273:13:273:28 | mut reader_split | provenance | |
-| test.rs:273:56:273:69 | ...::stdin | test.rs:273:56:273:71 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 |
-| test.rs:273:56:273:71 | ...::stdin(...) | test.rs:273:32:273:72 | ...::new(...) | provenance | MaD:101 |
-| test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | test.rs:274:14:274:41 | ... .unwrap() [Ok] | provenance | MaD:75 |
-| test.rs:274:14:274:41 | ... .unwrap() [Ok] | test.rs:274:14:274:50 | ... .unwrap() | provenance | MaD:80 |
+| test.rs:273:56:273:69 | ...::stdin | test.rs:273:56:273:71 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 |
+| test.rs:273:56:273:71 | ...::stdin(...) | test.rs:273:32:273:72 | ...::new(...) | provenance | MaD:103 |
+| test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | test.rs:274:14:274:41 | ... .unwrap() [Ok] | provenance | MaD:77 |
+| test.rs:274:14:274:41 | ... .unwrap() [Ok] | test.rs:274:14:274:50 | ... .unwrap() | provenance | MaD:82 |
| test.rs:275:19:275:29 | Some(...) [Some, Ok] | test.rs:275:24:275:28 | chunk [Ok] | provenance | |
-| test.rs:275:24:275:28 | chunk [Ok] | test.rs:276:18:276:31 | chunk.unwrap() | provenance | MaD:80 |
+| test.rs:275:24:275:28 | chunk [Ok] | test.rs:276:18:276:31 | chunk.unwrap() | provenance | MaD:82 |
| test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | test.rs:275:19:275:29 | Some(...) [Some, Ok] | provenance | |
-| test.rs:281:13:281:18 | reader | test.rs:282:21:282:34 | reader.lines() | provenance | MaD:46 |
+| test.rs:281:13:281:18 | reader | test.rs:282:21:282:34 | reader.lines() | provenance | MaD:48 |
| test.rs:281:22:281:62 | ...::new(...) | test.rs:281:13:281:18 | reader | provenance | |
-| test.rs:281:46:281:59 | ...::stdin | test.rs:281:46:281:61 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 |
-| test.rs:281:46:281:61 | ...::stdin(...) | test.rs:281:22:281:62 | ...::new(...) | provenance | MaD:101 |
+| test.rs:281:46:281:59 | ...::stdin | test.rs:281:46:281:61 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 |
+| test.rs:281:46:281:61 | ...::stdin(...) | test.rs:281:22:281:62 | ...::new(...) | provenance | MaD:103 |
| test.rs:282:21:282:34 | reader.lines() | test.rs:283:18:283:21 | line | provenance | |
-| test.rs:309:13:309:21 | mut stdin | test.rs:311:33:311:43 | [post] &mut buffer [&ref] | provenance | MaD:63 |
-| test.rs:309:25:309:40 | ...::stdin | test.rs:309:25:309:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 |
+| test.rs:309:13:309:21 | mut stdin | test.rs:311:33:311:43 | [post] &mut buffer [&ref] | provenance | MaD:65 |
+| test.rs:309:25:309:40 | ...::stdin | test.rs:309:25:309:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 |
| test.rs:309:25:309:42 | ...::stdin(...) | test.rs:309:13:309:21 | mut stdin | provenance | |
| test.rs:311:33:311:43 | [post] &mut buffer [&ref] | test.rs:311:38:311:43 | [post] buffer | provenance | |
| test.rs:311:38:311:43 | [post] buffer | test.rs:312:15:312:20 | buffer | provenance | |
| test.rs:312:15:312:20 | buffer | test.rs:312:14:312:20 | &buffer | provenance | |
-| test.rs:316:13:316:21 | mut stdin | test.rs:318:40:318:50 | [post] &mut buffer [&ref] | provenance | MaD:69 |
-| test.rs:316:25:316:40 | ...::stdin | test.rs:316:25:316:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 |
+| test.rs:316:13:316:21 | mut stdin | test.rs:318:40:318:50 | [post] &mut buffer [&ref] | provenance | MaD:71 |
+| test.rs:316:25:316:40 | ...::stdin | test.rs:316:25:316:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 |
| test.rs:316:25:316:42 | ...::stdin(...) | test.rs:316:13:316:21 | mut stdin | provenance | |
| test.rs:318:40:318:50 | [post] &mut buffer [&ref] | test.rs:318:45:318:50 | [post] buffer | provenance | |
| test.rs:318:45:318:50 | [post] buffer | test.rs:319:15:319:20 | buffer | provenance | |
| test.rs:319:15:319:20 | buffer | test.rs:319:14:319:20 | &buffer | provenance | |
-| test.rs:323:13:323:21 | mut stdin | test.rs:325:43:325:53 | [post] &mut buffer [&ref] | provenance | MaD:70 |
-| test.rs:323:25:323:40 | ...::stdin | test.rs:323:25:323:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 |
+| test.rs:323:13:323:21 | mut stdin | test.rs:325:43:325:53 | [post] &mut buffer [&ref] | provenance | MaD:72 |
+| test.rs:323:25:323:40 | ...::stdin | test.rs:323:25:323:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 |
| test.rs:323:25:323:42 | ...::stdin(...) | test.rs:323:13:323:21 | mut stdin | provenance | |
| test.rs:325:43:325:53 | [post] &mut buffer [&ref] | test.rs:325:48:325:53 | [post] buffer | provenance | |
| test.rs:325:48:325:53 | [post] buffer | test.rs:326:15:326:20 | buffer | provenance | |
| test.rs:326:15:326:20 | buffer | test.rs:326:14:326:20 | &buffer | provenance | |
-| test.rs:330:13:330:21 | mut stdin | test.rs:332:26:332:36 | [post] &mut buffer [&ref] | provenance | MaD:65 |
-| test.rs:330:25:330:40 | ...::stdin | test.rs:330:25:330:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 |
+| test.rs:330:13:330:21 | mut stdin | test.rs:332:26:332:36 | [post] &mut buffer [&ref] | provenance | MaD:67 |
+| test.rs:330:25:330:40 | ...::stdin | test.rs:330:25:330:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 |
| test.rs:330:25:330:42 | ...::stdin(...) | test.rs:330:13:330:21 | mut stdin | provenance | |
| test.rs:332:26:332:36 | [post] &mut buffer [&ref] | test.rs:332:31:332:36 | [post] buffer | provenance | |
| test.rs:332:31:332:36 | [post] buffer | test.rs:333:15:333:20 | buffer | provenance | |
| test.rs:333:15:333:20 | buffer | test.rs:333:14:333:20 | &buffer | provenance | |
-| test.rs:337:13:337:21 | mut stdin | test.rs:338:18:338:32 | stdin.read_u8() [future, Ok] | provenance | MaD:71 |
-| test.rs:337:13:337:21 | mut stdin | test.rs:339:18:339:33 | stdin.read_i16() [future, Ok] | provenance | MaD:67 |
-| test.rs:337:13:337:21 | mut stdin | test.rs:340:18:340:33 | stdin.read_f32() [future, Ok] | provenance | MaD:66 |
-| test.rs:337:13:337:21 | mut stdin | test.rs:341:18:341:36 | stdin.read_i64_le() [future, Ok] | provenance | MaD:68 |
-| test.rs:337:25:337:40 | ...::stdin | test.rs:337:25:337:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 |
+| test.rs:337:13:337:21 | mut stdin | test.rs:338:18:338:32 | stdin.read_u8() [future, Ok] | provenance | MaD:73 |
+| test.rs:337:13:337:21 | mut stdin | test.rs:339:18:339:33 | stdin.read_i16() [future, Ok] | provenance | MaD:69 |
+| test.rs:337:13:337:21 | mut stdin | test.rs:340:18:340:33 | stdin.read_f32() [future, Ok] | provenance | MaD:68 |
+| test.rs:337:13:337:21 | mut stdin | test.rs:341:18:341:36 | stdin.read_i64_le() [future, Ok] | provenance | MaD:70 |
+| test.rs:337:25:337:40 | ...::stdin | test.rs:337:25:337:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 |
| test.rs:337:25:337:42 | ...::stdin(...) | test.rs:337:13:337:21 | mut stdin | provenance | |
| test.rs:338:13:338:14 | v1 | test.rs:342:14:342:15 | v1 | provenance | |
| test.rs:338:18:338:32 | stdin.read_u8() [future, Ok] | test.rs:338:18:338:38 | await ... [Ok] | provenance | |
@@ -376,150 +378,150 @@ edges
| test.rs:341:18:341:36 | stdin.read_i64_le() [future, Ok] | test.rs:341:18:341:42 | await ... [Ok] | provenance | |
| test.rs:341:18:341:42 | await ... [Ok] | test.rs:341:18:341:43 | TryExpr | provenance | |
| test.rs:341:18:341:43 | TryExpr | test.rs:341:13:341:14 | v4 | provenance | |
-| test.rs:349:13:349:21 | mut stdin | test.rs:351:24:351:34 | [post] &mut buffer [&ref] | provenance | MaD:64 |
-| test.rs:349:25:349:40 | ...::stdin | test.rs:349:25:349:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 |
+| test.rs:349:13:349:21 | mut stdin | test.rs:351:24:351:34 | [post] &mut buffer [&ref] | provenance | MaD:66 |
+| test.rs:349:25:349:40 | ...::stdin | test.rs:349:25:349:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 |
| test.rs:349:25:349:42 | ...::stdin(...) | test.rs:349:13:349:21 | mut stdin | provenance | |
| test.rs:351:24:351:34 | [post] &mut buffer [&ref] | test.rs:351:29:351:34 | [post] buffer | provenance | |
| test.rs:351:29:351:34 | [post] buffer | test.rs:352:15:352:20 | buffer | provenance | |
| test.rs:352:15:352:20 | buffer | test.rs:352:14:352:20 | &buffer | provenance | |
-| test.rs:358:13:358:22 | mut reader | test.rs:359:20:359:36 | reader.fill_buf() [future, Ok] | provenance | MaD:58 |
+| test.rs:358:13:358:22 | mut reader | test.rs:359:20:359:36 | reader.fill_buf() [future, Ok] | provenance | MaD:60 |
| test.rs:358:26:358:70 | ...::new(...) | test.rs:358:13:358:22 | mut reader | provenance | |
-| test.rs:358:52:358:67 | ...::stdin | test.rs:358:52:358:69 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 |
-| test.rs:358:52:358:69 | ...::stdin(...) | test.rs:358:26:358:70 | ...::new(...) | provenance | MaD:114 |
+| test.rs:358:52:358:67 | ...::stdin | test.rs:358:52:358:69 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 |
+| test.rs:358:52:358:69 | ...::stdin(...) | test.rs:358:26:358:70 | ...::new(...) | provenance | MaD:116 |
| test.rs:359:13:359:16 | data | test.rs:360:15:360:18 | data | provenance | |
| test.rs:359:20:359:36 | reader.fill_buf() [future, Ok] | test.rs:359:20:359:42 | await ... [Ok] | provenance | |
| test.rs:359:20:359:42 | await ... [Ok] | test.rs:359:20:359:43 | TryExpr | provenance | |
| test.rs:359:20:359:43 | TryExpr | test.rs:359:13:359:16 | data | provenance | |
| test.rs:360:15:360:18 | data | test.rs:360:14:360:18 | &data | provenance | |
-| test.rs:364:13:364:18 | reader | test.rs:365:20:365:34 | reader.buffer() | provenance | MaD:113 |
+| test.rs:364:13:364:18 | reader | test.rs:365:20:365:34 | reader.buffer() | provenance | MaD:115 |
| test.rs:364:22:364:66 | ...::new(...) | test.rs:364:13:364:18 | reader | provenance | |
-| test.rs:364:48:364:63 | ...::stdin | test.rs:364:48:364:65 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 |
-| test.rs:364:48:364:65 | ...::stdin(...) | test.rs:364:22:364:66 | ...::new(...) | provenance | MaD:114 |
+| test.rs:364:48:364:63 | ...::stdin | test.rs:364:48:364:65 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 |
+| test.rs:364:48:364:65 | ...::stdin(...) | test.rs:364:22:364:66 | ...::new(...) | provenance | MaD:116 |
| test.rs:365:13:365:16 | data | test.rs:366:15:366:18 | data | provenance | |
| test.rs:365:20:365:34 | reader.buffer() | test.rs:365:13:365:16 | data | provenance | |
| test.rs:366:15:366:18 | data | test.rs:366:14:366:18 | &data | provenance | |
-| test.rs:371:13:371:22 | mut reader | test.rs:372:26:372:36 | [post] &mut buffer [&ref] | provenance | MaD:60 |
+| test.rs:371:13:371:22 | mut reader | test.rs:372:26:372:36 | [post] &mut buffer [&ref] | provenance | MaD:62 |
| test.rs:371:26:371:70 | ...::new(...) | test.rs:371:13:371:22 | mut reader | provenance | |
-| test.rs:371:52:371:67 | ...::stdin | test.rs:371:52:371:69 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 |
-| test.rs:371:52:371:69 | ...::stdin(...) | test.rs:371:26:371:70 | ...::new(...) | provenance | MaD:114 |
+| test.rs:371:52:371:67 | ...::stdin | test.rs:371:52:371:69 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 |
+| test.rs:371:52:371:69 | ...::stdin(...) | test.rs:371:26:371:70 | ...::new(...) | provenance | MaD:116 |
| test.rs:372:26:372:36 | [post] &mut buffer [&ref] | test.rs:372:31:372:36 | [post] buffer | provenance | |
| test.rs:372:31:372:36 | [post] buffer | test.rs:373:15:373:20 | buffer | provenance | |
| test.rs:373:15:373:20 | buffer | test.rs:373:14:373:20 | &buffer | provenance | |
-| test.rs:378:13:378:22 | mut reader | test.rs:379:33:379:43 | [post] &mut buffer [&ref] | provenance | MaD:61 |
+| test.rs:378:13:378:22 | mut reader | test.rs:379:33:379:43 | [post] &mut buffer [&ref] | provenance | MaD:63 |
| test.rs:378:26:378:70 | ...::new(...) | test.rs:378:13:378:22 | mut reader | provenance | |
-| test.rs:378:52:378:67 | ...::stdin | test.rs:378:52:378:69 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 |
-| test.rs:378:52:378:69 | ...::stdin(...) | test.rs:378:26:378:70 | ...::new(...) | provenance | MaD:114 |
+| test.rs:378:52:378:67 | ...::stdin | test.rs:378:52:378:69 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 |
+| test.rs:378:52:378:69 | ...::stdin(...) | test.rs:378:26:378:70 | ...::new(...) | provenance | MaD:116 |
| test.rs:379:33:379:43 | [post] &mut buffer [&ref] | test.rs:379:38:379:43 | [post] buffer | provenance | |
| test.rs:379:38:379:43 | [post] buffer | test.rs:380:15:380:20 | buffer | provenance | |
| test.rs:379:38:379:43 | [post] buffer | test.rs:381:14:381:22 | buffer[0] | provenance | |
| test.rs:380:15:380:20 | buffer | test.rs:380:14:380:20 | &buffer | provenance | |
-| test.rs:385:13:385:28 | mut reader_split | test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:116 |
-| test.rs:385:13:385:28 | mut reader_split | test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:116 |
-| test.rs:385:32:385:76 | ...::new(...) | test.rs:385:32:385:88 | ... .split(...) | provenance | MaD:62 |
+| test.rs:385:13:385:28 | mut reader_split | test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:118 |
+| test.rs:385:13:385:28 | mut reader_split | test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:118 |
+| test.rs:385:32:385:76 | ...::new(...) | test.rs:385:32:385:88 | ... .split(...) | provenance | MaD:64 |
| test.rs:385:32:385:88 | ... .split(...) | test.rs:385:13:385:28 | mut reader_split | provenance | |
-| test.rs:385:58:385:73 | ...::stdin | test.rs:385:58:385:75 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 |
-| test.rs:385:58:385:75 | ...::stdin(...) | test.rs:385:32:385:76 | ...::new(...) | provenance | MaD:114 |
+| test.rs:385:58:385:73 | ...::stdin | test.rs:385:58:385:75 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 |
+| test.rs:385:58:385:75 | ...::stdin(...) | test.rs:385:32:385:76 | ...::new(...) | provenance | MaD:116 |
| test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | test.rs:386:14:386:46 | await ... [Ok, Some] | provenance | |
| test.rs:386:14:386:46 | await ... [Ok, Some] | test.rs:386:14:386:47 | TryExpr [Some] | provenance | |
-| test.rs:386:14:386:47 | TryExpr [Some] | test.rs:386:14:386:56 | ... .unwrap() | provenance | MaD:75 |
+| test.rs:386:14:386:47 | TryExpr [Some] | test.rs:386:14:386:56 | ... .unwrap() | provenance | MaD:77 |
| test.rs:387:19:387:29 | Some(...) [Some] | test.rs:387:24:387:28 | chunk | provenance | |
| test.rs:387:24:387:28 | chunk | test.rs:388:18:388:22 | chunk | provenance | |
| test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | test.rs:387:33:387:65 | await ... [Ok, Some] | provenance | |
| test.rs:387:33:387:65 | await ... [Ok, Some] | test.rs:387:33:387:66 | TryExpr [Some] | provenance | |
| test.rs:387:33:387:66 | TryExpr [Some] | test.rs:387:19:387:29 | Some(...) [Some] | provenance | |
-| test.rs:393:13:393:18 | reader | test.rs:394:25:394:38 | reader.lines() | provenance | MaD:59 |
+| test.rs:393:13:393:18 | reader | test.rs:394:25:394:38 | reader.lines() | provenance | MaD:61 |
| test.rs:393:22:393:66 | ...::new(...) | test.rs:393:13:393:18 | reader | provenance | |
-| test.rs:393:48:393:63 | ...::stdin | test.rs:393:48:393:65 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 |
-| test.rs:393:48:393:65 | ...::stdin(...) | test.rs:393:22:393:66 | ...::new(...) | provenance | MaD:114 |
-| test.rs:394:13:394:21 | mut lines | test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:115 |
-| test.rs:394:13:394:21 | mut lines | test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:115 |
+| test.rs:393:48:393:63 | ...::stdin | test.rs:393:48:393:65 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 |
+| test.rs:393:48:393:65 | ...::stdin(...) | test.rs:393:22:393:66 | ...::new(...) | provenance | MaD:116 |
+| test.rs:394:13:394:21 | mut lines | test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:117 |
+| test.rs:394:13:394:21 | mut lines | test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:117 |
| test.rs:394:25:394:38 | reader.lines() | test.rs:394:13:394:21 | mut lines | provenance | |
| test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | test.rs:395:14:395:36 | await ... [Ok, Some] | provenance | |
| test.rs:395:14:395:36 | await ... [Ok, Some] | test.rs:395:14:395:37 | TryExpr [Some] | provenance | |
-| test.rs:395:14:395:37 | TryExpr [Some] | test.rs:395:14:395:46 | ... .unwrap() | provenance | MaD:75 |
+| test.rs:395:14:395:37 | TryExpr [Some] | test.rs:395:14:395:46 | ... .unwrap() | provenance | MaD:77 |
| test.rs:396:19:396:28 | Some(...) [Some] | test.rs:396:24:396:27 | line | provenance | |
| test.rs:396:24:396:27 | line | test.rs:397:18:397:21 | line | provenance | |
| test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | test.rs:396:32:396:54 | await ... [Ok, Some] | provenance | |
| test.rs:396:32:396:54 | await ... [Ok, Some] | test.rs:396:32:396:55 | TryExpr [Some] | provenance | |
| test.rs:396:32:396:55 | TryExpr [Some] | test.rs:396:19:396:28 | Some(...) [Some] | provenance | |
| test.rs:408:13:408:18 | buffer | test.rs:409:14:409:19 | buffer | provenance | |
-| test.rs:408:31:408:43 | ...::read | test.rs:408:31:408:43 | ...::read [Ok] | provenance | Src:MaD:23 |
-| test.rs:408:31:408:43 | ...::read | test.rs:408:31:408:55 | ...::read(...) [Ok] | provenance | Src:MaD:23 |
-| test.rs:408:31:408:43 | ...::read [Ok] | test.rs:408:31:408:55 | ...::read(...) [Ok] | provenance | MaD:24 |
+| test.rs:408:31:408:43 | ...::read | test.rs:408:31:408:43 | ...::read [Ok] | provenance | Src:MaD:25 |
+| test.rs:408:31:408:43 | ...::read | test.rs:408:31:408:55 | ...::read(...) [Ok] | provenance | Src:MaD:25 |
+| test.rs:408:31:408:43 | ...::read [Ok] | test.rs:408:31:408:55 | ...::read(...) [Ok] | provenance | MaD:26 |
| test.rs:408:31:408:55 | ...::read(...) [Ok] | test.rs:408:31:408:56 | TryExpr | provenance | |
| test.rs:408:31:408:56 | TryExpr | test.rs:408:13:408:18 | buffer | provenance | |
| test.rs:413:13:413:18 | buffer | test.rs:414:14:414:19 | buffer | provenance | |
-| test.rs:413:31:413:38 | ...::read | test.rs:413:31:413:38 | ...::read [Ok] | provenance | Src:MaD:23 |
-| test.rs:413:31:413:38 | ...::read | test.rs:413:31:413:50 | ...::read(...) [Ok] | provenance | Src:MaD:23 |
-| test.rs:413:31:413:38 | ...::read [Ok] | test.rs:413:31:413:50 | ...::read(...) [Ok] | provenance | MaD:24 |
+| test.rs:413:31:413:38 | ...::read | test.rs:413:31:413:38 | ...::read [Ok] | provenance | Src:MaD:25 |
+| test.rs:413:31:413:38 | ...::read | test.rs:413:31:413:50 | ...::read(...) [Ok] | provenance | Src:MaD:25 |
+| test.rs:413:31:413:38 | ...::read [Ok] | test.rs:413:31:413:50 | ...::read(...) [Ok] | provenance | MaD:26 |
| test.rs:413:31:413:50 | ...::read(...) [Ok] | test.rs:413:31:413:51 | TryExpr | provenance | |
| test.rs:413:31:413:51 | TryExpr | test.rs:413:13:413:18 | buffer | provenance | |
| test.rs:418:13:418:18 | buffer | test.rs:419:14:419:19 | buffer | provenance | |
-| test.rs:418:22:418:39 | ...::read_to_string | test.rs:418:22:418:39 | ...::read_to_string [Ok] | provenance | Src:MaD:26 |
-| test.rs:418:22:418:39 | ...::read_to_string | test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | provenance | Src:MaD:26 |
-| test.rs:418:22:418:39 | ...::read_to_string [Ok] | test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | provenance | MaD:27 |
+| test.rs:418:22:418:39 | ...::read_to_string | test.rs:418:22:418:39 | ...::read_to_string [Ok] | provenance | Src:MaD:28 |
+| test.rs:418:22:418:39 | ...::read_to_string | test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | provenance | Src:MaD:28 |
+| test.rs:418:22:418:39 | ...::read_to_string [Ok] | test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | provenance | MaD:29 |
| test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | test.rs:418:22:418:52 | TryExpr | provenance | |
| test.rs:418:22:418:52 | TryExpr | test.rs:418:13:418:18 | buffer | provenance | |
| test.rs:425:13:425:16 | path | test.rs:426:14:426:17 | path | provenance | |
-| test.rs:425:13:425:16 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:33 |
+| test.rs:425:13:425:16 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:35 |
| test.rs:425:13:425:16 | path | test.rs:427:14:427:17 | path | provenance | |
-| test.rs:425:13:425:16 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:33 |
+| test.rs:425:13:425:16 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:35 |
| test.rs:425:13:425:16 | path | test.rs:437:14:437:17 | path | provenance | |
| test.rs:425:20:425:27 | e.path() | test.rs:425:13:425:16 | path | provenance | |
-| test.rs:425:22:425:25 | path | test.rs:425:20:425:27 | e.path() | provenance | Src:MaD:4 MaD:4 |
-| test.rs:426:14:426:17 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:33 |
-| test.rs:427:14:427:17 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:33 |
-| test.rs:427:14:427:25 | path.clone() | test.rs:427:14:427:35 | ... .as_path() | provenance | MaD:112 |
+| test.rs:425:22:425:25 | path | test.rs:425:20:425:27 | e.path() | provenance | Src:MaD:6 MaD:6 |
+| test.rs:426:14:426:17 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:35 |
+| test.rs:427:14:427:17 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:35 |
+| test.rs:427:14:427:25 | path.clone() | test.rs:427:14:427:35 | ... .as_path() | provenance | MaD:114 |
| test.rs:439:13:439:21 | file_name | test.rs:440:14:440:22 | file_name | provenance | |
-| test.rs:439:13:439:21 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:33 |
+| test.rs:439:13:439:21 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:35 |
| test.rs:439:13:439:21 | file_name | test.rs:445:14:445:22 | file_name | provenance | |
| test.rs:439:25:439:37 | e.file_name() | test.rs:439:13:439:21 | file_name | provenance | |
-| test.rs:439:27:439:35 | file_name | test.rs:439:25:439:37 | e.file_name() | provenance | Src:MaD:3 MaD:3 |
-| test.rs:440:14:440:22 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:33 |
+| test.rs:439:27:439:35 | file_name | test.rs:439:25:439:37 | e.file_name() | provenance | Src:MaD:5 MaD:5 |
+| test.rs:440:14:440:22 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:35 |
| test.rs:461:13:461:18 | target | test.rs:462:14:462:19 | target | provenance | |
-| test.rs:461:22:461:34 | ...::read_link | test.rs:461:22:461:49 | ...::read_link(...) [Ok] | provenance | Src:MaD:25 |
+| test.rs:461:22:461:34 | ...::read_link | test.rs:461:22:461:49 | ...::read_link(...) [Ok] | provenance | Src:MaD:27 |
| test.rs:461:22:461:49 | ...::read_link(...) [Ok] | test.rs:461:22:461:50 | TryExpr | provenance | |
| test.rs:461:22:461:50 | TryExpr | test.rs:461:13:461:18 | target | provenance | |
| test.rs:470:13:470:18 | buffer | test.rs:471:14:471:19 | buffer | provenance | |
-| test.rs:470:31:470:45 | ...::read | test.rs:470:31:470:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:29 |
+| test.rs:470:31:470:45 | ...::read | test.rs:470:31:470:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:31 |
| test.rs:470:31:470:57 | ...::read(...) [future, Ok] | test.rs:470:31:470:63 | await ... [Ok] | provenance | |
| test.rs:470:31:470:63 | await ... [Ok] | test.rs:470:31:470:64 | TryExpr | provenance | |
| test.rs:470:31:470:64 | TryExpr | test.rs:470:13:470:18 | buffer | provenance | |
| test.rs:475:13:475:18 | buffer | test.rs:476:14:476:19 | buffer | provenance | |
-| test.rs:475:31:475:45 | ...::read | test.rs:475:31:475:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:29 |
+| test.rs:475:31:475:45 | ...::read | test.rs:475:31:475:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:31 |
| test.rs:475:31:475:57 | ...::read(...) [future, Ok] | test.rs:475:31:475:63 | await ... [Ok] | provenance | |
| test.rs:475:31:475:63 | await ... [Ok] | test.rs:475:31:475:64 | TryExpr | provenance | |
| test.rs:475:31:475:64 | TryExpr | test.rs:475:13:475:18 | buffer | provenance | |
| test.rs:480:13:480:18 | buffer | test.rs:481:14:481:19 | buffer | provenance | |
-| test.rs:480:22:480:46 | ...::read_to_string | test.rs:480:22:480:58 | ...::read_to_string(...) [future, Ok] | provenance | Src:MaD:31 |
+| test.rs:480:22:480:46 | ...::read_to_string | test.rs:480:22:480:58 | ...::read_to_string(...) [future, Ok] | provenance | Src:MaD:33 |
| test.rs:480:22:480:58 | ...::read_to_string(...) [future, Ok] | test.rs:480:22:480:64 | await ... [Ok] | provenance | |
| test.rs:480:22:480:64 | await ... [Ok] | test.rs:480:22:480:65 | TryExpr | provenance | |
| test.rs:480:22:480:65 | TryExpr | test.rs:480:13:480:18 | buffer | provenance | |
| test.rs:486:13:486:16 | path | test.rs:488:14:488:17 | path | provenance | |
| test.rs:486:20:486:31 | entry.path() | test.rs:486:13:486:16 | path | provenance | |
-| test.rs:486:26:486:29 | path | test.rs:486:20:486:31 | entry.path() | provenance | Src:MaD:12 MaD:12 |
-| test.rs:486:26:486:29 | path | test.rs:486:20:486:31 | entry.path() | provenance | Src:MaD:12 MaD:12 |
+| test.rs:486:26:486:29 | path | test.rs:486:20:486:31 | entry.path() | provenance | Src:MaD:14 MaD:14 |
+| test.rs:486:26:486:29 | path | test.rs:486:20:486:31 | entry.path() | provenance | Src:MaD:14 MaD:14 |
| test.rs:487:13:487:21 | file_name | test.rs:489:14:489:22 | file_name | provenance | |
| test.rs:487:25:487:41 | entry.file_name() | test.rs:487:13:487:21 | file_name | provenance | |
-| test.rs:487:31:487:39 | file_name | test.rs:487:25:487:41 | entry.file_name() | provenance | Src:MaD:11 MaD:11 |
-| test.rs:487:31:487:39 | file_name | test.rs:487:25:487:41 | entry.file_name() | provenance | Src:MaD:11 MaD:11 |
+| test.rs:487:31:487:39 | file_name | test.rs:487:25:487:41 | entry.file_name() | provenance | Src:MaD:13 MaD:13 |
+| test.rs:487:31:487:39 | file_name | test.rs:487:25:487:41 | entry.file_name() | provenance | Src:MaD:13 MaD:13 |
| test.rs:493:13:493:18 | target | test.rs:494:14:494:19 | target | provenance | |
-| test.rs:493:22:493:41 | ...::read_link | test.rs:493:22:493:56 | ...::read_link(...) [future, Ok] | provenance | Src:MaD:30 |
+| test.rs:493:22:493:41 | ...::read_link | test.rs:493:22:493:56 | ...::read_link(...) [future, Ok] | provenance | Src:MaD:32 |
| test.rs:493:22:493:56 | ...::read_link(...) [future, Ok] | test.rs:493:22:493:62 | await ... [Ok] | provenance | |
| test.rs:493:22:493:62 | await ... [Ok] | test.rs:493:22:493:63 | TryExpr | provenance | |
| test.rs:493:22:493:63 | TryExpr | test.rs:493:13:493:18 | target | provenance | |
-| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer | provenance | MaD:93 |
-| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:53 |
-| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:92 |
-| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer | provenance | MaD:95 |
-| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:55 |
-| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:94 |
-| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer | provenance | MaD:97 |
-| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:56 |
-| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:96 |
-| test.rs:503:9:503:16 | mut file | test.rs:525:25:525:35 | [post] &mut buffer [&ref] | provenance | MaD:54 |
-| test.rs:503:9:503:16 | mut file | test.rs:529:17:529:28 | file.bytes() | provenance | MaD:50 |
-| test.rs:503:20:503:38 | ...::open | test.rs:503:20:503:50 | ...::open(...) [Ok] | provenance | Src:MaD:5 |
+| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer | provenance | MaD:95 |
+| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:55 |
+| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:94 |
+| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer | provenance | MaD:97 |
+| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:57 |
+| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:96 |
+| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer | provenance | MaD:99 |
+| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:58 |
+| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:98 |
+| test.rs:503:9:503:16 | mut file | test.rs:525:25:525:35 | [post] &mut buffer [&ref] | provenance | MaD:56 |
+| test.rs:503:9:503:16 | mut file | test.rs:529:17:529:28 | file.bytes() | provenance | MaD:52 |
+| test.rs:503:20:503:38 | ...::open | test.rs:503:20:503:50 | ...::open(...) [Ok] | provenance | Src:MaD:7 |
| test.rs:503:20:503:50 | ...::open(...) [Ok] | test.rs:503:20:503:51 | TryExpr | provenance | |
| test.rs:503:20:503:51 | TryExpr | test.rs:503:9:503:16 | mut file | provenance | |
| test.rs:507:32:507:42 | [post] &mut buffer | test.rs:508:15:508:20 | buffer | provenance | |
@@ -538,69 +540,69 @@ edges
| test.rs:525:30:525:35 | [post] buffer | test.rs:526:15:526:20 | buffer | provenance | |
| test.rs:526:15:526:20 | buffer | test.rs:526:14:526:20 | &buffer | provenance | |
| test.rs:529:17:529:28 | file.bytes() | test.rs:530:14:530:17 | byte | provenance | |
-| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer | provenance | MaD:93 |
-| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:53 |
-| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:92 |
-| test.rs:536:22:536:63 | ... .open(...) [Ok] | test.rs:536:22:536:72 | ... .unwrap() | provenance | MaD:80 |
+| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer | provenance | MaD:95 |
+| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:55 |
+| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:94 |
+| test.rs:536:22:536:63 | ... .open(...) [Ok] | test.rs:536:22:536:72 | ... .unwrap() | provenance | MaD:82 |
| test.rs:536:22:536:72 | ... .unwrap() | test.rs:536:13:536:18 | mut f1 | provenance | |
-| test.rs:536:50:536:53 | open | test.rs:536:22:536:63 | ... .open(...) [Ok] | provenance | Src:MaD:6 |
+| test.rs:536:50:536:53 | open | test.rs:536:22:536:63 | ... .open(...) [Ok] | provenance | Src:MaD:8 |
| test.rs:538:30:538:40 | [post] &mut buffer | test.rs:539:15:539:20 | buffer | provenance | |
| test.rs:538:30:538:40 | [post] &mut buffer [&ref] | test.rs:538:35:538:40 | [post] buffer | provenance | |
| test.rs:538:35:538:40 | [post] buffer | test.rs:539:15:539:20 | buffer | provenance | |
| test.rs:539:15:539:20 | buffer | test.rs:539:14:539:20 | &buffer | provenance | |
-| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer | provenance | MaD:93 |
-| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:53 |
-| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:92 |
-| test.rs:543:22:543:80 | ... .open(...) [Ok] | test.rs:543:22:543:89 | ... .unwrap() | provenance | MaD:80 |
+| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer | provenance | MaD:95 |
+| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:55 |
+| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:94 |
+| test.rs:543:22:543:80 | ... .open(...) [Ok] | test.rs:543:22:543:89 | ... .unwrap() | provenance | MaD:82 |
| test.rs:543:22:543:89 | ... .unwrap() | test.rs:543:13:543:18 | mut f2 | provenance | |
-| test.rs:543:67:543:70 | open | test.rs:543:22:543:80 | ... .open(...) [Ok] | provenance | Src:MaD:6 |
+| test.rs:543:67:543:70 | open | test.rs:543:22:543:80 | ... .open(...) [Ok] | provenance | Src:MaD:8 |
| test.rs:545:30:545:40 | [post] &mut buffer | test.rs:546:15:546:20 | buffer | provenance | |
| test.rs:545:30:545:40 | [post] &mut buffer [&ref] | test.rs:545:35:545:40 | [post] buffer | provenance | |
| test.rs:545:35:545:40 | [post] buffer | test.rs:546:15:546:20 | buffer | provenance | |
| test.rs:546:15:546:20 | buffer | test.rs:546:14:546:20 | &buffer | provenance | |
-| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer | provenance | MaD:93 |
-| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:53 |
-| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:92 |
-| test.rs:550:22:550:114 | ... .open(...) [Ok] | test.rs:550:22:550:123 | ... .unwrap() | provenance | MaD:80 |
+| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer | provenance | MaD:95 |
+| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:55 |
+| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:94 |
+| test.rs:550:22:550:114 | ... .open(...) [Ok] | test.rs:550:22:550:123 | ... .unwrap() | provenance | MaD:82 |
| test.rs:550:22:550:123 | ... .unwrap() | test.rs:550:13:550:18 | mut f3 | provenance | |
-| test.rs:550:101:550:104 | open | test.rs:550:22:550:114 | ... .open(...) [Ok] | provenance | Src:MaD:6 |
+| test.rs:550:101:550:104 | open | test.rs:550:22:550:114 | ... .open(...) [Ok] | provenance | Src:MaD:8 |
| test.rs:552:30:552:40 | [post] &mut buffer | test.rs:553:15:553:20 | buffer | provenance | |
| test.rs:552:30:552:40 | [post] &mut buffer [&ref] | test.rs:552:35:552:40 | [post] buffer | provenance | |
| test.rs:552:35:552:40 | [post] buffer | test.rs:553:15:553:20 | buffer | provenance | |
| test.rs:553:15:553:20 | buffer | test.rs:553:14:553:20 | &buffer | provenance | |
-| test.rs:560:13:560:17 | file1 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:52 |
-| test.rs:560:21:560:39 | ...::open | test.rs:560:21:560:51 | ...::open(...) [Ok] | provenance | Src:MaD:5 |
+| test.rs:560:13:560:17 | file1 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:54 |
+| test.rs:560:21:560:39 | ...::open | test.rs:560:21:560:51 | ...::open(...) [Ok] | provenance | Src:MaD:7 |
| test.rs:560:21:560:51 | ...::open(...) [Ok] | test.rs:560:21:560:52 | TryExpr | provenance | |
| test.rs:560:21:560:52 | TryExpr | test.rs:560:13:560:17 | file1 | provenance | |
| test.rs:561:13:561:17 | file2 | test.rs:562:38:562:42 | file2 | provenance | |
-| test.rs:561:21:561:39 | ...::open | test.rs:561:21:561:59 | ...::open(...) [Ok] | provenance | Src:MaD:5 |
+| test.rs:561:21:561:39 | ...::open | test.rs:561:21:561:59 | ...::open(...) [Ok] | provenance | Src:MaD:7 |
| test.rs:561:21:561:59 | ...::open(...) [Ok] | test.rs:561:21:561:60 | TryExpr | provenance | |
| test.rs:561:21:561:60 | TryExpr | test.rs:561:13:561:17 | file2 | provenance | |
-| test.rs:562:13:562:22 | mut reader | test.rs:563:31:563:41 | [post] &mut buffer [&ref] | provenance | MaD:56 |
+| test.rs:562:13:562:22 | mut reader | test.rs:563:31:563:41 | [post] &mut buffer [&ref] | provenance | MaD:58 |
| test.rs:562:26:562:43 | file1.chain(...) | test.rs:562:13:562:22 | mut reader | provenance | |
-| test.rs:562:38:562:42 | file2 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:51 |
+| test.rs:562:38:562:42 | file2 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:53 |
| test.rs:563:31:563:41 | [post] &mut buffer [&ref] | test.rs:563:36:563:41 | [post] buffer | provenance | |
| test.rs:563:36:563:41 | [post] buffer | test.rs:564:15:564:20 | buffer | provenance | |
| test.rs:564:15:564:20 | buffer | test.rs:564:14:564:20 | &buffer | provenance | |
-| test.rs:569:13:569:17 | file1 | test.rs:570:26:570:40 | file1.take(...) | provenance | MaD:57 |
-| test.rs:569:21:569:39 | ...::open | test.rs:569:21:569:51 | ...::open(...) [Ok] | provenance | Src:MaD:5 |
+| test.rs:569:13:569:17 | file1 | test.rs:570:26:570:40 | file1.take(...) | provenance | MaD:59 |
+| test.rs:569:21:569:39 | ...::open | test.rs:569:21:569:51 | ...::open(...) [Ok] | provenance | Src:MaD:7 |
| test.rs:569:21:569:51 | ...::open(...) [Ok] | test.rs:569:21:569:52 | TryExpr | provenance | |
| test.rs:569:21:569:52 | TryExpr | test.rs:569:13:569:17 | file1 | provenance | |
-| test.rs:570:13:570:22 | mut reader | test.rs:571:31:571:41 | [post] &mut buffer [&ref] | provenance | MaD:56 |
+| test.rs:570:13:570:22 | mut reader | test.rs:571:31:571:41 | [post] &mut buffer [&ref] | provenance | MaD:58 |
| test.rs:570:26:570:40 | file1.take(...) | test.rs:570:13:570:22 | mut reader | provenance | |
| test.rs:571:31:571:41 | [post] &mut buffer [&ref] | test.rs:571:36:571:41 | [post] buffer | provenance | |
| test.rs:571:36:571:41 | [post] buffer | test.rs:572:15:572:20 | buffer | provenance | |
| test.rs:572:15:572:20 | buffer | test.rs:572:14:572:20 | &buffer | provenance | |
-| test.rs:581:9:581:16 | mut file | test.rs:585:32:585:42 | [post] &mut buffer [&ref] | provenance | MaD:63 |
-| test.rs:581:9:581:16 | mut file | test.rs:591:39:591:49 | [post] &mut buffer [&ref] | provenance | MaD:69 |
-| test.rs:581:9:581:16 | mut file | test.rs:597:42:597:52 | [post] &mut buffer [&ref] | provenance | MaD:70 |
-| test.rs:581:9:581:16 | mut file | test.rs:603:25:603:35 | [post] &mut buffer [&ref] | provenance | MaD:65 |
-| test.rs:581:9:581:16 | mut file | test.rs:608:18:608:31 | file.read_u8() [future, Ok] | provenance | MaD:71 |
-| test.rs:581:9:581:16 | mut file | test.rs:609:18:609:32 | file.read_i16() [future, Ok] | provenance | MaD:67 |
-| test.rs:581:9:581:16 | mut file | test.rs:610:18:610:32 | file.read_f32() [future, Ok] | provenance | MaD:66 |
-| test.rs:581:9:581:16 | mut file | test.rs:611:18:611:35 | file.read_i64_le() [future, Ok] | provenance | MaD:68 |
-| test.rs:581:9:581:16 | mut file | test.rs:620:23:620:33 | [post] &mut buffer [&ref] | provenance | MaD:64 |
-| test.rs:581:20:581:40 | ...::open | test.rs:581:20:581:52 | ...::open(...) [future, Ok] | provenance | Src:MaD:9 |
+| test.rs:581:9:581:16 | mut file | test.rs:585:32:585:42 | [post] &mut buffer [&ref] | provenance | MaD:65 |
+| test.rs:581:9:581:16 | mut file | test.rs:591:39:591:49 | [post] &mut buffer [&ref] | provenance | MaD:71 |
+| test.rs:581:9:581:16 | mut file | test.rs:597:42:597:52 | [post] &mut buffer [&ref] | provenance | MaD:72 |
+| test.rs:581:9:581:16 | mut file | test.rs:603:25:603:35 | [post] &mut buffer [&ref] | provenance | MaD:67 |
+| test.rs:581:9:581:16 | mut file | test.rs:608:18:608:31 | file.read_u8() [future, Ok] | provenance | MaD:73 |
+| test.rs:581:9:581:16 | mut file | test.rs:609:18:609:32 | file.read_i16() [future, Ok] | provenance | MaD:69 |
+| test.rs:581:9:581:16 | mut file | test.rs:610:18:610:32 | file.read_f32() [future, Ok] | provenance | MaD:68 |
+| test.rs:581:9:581:16 | mut file | test.rs:611:18:611:35 | file.read_i64_le() [future, Ok] | provenance | MaD:70 |
+| test.rs:581:9:581:16 | mut file | test.rs:620:23:620:33 | [post] &mut buffer [&ref] | provenance | MaD:66 |
+| test.rs:581:20:581:40 | ...::open | test.rs:581:20:581:52 | ...::open(...) [future, Ok] | provenance | Src:MaD:11 |
| test.rs:581:20:581:52 | ...::open(...) [future, Ok] | test.rs:581:20:581:58 | await ... [Ok] | provenance | |
| test.rs:581:20:581:58 | await ... [Ok] | test.rs:581:20:581:59 | TryExpr | provenance | |
| test.rs:581:20:581:59 | TryExpr | test.rs:581:9:581:16 | mut file | provenance | |
@@ -635,17 +637,39 @@ edges
| test.rs:620:23:620:33 | [post] &mut buffer [&ref] | test.rs:620:28:620:33 | [post] buffer | provenance | |
| test.rs:620:28:620:33 | [post] buffer | test.rs:621:15:621:20 | buffer | provenance | |
| test.rs:621:15:621:20 | buffer | test.rs:621:14:621:20 | &buffer | provenance | |
-| test.rs:627:13:627:18 | mut f1 | test.rs:629:30:629:40 | [post] &mut buffer [&ref] | provenance | MaD:63 |
+| test.rs:627:13:627:18 | mut f1 | test.rs:629:30:629:40 | [post] &mut buffer [&ref] | provenance | MaD:65 |
| test.rs:627:22:627:65 | ... .open(...) [future, Ok] | test.rs:627:22:627:71 | await ... [Ok] | provenance | |
| test.rs:627:22:627:71 | await ... [Ok] | test.rs:627:22:627:72 | TryExpr | provenance | |
| test.rs:627:22:627:72 | TryExpr | test.rs:627:13:627:18 | mut f1 | provenance | |
-| test.rs:627:52:627:55 | open | test.rs:627:22:627:65 | ... .open(...) [future, Ok] | provenance | Src:MaD:10 |
+| test.rs:627:52:627:55 | open | test.rs:627:22:627:65 | ... .open(...) [future, Ok] | provenance | Src:MaD:12 |
| test.rs:629:30:629:40 | [post] &mut buffer [&ref] | test.rs:629:35:629:40 | [post] buffer | provenance | |
| test.rs:629:35:629:40 | [post] buffer | test.rs:630:15:630:20 | buffer | provenance | |
| test.rs:630:15:630:20 | buffer | test.rs:630:14:630:20 | &buffer | provenance | |
-| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:53 |
-| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:111 |
-| test.rs:688:26:688:53 | ...::connect | test.rs:688:26:688:62 | ...::connect(...) [Ok] | provenance | Src:MaD:7 |
+| test.rs:660:9:660:16 | mut file | test.rs:664:22:664:25 | file | provenance | |
+| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:44 |
+| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:45 |
+| test.rs:660:20:660:44 | ...::open | test.rs:660:20:660:56 | ...::open(...) [future, Ok] | provenance | Src:MaD:1 |
+| test.rs:660:20:660:56 | ...::open(...) [future, Ok] | test.rs:660:20:660:62 | await ... [Ok] | provenance | |
+| test.rs:660:20:660:62 | await ... [Ok] | test.rs:660:20:660:63 | TryExpr | provenance | |
+| test.rs:660:20:660:63 | TryExpr | test.rs:660:9:660:16 | mut file | provenance | |
+| test.rs:664:22:664:25 | file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:44 |
+| test.rs:664:32:664:42 | [post] &mut buffer [&ref] | test.rs:664:37:664:42 | [post] buffer | provenance | |
+| test.rs:664:37:664:42 | [post] buffer | test.rs:665:15:665:20 | buffer | provenance | |
+| test.rs:665:15:665:20 | buffer | test.rs:665:14:665:20 | &buffer | provenance | |
+| test.rs:671:13:671:18 | mut f1 | test.rs:673:22:673:23 | f1 | provenance | |
+| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:44 |
+| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:45 |
+| test.rs:671:22:671:69 | ... .open(...) [future, Ok] | test.rs:671:22:671:75 | await ... [Ok] | provenance | |
+| test.rs:671:22:671:75 | await ... [Ok] | test.rs:671:22:671:76 | TryExpr | provenance | |
+| test.rs:671:22:671:76 | TryExpr | test.rs:671:13:671:18 | mut f1 | provenance | |
+| test.rs:671:56:671:59 | open | test.rs:671:22:671:69 | ... .open(...) [future, Ok] | provenance | Src:MaD:2 |
+| test.rs:673:22:673:23 | f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:44 |
+| test.rs:673:30:673:40 | [post] &mut buffer [&ref] | test.rs:673:35:673:40 | [post] buffer | provenance | |
+| test.rs:673:35:673:40 | [post] buffer | test.rs:674:15:674:20 | buffer | provenance | |
+| test.rs:674:15:674:20 | buffer | test.rs:674:14:674:20 | &buffer | provenance | |
+| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:55 |
+| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:113 |
+| test.rs:688:26:688:53 | ...::connect | test.rs:688:26:688:62 | ...::connect(...) [Ok] | provenance | Src:MaD:9 |
| test.rs:688:26:688:62 | ...::connect(...) [Ok] | test.rs:688:26:688:63 | TryExpr | provenance | |
| test.rs:688:26:688:63 | TryExpr | test.rs:688:13:688:22 | mut stream | provenance | |
| test.rs:695:29:695:39 | [post] &mut buffer [&ref] | test.rs:695:34:695:39 | [post] buffer | provenance | |
@@ -653,21 +677,21 @@ edges
| test.rs:695:34:695:39 | [post] buffer | test.rs:699:14:699:22 | buffer[0] | provenance | |
| test.rs:698:15:698:20 | buffer | test.rs:698:14:698:20 | &buffer | provenance | |
| test.rs:707:13:707:22 | mut stream | test.rs:715:58:715:63 | stream | provenance | |
-| test.rs:707:26:707:61 | ...::connect_timeout | test.rs:707:26:707:105 | ...::connect_timeout(...) [Ok] | provenance | Src:MaD:8 |
+| test.rs:707:26:707:61 | ...::connect_timeout | test.rs:707:26:707:105 | ...::connect_timeout(...) [Ok] | provenance | Src:MaD:10 |
| test.rs:707:26:707:105 | ...::connect_timeout(...) [Ok] | test.rs:707:26:707:106 | TryExpr | provenance | |
| test.rs:707:26:707:106 | TryExpr | test.rs:707:13:707:22 | mut stream | provenance | |
-| test.rs:715:21:715:30 | mut reader | test.rs:718:44:718:52 | [post] &mut line [&ref] | provenance | MaD:47 |
-| test.rs:715:34:715:64 | ...::new(...) | test.rs:715:34:715:74 | ... .take(...) | provenance | MaD:57 |
+| test.rs:715:21:715:30 | mut reader | test.rs:718:44:718:52 | [post] &mut line [&ref] | provenance | MaD:49 |
+| test.rs:715:34:715:64 | ...::new(...) | test.rs:715:34:715:74 | ... .take(...) | provenance | MaD:59 |
| test.rs:715:34:715:74 | ... .take(...) | test.rs:715:21:715:30 | mut reader | provenance | |
-| test.rs:715:58:715:63 | stream | test.rs:715:34:715:64 | ...::new(...) | provenance | MaD:101 |
+| test.rs:715:58:715:63 | stream | test.rs:715:34:715:64 | ...::new(...) | provenance | MaD:103 |
| test.rs:718:44:718:52 | [post] &mut line [&ref] | test.rs:718:49:718:52 | [post] line | provenance | |
| test.rs:718:49:718:52 | [post] line | test.rs:725:35:725:38 | line | provenance | |
| test.rs:725:35:725:38 | line | test.rs:725:34:725:38 | &line | provenance | |
-| test.rs:759:9:759:24 | mut tokio_stream | test.rs:767:35:767:46 | [post] &mut buffer1 [&ref] | provenance | MaD:117 |
-| test.rs:759:9:759:24 | mut tokio_stream | test.rs:771:36:771:47 | [post] &mut buffer2 [&ref] | provenance | MaD:63 |
-| test.rs:759:9:759:24 | mut tokio_stream | test.rs:787:41:787:51 | [post] &mut buffer [&ref] | provenance | MaD:118 |
-| test.rs:759:9:759:24 | mut tokio_stream | test.rs:810:45:810:55 | [post] &mut buffer [&ref] | provenance | MaD:119 |
-| test.rs:759:28:759:57 | ...::connect | test.rs:759:28:759:66 | ...::connect(...) [future, Ok] | provenance | Src:MaD:13 |
+| test.rs:759:9:759:24 | mut tokio_stream | test.rs:767:35:767:46 | [post] &mut buffer1 [&ref] | provenance | MaD:119 |
+| test.rs:759:9:759:24 | mut tokio_stream | test.rs:771:36:771:47 | [post] &mut buffer2 [&ref] | provenance | MaD:65 |
+| test.rs:759:9:759:24 | mut tokio_stream | test.rs:787:41:787:51 | [post] &mut buffer [&ref] | provenance | MaD:120 |
+| test.rs:759:9:759:24 | mut tokio_stream | test.rs:810:45:810:55 | [post] &mut buffer [&ref] | provenance | MaD:121 |
+| test.rs:759:28:759:57 | ...::connect | test.rs:759:28:759:66 | ...::connect(...) [future, Ok] | provenance | Src:MaD:15 |
| test.rs:759:28:759:66 | ...::connect(...) [future, Ok] | test.rs:759:28:759:72 | await ... [Ok] | provenance | |
| test.rs:759:28:759:72 | await ... [Ok] | test.rs:759:28:759:73 | TryExpr | provenance | |
| test.rs:759:28:759:73 | TryExpr | test.rs:759:9:759:24 | mut tokio_stream | provenance | |
@@ -687,7 +711,7 @@ edges
| test.rs:817:27:817:32 | buffer | test.rs:817:26:817:32 | &buffer | provenance | |
| test_futures_io.rs:19:9:19:11 | tcp | test_futures_io.rs:20:11:20:13 | tcp | provenance | |
| test_futures_io.rs:19:9:19:11 | tcp | test_futures_io.rs:26:53:26:55 | tcp | provenance | |
-| test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:19:15:19:37 | ...::connect(...) [future, Ok] | provenance | Src:MaD:1 |
+| test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:19:15:19:37 | ...::connect(...) [future, Ok] | provenance | Src:MaD:3 |
| test_futures_io.rs:19:15:19:37 | ...::connect(...) [future, Ok] | test_futures_io.rs:19:15:19:43 | await ... [Ok] | provenance | |
| test_futures_io.rs:19:15:19:43 | await ... [Ok] | test_futures_io.rs:19:15:19:44 | TryExpr | provenance | |
| test_futures_io.rs:19:15:19:44 | TryExpr | test_futures_io.rs:19:9:19:11 | tcp | provenance | |
@@ -696,13 +720,13 @@ edges
| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:32:40:32:45 | reader | provenance | |
| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:45:64:45:69 | reader | provenance | |
| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:27:49:32 | reader | provenance | |
-| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:42 |
-| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:43 |
+| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:44 |
+| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:45 |
| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:54:51:54:56 | reader | provenance | |
| test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | test_futures_io.rs:26:22:26:62 | await ... [Ok] | provenance | |
| test_futures_io.rs:26:22:26:62 | await ... [Ok] | test_futures_io.rs:26:22:26:63 | TryExpr | provenance | |
| test_futures_io.rs:26:22:26:63 | TryExpr | test_futures_io.rs:26:9:26:18 | mut reader | provenance | |
-| test_futures_io.rs:26:53:26:55 | tcp | test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | provenance | MaD:84 |
+| test_futures_io.rs:26:53:26:55 | tcp | test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | provenance | MaD:86 |
| test_futures_io.rs:27:11:27:16 | reader | test_futures_io.rs:27:10:27:16 | &reader | provenance | |
| test_futures_io.rs:32:13:32:22 | mut pinned | test_futures_io.rs:33:15:33:20 | pinned | provenance | |
| test_futures_io.rs:32:13:32:22 | mut pinned [&ref] | test_futures_io.rs:33:15:33:20 | pinned [&ref] | provenance | |
@@ -710,56 +734,56 @@ edges
| test_futures_io.rs:32:26:32:46 | ...::new(...) | test_futures_io.rs:32:13:32:22 | mut pinned | provenance | |
| test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | test_futures_io.rs:32:13:32:22 | mut pinned [&ref] | provenance | |
| test_futures_io.rs:32:26:32:46 | ...::new(...) [Pin, &ref] | test_futures_io.rs:32:13:32:22 | mut pinned [Pin, &ref] | provenance | |
-| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) | provenance | MaD:76 |
-| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | provenance | MaD:78 |
-| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [Pin, &ref] | provenance | MaD:77 |
+| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) | provenance | MaD:78 |
+| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | provenance | MaD:80 |
+| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [Pin, &ref] | provenance | MaD:79 |
| test_futures_io.rs:32:40:32:45 | reader | test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | provenance | |
| test_futures_io.rs:33:15:33:20 | pinned | test_futures_io.rs:33:14:33:20 | &pinned | provenance | |
| test_futures_io.rs:33:15:33:20 | pinned [&ref] | test_futures_io.rs:33:14:33:20 | &pinned | provenance | |
| test_futures_io.rs:33:15:33:20 | pinned [Pin, &ref] | test_futures_io.rs:33:14:33:20 | &pinned | provenance | |
-| test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | provenance | MaD:42 |
+| test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | provenance | MaD:44 |
| test_futures_io.rs:45:64:45:69 | reader | test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | provenance | |
| test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | test_futures_io.rs:45:77:45:83 | [post] buffer1 | provenance | |
| test_futures_io.rs:45:77:45:83 | [post] buffer1 | test_futures_io.rs:46:15:46:36 | buffer1[...] | provenance | |
| test_futures_io.rs:46:15:46:36 | buffer1[...] | test_futures_io.rs:46:14:46:36 | &... | provenance | |
-| test_futures_io.rs:49:27:49:32 | reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:42 |
+| test_futures_io.rs:49:27:49:32 | reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:44 |
| test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | test_futures_io.rs:49:44:49:50 | [post] buffer2 | provenance | |
| test_futures_io.rs:49:44:49:50 | [post] buffer2 | test_futures_io.rs:51:15:51:36 | buffer2[...] | provenance | |
| test_futures_io.rs:51:15:51:36 | buffer2[...] | test_futures_io.rs:51:14:51:36 | &... | provenance | |
| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:55:11:55:17 | reader2 | provenance | |
| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:59:40:59:46 | reader2 | provenance | |
| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:69:37:69:43 | reader2 | provenance | |
-| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:83:22:83:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:37 |
+| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:83:22:83:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:39 |
| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:90:40:90:46 | reader2 | provenance | |
| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:103:64:103:70 | reader2 | provenance | |
| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:27:107:33 | reader2 | provenance | |
-| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:42 |
-| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:43 |
+| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:44 |
+| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:45 |
| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:113:40:113:46 | reader2 | provenance | |
-| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:125:22:125:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:37 |
+| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:125:22:125:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:39 |
| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:27:132:33 | reader2 | provenance | |
-| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:40 |
-| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:41 |
+| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:42 |
+| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:43 |
| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:27:139:33 | reader2 | provenance | |
-| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:38 |
-| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:39 |
+| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:40 |
+| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:41 |
| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:27:146:33 | reader2 | provenance | |
-| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:44 |
-| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:45 |
+| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:46 |
+| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:47 |
| test_futures_io.rs:54:23:54:57 | ...::new(...) | test_futures_io.rs:54:9:54:19 | mut reader2 | provenance | |
-| test_futures_io.rs:54:51:54:56 | reader | test_futures_io.rs:54:23:54:57 | ...::new(...) | provenance | MaD:85 |
+| test_futures_io.rs:54:51:54:56 | reader | test_futures_io.rs:54:23:54:57 | ...::new(...) | provenance | MaD:87 |
| test_futures_io.rs:55:11:55:17 | reader2 | test_futures_io.rs:55:10:55:17 | &reader2 | provenance | |
| test_futures_io.rs:59:13:59:22 | mut pinned | test_futures_io.rs:60:15:60:20 | pinned | provenance | |
-| test_futures_io.rs:59:13:59:22 | mut pinned | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 |
+| test_futures_io.rs:59:13:59:22 | mut pinned | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 |
| test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | test_futures_io.rs:60:15:60:20 | pinned [&ref] | provenance | |
-| test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 |
+| test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 |
| test_futures_io.rs:59:13:59:22 | mut pinned [Pin, &ref] | test_futures_io.rs:60:15:60:20 | pinned [Pin, &ref] | provenance | |
| test_futures_io.rs:59:26:59:47 | ...::new(...) | test_futures_io.rs:59:13:59:22 | mut pinned | provenance | |
| test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | provenance | |
| test_futures_io.rs:59:26:59:47 | ...::new(...) [Pin, &ref] | test_futures_io.rs:59:13:59:22 | mut pinned [Pin, &ref] | provenance | |
-| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) | provenance | MaD:76 |
-| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | provenance | MaD:78 |
-| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [Pin, &ref] | provenance | MaD:77 |
+| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) | provenance | MaD:78 |
+| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | provenance | MaD:80 |
+| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [Pin, &ref] | provenance | MaD:79 |
| test_futures_io.rs:59:40:59:46 | reader2 | test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | provenance | |
| test_futures_io.rs:60:15:60:20 | pinned | test_futures_io.rs:60:14:60:20 | &pinned | provenance | |
| test_futures_io.rs:60:15:60:20 | pinned [&ref] | test_futures_io.rs:60:14:60:20 | &pinned | provenance | |
@@ -772,11 +796,11 @@ edges
| test_futures_io.rs:63:31:63:33 | buf | test_futures_io.rs:65:18:65:20 | buf | provenance | |
| test_futures_io.rs:64:19:64:24 | buffer [Ready, Ok] | test_futures_io.rs:64:18:64:24 | &buffer | provenance | |
| test_futures_io.rs:69:13:69:19 | buffer2 [Ready, Ok] | test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | provenance | |
-| test_futures_io.rs:69:23:69:44 | ...::new(...) | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 |
-| test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 |
+| test_futures_io.rs:69:23:69:44 | ...::new(...) | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 |
+| test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 |
| test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | test_futures_io.rs:69:13:69:19 | buffer2 [Ready, Ok] | provenance | |
-| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) | provenance | MaD:76 |
-| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | provenance | MaD:78 |
+| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) | provenance | MaD:78 |
+| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | provenance | MaD:80 |
| test_futures_io.rs:69:37:69:43 | reader2 | test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | provenance | |
| test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | test_futures_io.rs:71:13:71:32 | ...::Ready(...) [Ready, Ok] | provenance | |
| test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | test_futures_io.rs:72:23:72:29 | buffer2 [Ready, Ok] | provenance | |
@@ -794,33 +818,33 @@ edges
| test_futures_io.rs:90:26:90:47 | ...::new(...) | test_futures_io.rs:90:13:90:22 | mut pinned | provenance | |
| test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | test_futures_io.rs:90:13:90:22 | mut pinned [&ref] | provenance | |
| test_futures_io.rs:90:26:90:47 | ...::new(...) [Pin, &ref] | test_futures_io.rs:90:13:90:22 | mut pinned [Pin, &ref] | provenance | |
-| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) | provenance | MaD:76 |
-| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | provenance | MaD:78 |
-| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [Pin, &ref] | provenance | MaD:77 |
+| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) | provenance | MaD:78 |
+| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | provenance | MaD:80 |
+| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [Pin, &ref] | provenance | MaD:79 |
| test_futures_io.rs:90:40:90:46 | reader2 | test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | provenance | |
| test_futures_io.rs:91:15:91:20 | pinned | test_futures_io.rs:91:14:91:20 | &pinned | provenance | |
| test_futures_io.rs:91:15:91:20 | pinned [&ref] | test_futures_io.rs:91:14:91:20 | &pinned | provenance | |
| test_futures_io.rs:91:15:91:20 | pinned [Pin, &ref] | test_futures_io.rs:91:14:91:20 | &pinned | provenance | |
-| test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | provenance | MaD:42 |
+| test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | provenance | MaD:44 |
| test_futures_io.rs:103:64:103:70 | reader2 | test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | provenance | |
| test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | test_futures_io.rs:103:78:103:84 | [post] buffer1 | provenance | |
| test_futures_io.rs:103:78:103:84 | [post] buffer1 | test_futures_io.rs:104:15:104:36 | buffer1[...] | provenance | |
| test_futures_io.rs:104:15:104:36 | buffer1[...] | test_futures_io.rs:104:14:104:36 | &... | provenance | |
-| test_futures_io.rs:107:27:107:33 | reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:42 |
+| test_futures_io.rs:107:27:107:33 | reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:44 |
| test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | test_futures_io.rs:107:45:107:51 | [post] buffer2 | provenance | |
| test_futures_io.rs:107:45:107:51 | [post] buffer2 | test_futures_io.rs:108:15:108:36 | buffer2[...] | provenance | |
| test_futures_io.rs:108:15:108:36 | buffer2[...] | test_futures_io.rs:108:14:108:36 | &... | provenance | |
| test_futures_io.rs:113:13:113:22 | mut pinned | test_futures_io.rs:114:15:114:20 | pinned | provenance | |
-| test_futures_io.rs:113:13:113:22 | mut pinned | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 |
+| test_futures_io.rs:113:13:113:22 | mut pinned | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 |
| test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | test_futures_io.rs:114:15:114:20 | pinned [&ref] | provenance | |
-| test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 |
+| test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 |
| test_futures_io.rs:113:13:113:22 | mut pinned [Pin, &ref] | test_futures_io.rs:114:15:114:20 | pinned [Pin, &ref] | provenance | |
| test_futures_io.rs:113:26:113:47 | ...::new(...) | test_futures_io.rs:113:13:113:22 | mut pinned | provenance | |
| test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | provenance | |
| test_futures_io.rs:113:26:113:47 | ...::new(...) [Pin, &ref] | test_futures_io.rs:113:13:113:22 | mut pinned [Pin, &ref] | provenance | |
-| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) | provenance | MaD:76 |
-| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | provenance | MaD:78 |
-| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [Pin, &ref] | provenance | MaD:77 |
+| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) | provenance | MaD:78 |
+| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | provenance | MaD:80 |
+| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [Pin, &ref] | provenance | MaD:79 |
| test_futures_io.rs:113:40:113:46 | reader2 | test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | provenance | |
| test_futures_io.rs:114:15:114:20 | pinned | test_futures_io.rs:114:14:114:20 | &pinned | provenance | |
| test_futures_io.rs:114:15:114:20 | pinned [&ref] | test_futures_io.rs:114:14:114:20 | &pinned | provenance | |
@@ -836,40 +860,40 @@ edges
| test_futures_io.rs:125:22:125:39 | reader2.fill_buf() [future, Ok] | test_futures_io.rs:125:22:125:45 | await ... [Ok] | provenance | |
| test_futures_io.rs:125:22:125:45 | await ... [Ok] | test_futures_io.rs:125:22:125:46 | TryExpr | provenance | |
| test_futures_io.rs:125:22:125:46 | TryExpr | test_futures_io.rs:125:13:125:18 | buffer | provenance | |
-| test_futures_io.rs:132:27:132:33 | reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:40 |
+| test_futures_io.rs:132:27:132:33 | reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:42 |
| test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | test_futures_io.rs:132:58:132:61 | [post] line | provenance | |
| test_futures_io.rs:132:58:132:61 | [post] line | test_futures_io.rs:133:15:133:18 | line | provenance | |
| test_futures_io.rs:133:15:133:18 | line | test_futures_io.rs:133:14:133:18 | &line | provenance | |
-| test_futures_io.rs:139:27:139:33 | reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:38 |
+| test_futures_io.rs:139:27:139:33 | reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:40 |
| test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | test_futures_io.rs:139:50:139:53 | [post] line | provenance | |
| test_futures_io.rs:139:50:139:53 | [post] line | test_futures_io.rs:140:15:140:18 | line | provenance | |
| test_futures_io.rs:140:15:140:18 | line | test_futures_io.rs:140:14:140:18 | &line | provenance | |
-| test_futures_io.rs:146:27:146:33 | reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:44 |
+| test_futures_io.rs:146:27:146:33 | reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:46 |
| test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | test_futures_io.rs:146:52:146:57 | [post] buffer | provenance | |
| test_futures_io.rs:146:52:146:57 | [post] buffer | test_futures_io.rs:147:15:147:20 | buffer | provenance | |
| test_futures_io.rs:147:15:147:20 | buffer | test_futures_io.rs:147:14:147:20 | &buffer | provenance | |
| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:14 | a | provenance | |
| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:14 | a | provenance | |
-| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:73 |
-| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:82 |
-| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:73 |
-| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:82 |
+| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:75 |
+| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:84 |
+| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:75 |
+| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:84 |
| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:14 | a | provenance | |
| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:14 | a | provenance | |
-| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:72 |
-| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:81 |
-| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:72 |
-| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:81 |
+| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:74 |
+| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:83 |
+| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:74 |
+| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:83 |
| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:15:14:15:14 | a | provenance | |
| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:15:14:15:14 | a | provenance | |
-| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:73 |
-| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:82 |
-| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:73 |
-| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:82 |
-| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:72 |
-| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:81 |
-| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:72 |
-| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:81 |
+| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:75 |
+| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:84 |
+| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:75 |
+| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:84 |
+| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:74 |
+| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:83 |
+| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:74 |
+| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:83 |
| web_frameworks.rs:68:15:68:15 | a | web_frameworks.rs:70:14:70:14 | a | provenance | |
| web_frameworks.rs:68:15:68:15 | a | web_frameworks.rs:70:14:70:14 | a | provenance | |
nodes
@@ -1437,6 +1461,26 @@ nodes
| test.rs:629:35:629:40 | [post] buffer | semmle.label | [post] buffer |
| test.rs:630:14:630:20 | &buffer | semmle.label | &buffer |
| test.rs:630:15:630:20 | buffer | semmle.label | buffer |
+| test.rs:660:9:660:16 | mut file | semmle.label | mut file |
+| test.rs:660:20:660:44 | ...::open | semmle.label | ...::open |
+| test.rs:660:20:660:56 | ...::open(...) [future, Ok] | semmle.label | ...::open(...) [future, Ok] |
+| test.rs:660:20:660:62 | await ... [Ok] | semmle.label | await ... [Ok] |
+| test.rs:660:20:660:63 | TryExpr | semmle.label | TryExpr |
+| test.rs:664:22:664:25 | file | semmle.label | file |
+| test.rs:664:32:664:42 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] |
+| test.rs:664:37:664:42 | [post] buffer | semmle.label | [post] buffer |
+| test.rs:665:14:665:20 | &buffer | semmle.label | &buffer |
+| test.rs:665:15:665:20 | buffer | semmle.label | buffer |
+| test.rs:671:13:671:18 | mut f1 | semmle.label | mut f1 |
+| test.rs:671:22:671:69 | ... .open(...) [future, Ok] | semmle.label | ... .open(...) [future, Ok] |
+| test.rs:671:22:671:75 | await ... [Ok] | semmle.label | await ... [Ok] |
+| test.rs:671:22:671:76 | TryExpr | semmle.label | TryExpr |
+| test.rs:671:56:671:59 | open | semmle.label | open |
+| test.rs:673:22:673:23 | f1 | semmle.label | f1 |
+| test.rs:673:30:673:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] |
+| test.rs:673:35:673:40 | [post] buffer | semmle.label | [post] buffer |
+| test.rs:674:14:674:20 | &buffer | semmle.label | &buffer |
+| test.rs:674:15:674:20 | buffer | semmle.label | buffer |
| test.rs:688:13:688:22 | mut stream | semmle.label | mut stream |
| test.rs:688:26:688:53 | ...::connect | semmle.label | ...::connect |
| test.rs:688:26:688:62 | ...::connect(...) [Ok] | semmle.label | ...::connect(...) [Ok] |
@@ -1738,6 +1782,8 @@ testFailures
| test.rs:615:14:615:15 | v4 | test.rs:581:20:581:40 | ...::open | test.rs:615:14:615:15 | v4 | $@ | test.rs:581:20:581:40 | ...::open | ...::open |
| test.rs:621:14:621:20 | &buffer | test.rs:581:20:581:40 | ...::open | test.rs:621:14:621:20 | &buffer | $@ | test.rs:581:20:581:40 | ...::open | ...::open |
| test.rs:630:14:630:20 | &buffer | test.rs:627:52:627:55 | open | test.rs:630:14:630:20 | &buffer | $@ | test.rs:627:52:627:55 | open | open |
+| test.rs:665:14:665:20 | &buffer | test.rs:660:20:660:44 | ...::open | test.rs:665:14:665:20 | &buffer | $@ | test.rs:660:20:660:44 | ...::open | ...::open |
+| test.rs:674:14:674:20 | &buffer | test.rs:671:56:671:59 | open | test.rs:674:14:674:20 | &buffer | $@ | test.rs:671:56:671:59 | open | open |
| test.rs:698:14:698:20 | &buffer | test.rs:688:26:688:53 | ...::connect | test.rs:698:14:698:20 | &buffer | $@ | test.rs:688:26:688:53 | ...::connect | ...::connect |
| test.rs:699:14:699:22 | buffer[0] | test.rs:688:26:688:53 | ...::connect | test.rs:699:14:699:22 | buffer[0] | $@ | test.rs:688:26:688:53 | ...::connect | ...::connect |
| test.rs:725:34:725:38 | &line | test.rs:707:26:707:61 | ...::connect_timeout | test.rs:725:34:725:38 | &line | $@ | test.rs:707:26:707:61 | ...::connect_timeout | ...::connect_timeout |
diff --git a/rust/ql/test/library-tests/dataflow/sources/test.rs b/rust/ql/test/library-tests/dataflow/sources/test.rs
index 6e30159ea1a..895a789cfaf 100644
--- a/rust/ql/test/library-tests/dataflow/sources/test.rs
+++ b/rust/ql/test/library-tests/dataflow/sources/test.rs
@@ -662,7 +662,7 @@ async fn test_async_std_file() -> std::io::Result<()> {
{
let mut buffer = [0u8; 100];
let _bytes = file.read(&mut buffer).await?;
- sink(&buffer); // $ MISSING: hasTaintFlow="file.txt"
+ sink(&buffer); // $ hasTaintFlow="file.txt"
}
// --- OpenOptions ---
@@ -671,7 +671,7 @@ async fn test_async_std_file() -> std::io::Result<()> {
let mut f1 = async_std::fs::OpenOptions::new().open("f1.txt").await?; // $ Alert[rust/summary/taint-sources]
let mut buffer = [0u8; 1024];
let _bytes = f1.read(&mut buffer).await?;
- sink(&buffer); // $ MISSING: hasTaintFlow="f1.txt"
+ sink(&buffer); // $ hasTaintFlow="f1.txt"
}
Ok(())
diff --git a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected
index d945cb4c6c2..7a3fd01dbc7 100644
--- a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected
+++ b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected
@@ -1,4 +1,3 @@
multipleCallTargets
| main.rs:124:9:124:11 | f(...) |
-| main.rs:774:5:774:7 | f(...) |
| proc_macro.rs:9:5:9:10 | ...::new(...) |
diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs
index db8e4c0f39d..5146373b896 100644
--- a/rust/ql/test/library-tests/path-resolution/main.rs
+++ b/rust/ql/test/library-tests/path-resolution/main.rs
@@ -771,7 +771,7 @@ fn main() {
my::nested::nested1::nested2::f(); // $ item=I4
my::f(); // $ item=I38
nested2::nested3::nested4::f(); // $ item=I12
- f(); // $ item=I12 $ SPURIOUS: item=I119
+ f(); // $ item=I12
g(); // $ item=I13
crate::h(); // $ item=I25
m1::m2::g(); // $ item=I19
diff --git a/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs b/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs
index e2d413841c3..b459ca05aa6 100644
--- a/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs
+++ b/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs
@@ -7,4 +7,4 @@ pub fn f() {
use super::super::h; // $ item=I25
use super::g; // $ item=I9
-use super::nested6_f; // $ MISSING: item=I116
+use super::nested6_f; // $ item=I116
diff --git a/rust/ql/test/library-tests/path-resolution/path-resolution.expected b/rust/ql/test/library-tests/path-resolution/path-resolution.expected
index 8f12af96c02..067365a5386 100644
--- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected
+++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected
@@ -361,7 +361,6 @@ resolvePath
| main.rs:773:5:773:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
| main.rs:773:5:773:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
| main.rs:774:5:774:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
-| main.rs:774:5:774:5 | f | my2/nested2.rs:23:9:25:9 | fn f |
| main.rs:775:5:775:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
| main.rs:776:5:776:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) |
| main.rs:776:5:776:12 | ...::h | main.rs:56:1:75:1 | fn h |
@@ -440,6 +439,7 @@ resolvePath
| my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:23:34 | SourceFile |
| my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g |
| my2/my3/mod.rs:10:5:10:9 | super | my2/mod.rs:1:1:23:34 | SourceFile |
+| my2/my3/mod.rs:10:5:10:20 | ...::nested6_f | my2/nested2.rs:15:9:17:9 | fn f |
| my.rs:3:5:3:10 | nested | my.rs:1:1:1:15 | mod nested |
| my.rs:3:5:3:13 | ...::g | my/nested.rs:19:1:22:1 | fn g |
| my.rs:11:5:11:5 | g | my/nested.rs:19:1:22:1 | fn g |
From a6c1ffc45d1c6bec8f01e55f5b4ac6989fd2a236 Mon Sep 17 00:00:00 2001
From: Philip Ginsbach
Date: Fri, 19 Sep 2025 10:39:36 +0100
Subject: [PATCH 038/160] sort the annotations alphabetically
---
.../ql-language-reference/annotations.rst | 6 +-
.../ql-language-specification.rst | 62 +++++++++----------
2 files changed, 34 insertions(+), 34 deletions(-)
diff --git a/docs/codeql/ql-language-reference/annotations.rst b/docs/codeql/ql-language-reference/annotations.rst
index 0ddb28c3a9d..00080087d36 100644
--- a/docs/codeql/ql-language-reference/annotations.rst
+++ b/docs/codeql/ql-language-reference/annotations.rst
@@ -16,9 +16,9 @@ For example, to declare a module ``M`` as private, you could use:
}
Note that some annotations act on an entity itself, whilst others act on a particular *name* for the entity:
- - Act on an **entity**: ``abstract``, ``cached``, ``external``, ``transient``, ``override``, ``pragma``, ``language``,
- and ``bindingset``
- - Act on a **name**: ``deprecated``, ``library``, ``private``, ``final``, and ``query``
+ - Act on an **entity**: ``abstract``, ``bindingset``, ``cached``, ``external``, ``language``,
+ ``override``, ``pragma``, and ``transient``
+ - Act on a **name**: ``deprecated``, ``final``, ``library``, ``private``, and ``query``
For example, if you annotate an entity with ``private``, then only that particular name is
private. You could still access that entity under a different name (using an :ref:`alias `).
diff --git a/docs/codeql/ql-language-reference/ql-language-specification.rst b/docs/codeql/ql-language-reference/ql-language-specification.rst
index 9989c73e5dc..854c9f28f60 100644
--- a/docs/codeql/ql-language-reference/ql-language-specification.rst
+++ b/docs/codeql/ql-language-reference/ql-language-specification.rst
@@ -761,17 +761,17 @@ Various kinds of syntax can have *annotations* applied to them. Annotations are
annotation ::= simpleAnnotation | argsAnnotation
simpleAnnotation ::= "abstract"
- | "cached"
- | "external"
- | "extensible"
- | "final"
- | "transient"
- | "library"
- | "private"
- | "deprecated"
- | "override"
| "additional"
+ | "cached"
+ | "deprecated"
+ | "extensible"
+ | "external"
+ | "final"
+ | "library"
+ | "override"
+ | "private"
| "query"
+ | "transient"
argsAnnotation ::= "pragma" "[" ("inline" | "inline_late" | "noinline" | "nomagic" | "noopt" | "assume_small_delta") "]"
| "language" "[" "monotonicAggregates" "]"
@@ -791,28 +791,28 @@ The following table summarizes the syntactic constructs which can be marked with
+================+=========+============+===================+=======================+=========+========+=========+=========+============+
| ``abstract`` | yes | | yes | | | | | | |
+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
+| ``additional`` | yes | | | yes | | | yes | yes | yes |
++----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
| ``cached`` | yes | yes | yes | yes | | | yes | | |
+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
-| ``external`` | | | | yes | | | | | |
-+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
-| ``extensible`` | | | | yes | | | | | |
-+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
-| ``final`` | yes | | yes | | | yes | | (yes) | |
-+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
-| ``transient`` | | | | yes | | | | | |
-+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
-| ``library`` | (yes) | | | | | | | | |
-+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
-| ``private`` | yes | | yes | yes | yes | yes | yes | yes | yes |
-+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
| ``deprecated`` | yes | | yes | yes | yes | yes | yes | yes | yes |
+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
+| ``extensible`` | | | | yes | | | | | |
++----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
+| ``external`` | | | | yes | | | | | |
++----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
+| ``final`` | yes | | yes | | | yes | | (yes) | |
++----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
+| ``library`` | (yes) | | | | | | | | |
++----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
| ``override`` | | | yes | | | yes | | | |
+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
-| ``additional`` | yes | | | yes | | | yes | yes | yes |
+| ``private`` | yes | | yes | yes | yes | yes | yes | yes | yes |
+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
| ``query`` | | | | yes | | | | yes | |
+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
+| ``transient`` | | | | yes | | | | | |
++----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+
The ``library`` annotation is only usable within a QLL file, not a QL file.
The ``final`` annotation is usable on type aliases, but not on module aliases and predicate aliases.
@@ -2292,17 +2292,17 @@ The complete grammar for QL is as follows:
annotation ::= simpleAnnotation | argsAnnotation
simpleAnnotation ::= "abstract"
- | "cached"
- | "external"
- | "extensible"
- | "final"
- | "transient"
- | "library"
- | "private"
- | "deprecated"
- | "override"
| "additional"
+ | "cached"
+ | "deprecated"
+ | "extensible"
+ | "external"
+ | "final"
+ | "library"
+ | "override"
+ | "private"
| "query"
+ | "transient"
argsAnnotation ::= "pragma" "[" ("inline" | "inline_late" | "noinline" | "nomagic" | "noopt" | "assume_small_delta") "]"
| "language" "[" "monotonicAggregates" "]"
From b27d3745781d0362ec42dfb384d1d21c296bdb05 Mon Sep 17 00:00:00 2001
From: Philip Ginsbach
Date: Fri, 19 Sep 2025 10:41:52 +0100
Subject: [PATCH 039/160] mention 'additional' and 'extensible' annotations
---
docs/codeql/ql-language-reference/annotations.rst | 4 ++--
.../ql-language-reference/ql-language-specification.rst | 5 +++--
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/docs/codeql/ql-language-reference/annotations.rst b/docs/codeql/ql-language-reference/annotations.rst
index 00080087d36..cffbbf73c71 100644
--- a/docs/codeql/ql-language-reference/annotations.rst
+++ b/docs/codeql/ql-language-reference/annotations.rst
@@ -16,9 +16,9 @@ For example, to declare a module ``M`` as private, you could use:
}
Note that some annotations act on an entity itself, whilst others act on a particular *name* for the entity:
- - Act on an **entity**: ``abstract``, ``bindingset``, ``cached``, ``external``, ``language``,
+ - Act on an **entity**: ``abstract``, ``bindingset``, ``cached``, ``extensible``, ``external``, ``language``,
``override``, ``pragma``, and ``transient``
- - Act on a **name**: ``deprecated``, ``final``, ``library``, ``private``, and ``query``
+ - Act on a **name**: ``additional``, ``deprecated``, ``final``, ``library``, ``private``, and ``query``
For example, if you annotate an entity with ``private``, then only that particular name is
private. You could still access that entity under a different name (using an :ref:`alias `).
diff --git a/docs/codeql/ql-language-reference/ql-language-specification.rst b/docs/codeql/ql-language-reference/ql-language-specification.rst
index 854c9f28f60..f834949c3cd 100644
--- a/docs/codeql/ql-language-reference/ql-language-specification.rst
+++ b/docs/codeql/ql-language-reference/ql-language-specification.rst
@@ -933,7 +933,8 @@ A predicate definition adds a mapping from the predicate name and arity to the p
When a predicate is a top-level clause in a module, it is called a non-member predicate. See below for "`Member predicates <#member-predicates>`__."
-A valid non-member predicate can be annotated with ``cached``, ``deprecated``, ``external``, ``transient``, ``private``, and ``query``. Note, the ``transient`` annotation can only be applied if the non-member predicate is also annotated with ``external``.
+A valid non-member predicate can be annotated with ``additional``, ``cached``, ``deprecated``, ``extensible``, ``external``, ``transient``, ``private``, and ``query``.
+Note, the ``transient`` annotation can only be applied if the non-member predicate is also annotated with ``external``.
The head of the predicate gives a name, an optional *result type*, and a sequence of variables declarations that are *arguments*:
@@ -979,7 +980,7 @@ A class type is said to *final inherit* from base types that are final or refere
A class adds a mapping from the class name to the class declaration to the current module's declared type environment.
-A valid class can be annotated with ``abstract``, ``final``, ``library``, and ``private``. Any other annotation renders the class invalid.
+A valid class can be annotated with ``abstract``, ``additional``, ``final``, ``library``, and ``private``. Any other annotation renders the class invalid.
A valid class may not inherit from itself, or from more than one primitive type. The set of types that a valid class inherits from must be disjoint from the set of types that it final inherits from.
From c7a9cc5a424c80dc4a3c538d20f934ad4d5f44c7 Mon Sep 17 00:00:00 2001
From: Simon Friis Vindum
Date: Wed, 17 Sep 2025 14:55:52 +0200
Subject: [PATCH 040/160] Rust: Use annotations also for items in macro
expansions
---
.../lib/utils/test/PathResolutionInlineExpectationsTest.qll | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll b/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll
index c5a95ac9038..8d2fdb2d2eb 100644
--- a/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll
+++ b/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll
@@ -25,9 +25,9 @@ private module ResolveTest implements TestSig {
private predicate item(ItemNode i, string value) {
exists(string filepath, int line, boolean inMacro | itemAt(i, filepath, line, inMacro) |
- commmentAt(value, filepath, line) and inMacro = false
+ commmentAt(value, filepath, line)
or
- not (commmentAt(_, filepath, line) and inMacro = false) and
+ not commmentAt(_, filepath, line) and
value = i.getName()
)
}
From 32365fd673e0520ae10cea12212adfd3e98d0b6e Mon Sep 17 00:00:00 2001
From: Simon Friis Vindum
Date: Wed, 17 Sep 2025 15:15:29 +0200
Subject: [PATCH 041/160] Rust: Account for attribute expansions in path
resolution
---
rust/ql/lib/codeql/rust/internal/PathResolution.qll | 11 ++++++-----
rust/ql/test/library-tests/path-resolution/main.rs | 7 +++----
.../path-resolution/path-resolution.expected | 10 ++++++----
3 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll
index f819632ce10..980033811dd 100644
--- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll
+++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll
@@ -156,6 +156,11 @@ private ItemNode getAChildSuccessor(ItemNode item, string name, SuccessorKind ki
* - https://doc.rust-lang.org/reference/names/namespaces.html
*/
abstract class ItemNode extends Locatable {
+ ItemNode() {
+ // Exclude items that are superceded by the expansion of an attribute macro.
+ not this.(Item).hasAttributeMacroExpansion()
+ }
+
/** Gets the (original) name of this item. */
abstract string getName();
@@ -660,11 +665,7 @@ final class ImplItemNode extends ImplOrTraitItemNode instanceof Impl {
override Visibility getVisibility() { result = Impl.super.getVisibility() }
- TypeParamItemNode getBlanketImplementationTypeParam() {
- result = this.resolveSelfTy() and
- // This impl block is not superseded by the expansion of an attribute macro.
- not exists(super.getAttributeMacroExpansion())
- }
+ TypeParamItemNode getBlanketImplementationTypeParam() { result = this.resolveSelfTy() }
/**
* Holds if this impl block is a blanket implementation. That is, the
diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs
index 5146373b896..1ad55d36ad4 100644
--- a/rust/ql/test/library-tests/path-resolution/main.rs
+++ b/rust/ql/test/library-tests/path-resolution/main.rs
@@ -798,8 +798,7 @@ fn main() {
m23::f(); // $ item=I108
m24::f(); // $ item=I121
zelf::h(); // $ item=I25
- z_changed(); // $ MISSING: item=I122
- AStruct::z_on_type(); // $ MISSING: item=I124
- AStruct {} // $ item=I123
- .z_on_instance(); // MISSING: item=I125
+ z_changed(); // $ item=I122
+ AStruct::z_on_type(); // $ item=I124
+ AStruct {}.z_on_instance(); // $ item=I123 item=I125
}
diff --git a/rust/ql/test/library-tests/path-resolution/path-resolution.expected b/rust/ql/test/library-tests/path-resolution/path-resolution.expected
index 067365a5386..7c30ebc4a1e 100644
--- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected
+++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected
@@ -66,7 +66,7 @@ resolvePath
| main.rs:36:17:36:21 | super | main.rs:24:5:42:5 | mod m2 |
| main.rs:36:17:36:24 | ...::f | main.rs:25:9:27:9 | fn f |
| main.rs:39:17:39:17 | f | main.rs:25:9:27:9 | fn f |
-| main.rs:46:9:46:13 | super | main.rs:1:1:805:2 | SourceFile |
+| main.rs:46:9:46:13 | super | main.rs:1:1:804:2 | SourceFile |
| main.rs:46:9:46:17 | ...::m1 | main.rs:19:1:43:1 | mod m1 |
| main.rs:46:9:46:21 | ...::m2 | main.rs:24:5:42:5 | mod m2 |
| main.rs:46:9:46:24 | ...::g | main.rs:29:9:33:9 | fn g |
@@ -78,7 +78,7 @@ resolvePath
| main.rs:67:17:67:19 | Foo | main.rs:65:9:65:21 | struct Foo |
| main.rs:70:13:70:15 | Foo | main.rs:59:5:59:17 | struct Foo |
| main.rs:72:5:72:5 | f | main.rs:61:5:68:5 | fn f |
-| main.rs:74:5:74:8 | self | main.rs:1:1:805:2 | SourceFile |
+| main.rs:74:5:74:8 | self | main.rs:1:1:804:2 | SourceFile |
| main.rs:74:5:74:11 | ...::i | main.rs:77:1:89:1 | fn i |
| main.rs:80:13:80:15 | Foo | main.rs:54:1:54:13 | struct Foo |
| main.rs:84:16:84:18 | i32 | {EXTERNAL LOCATION} | struct i32 |
@@ -93,7 +93,7 @@ resolvePath
| main.rs:93:57:93:66 | ...::g | my2/nested2.rs:7:9:9:9 | fn g |
| main.rs:93:80:93:86 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
| main.rs:106:5:106:22 | f_defined_in_macro | main.rs:105:18:105:42 | fn f_defined_in_macro |
-| main.rs:123:13:123:17 | super | main.rs:1:1:805:2 | SourceFile |
+| main.rs:123:13:123:17 | super | main.rs:1:1:804:2 | SourceFile |
| main.rs:123:13:123:21 | ...::m5 | main.rs:109:1:113:1 | mod m5 |
| main.rs:124:9:124:9 | f | main.rs:110:5:112:5 | fn f |
| main.rs:124:9:124:9 | f | main.rs:116:5:118:5 | fn f |
@@ -412,7 +412,9 @@ resolvePath
| main.rs:799:5:799:10 | ...::f | main.rs:681:5:694:5 | fn f |
| main.rs:800:5:800:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) |
| main.rs:800:5:800:11 | ...::h | main.rs:56:1:75:1 | fn h |
+| main.rs:801:5:801:13 | z_changed | main.rs:700:1:700:8 | fn z_changed |
| main.rs:802:5:802:11 | AStruct | main.rs:702:1:702:17 | struct AStruct |
+| main.rs:802:5:802:22 | ...::z_on_type | main.rs:706:5:706:16 | fn z_on_type |
| main.rs:803:5:803:11 | AStruct | main.rs:702:1:702:17 | struct AStruct |
| my2/mod.rs:5:5:5:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
| my2/mod.rs:5:5:5:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
@@ -434,7 +436,7 @@ resolvePath
| my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g |
| my2/my3/mod.rs:4:5:4:5 | h | main.rs:56:1:75:1 | fn h |
| my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:23:34 | SourceFile |
-| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:805:2 | SourceFile |
+| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:804:2 | SourceFile |
| my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:56:1:75:1 | fn h |
| my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:23:34 | SourceFile |
| my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g |
From 2c84b49cede939e5f935213890910c0ad87d7643 Mon Sep 17 00:00:00 2001
From: Simon Friis Vindum
Date: Wed, 17 Sep 2025 15:58:54 +0200
Subject: [PATCH 042/160] Rust: Update test expecations
---
.../security/CWE-696/BadCTorInitialization.expected | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/rust/ql/test/query-tests/security/CWE-696/BadCTorInitialization.expected b/rust/ql/test/query-tests/security/CWE-696/BadCTorInitialization.expected
index 3ac74a3cb13..ed95a8d448a 100644
--- a/rust/ql/test/query-tests/security/CWE-696/BadCTorInitialization.expected
+++ b/rust/ql/test/query-tests/security/CWE-696/BadCTorInitialization.expected
@@ -59,13 +59,11 @@ edges
| test.rs:129:4:130:21 | fn bad3_1 | test.rs:130:5:130:19 | call_target3_1(...) |
| test.rs:130:5:130:19 | call_target3_1(...) | test.rs:124:1:126:1 | fn call_target3_1 |
| test.rs:144:1:144:7 | Attr | test.rs:145:4:147:21 | fn bad3_3 |
-| test.rs:144:1:148:1 | fn bad3_3 | test.rs:146:5:146:20 | call_target3_1(...) |
| test.rs:145:4:147:21 | fn bad3_3 | test.rs:146:5:146:19 | call_target3_1(...) |
| test.rs:146:5:146:19 | call_target3_1(...) | test.rs:124:1:126:1 | fn call_target3_1 |
-| test.rs:146:5:146:20 | call_target3_1(...) | test.rs:124:1:126:1 | fn call_target3_1 |
| test.rs:150:1:150:7 | Attr | test.rs:151:4:152:13 | fn bad3_4 |
| test.rs:151:4:152:13 | fn bad3_4 | test.rs:152:5:152:11 | bad3_3(...) |
-| test.rs:152:5:152:11 | bad3_3(...) | test.rs:144:1:148:1 | fn bad3_3 |
+| test.rs:152:5:152:11 | bad3_3(...) | test.rs:145:4:147:21 | fn bad3_3 |
| test.rs:168:1:168:7 | Attr | test.rs:169:4:170:16 | fn bad4_1 |
| test.rs:169:4:170:16 | fn bad4_1 | test.rs:168:1:168:7 | ... .write(...) |
| test.rs:169:4:170:16 | fn bad4_1 | test.rs:168:1:168:7 | ...::stdout(...) |
From a9d7662bb7a20a08bdc794bc67c1d10f60c5f3f9 Mon Sep 17 00:00:00 2001
From: Simon Friis Vindum
Date: Fri, 19 Sep 2025 13:09:07 +0200
Subject: [PATCH 043/160] Rust: Add path resolution test with attribute on impl
block
---
.../library-tests/path-resolution/main.rs | 22 +++
.../path-resolution/path-resolution.expected | 161 ++++++++++--------
.../path-resolution/proc_macro.rs | 8 +-
3 files changed, 116 insertions(+), 75 deletions(-)
diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs
index 1ad55d36ad4..42107ec5fd4 100644
--- a/rust/ql/test/library-tests/path-resolution/main.rs
+++ b/rust/ql/test/library-tests/path-resolution/main.rs
@@ -767,6 +767,27 @@ use std::{self as ztd}; // $ item=std
fn use_ztd(x: ztd::string::String) {} // $ item=String
+#[rustfmt::skip]
+mod impl_with_attribute_macro {
+ struct Foo; // IFoo
+
+ trait ATrait {
+ type Foo;
+ } // IATrait
+
+ #[proc_macro::identity] // $ item=identity
+ impl ATrait for i64 { // $ item=IATrait item=i64
+ type Foo =
+ i64 // $ item=i64
+ ; // IATrait_i64_Foo
+ }
+
+ pub fn test() {
+ // This should resolve to the struct, not the associated type.
+ let _x: Foo; // $ item=IFoo SPURIOUS: item=IATrait_i64_Foo
+ } // impl_with_attribute_macro::test
+}
+
fn main() {
my::nested::nested1::nested2::f(); // $ item=I4
my::f(); // $ item=I38
@@ -801,4 +822,5 @@ fn main() {
z_changed(); // $ item=I122
AStruct::z_on_type(); // $ item=I124
AStruct {}.z_on_instance(); // $ item=I123 item=I125
+ impl_with_attribute_macro::test(); // $ item=impl_with_attribute_macro::test
}
diff --git a/rust/ql/test/library-tests/path-resolution/path-resolution.expected b/rust/ql/test/library-tests/path-resolution/path-resolution.expected
index 7c30ebc4a1e..e9bb668f681 100644
--- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected
+++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected
@@ -31,6 +31,7 @@ mod
| main.rs:600:1:625:1 | mod m23 |
| main.rs:627:1:695:1 | mod m24 |
| main.rs:712:1:764:1 | mod associated_types |
+| main.rs:770:1:789:1 | mod impl_with_attribute_macro |
| my2/mod.rs:1:1:1:16 | mod nested2 |
| my2/mod.rs:18:1:18:12 | mod my3 |
| my2/mod.rs:20:1:21:10 | mod mymod |
@@ -66,7 +67,7 @@ resolvePath
| main.rs:36:17:36:21 | super | main.rs:24:5:42:5 | mod m2 |
| main.rs:36:17:36:24 | ...::f | main.rs:25:9:27:9 | fn f |
| main.rs:39:17:39:17 | f | main.rs:25:9:27:9 | fn f |
-| main.rs:46:9:46:13 | super | main.rs:1:1:804:2 | SourceFile |
+| main.rs:46:9:46:13 | super | main.rs:1:1:826:2 | SourceFile |
| main.rs:46:9:46:17 | ...::m1 | main.rs:19:1:43:1 | mod m1 |
| main.rs:46:9:46:21 | ...::m2 | main.rs:24:5:42:5 | mod m2 |
| main.rs:46:9:46:24 | ...::g | main.rs:29:9:33:9 | fn g |
@@ -78,7 +79,7 @@ resolvePath
| main.rs:67:17:67:19 | Foo | main.rs:65:9:65:21 | struct Foo |
| main.rs:70:13:70:15 | Foo | main.rs:59:5:59:17 | struct Foo |
| main.rs:72:5:72:5 | f | main.rs:61:5:68:5 | fn f |
-| main.rs:74:5:74:8 | self | main.rs:1:1:804:2 | SourceFile |
+| main.rs:74:5:74:8 | self | main.rs:1:1:826:2 | SourceFile |
| main.rs:74:5:74:11 | ...::i | main.rs:77:1:89:1 | fn i |
| main.rs:80:13:80:15 | Foo | main.rs:54:1:54:13 | struct Foo |
| main.rs:84:16:84:18 | i32 | {EXTERNAL LOCATION} | struct i32 |
@@ -93,7 +94,7 @@ resolvePath
| main.rs:93:57:93:66 | ...::g | my2/nested2.rs:7:9:9:9 | fn g |
| main.rs:93:80:93:86 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
| main.rs:106:5:106:22 | f_defined_in_macro | main.rs:105:18:105:42 | fn f_defined_in_macro |
-| main.rs:123:13:123:17 | super | main.rs:1:1:804:2 | SourceFile |
+| main.rs:123:13:123:17 | super | main.rs:1:1:826:2 | SourceFile |
| main.rs:123:13:123:21 | ...::m5 | main.rs:109:1:113:1 | mod m5 |
| main.rs:124:9:124:9 | f | main.rs:110:5:112:5 | fn f |
| main.rs:124:9:124:9 | f | main.rs:116:5:118:5 | fn f |
@@ -303,12 +304,12 @@ resolvePath
| main.rs:693:9:693:47 | ...::call_both | main.rs:659:9:662:9 | fn call_both |
| main.rs:693:25:693:35 | Implementor | main.rs:665:5:665:23 | struct Implementor |
| main.rs:699:3:699:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
-| main.rs:699:3:699:24 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix |
+| main.rs:699:3:699:24 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix |
| main.rs:703:6:703:12 | AStruct | main.rs:702:1:702:17 | struct AStruct |
| main.rs:705:7:705:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
-| main.rs:705:7:705:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix |
+| main.rs:705:7:705:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix |
| main.rs:708:7:708:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
-| main.rs:708:7:708:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix |
+| main.rs:708:7:708:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix |
| main.rs:713:9:713:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
| main.rs:713:9:713:19 | ...::marker | {EXTERNAL LOCATION} | mod marker |
| main.rs:713:9:713:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData |
@@ -349,73 +350,82 @@ resolvePath
| main.rs:768:15:768:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
| main.rs:768:15:768:25 | ...::string | {EXTERNAL LOCATION} | mod string |
| main.rs:768:15:768:33 | ...::String | {EXTERNAL LOCATION} | struct String |
-| main.rs:771:5:771:6 | my | main.rs:1:1:1:7 | mod my |
-| main.rs:771:5:771:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
-| main.rs:771:5:771:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
-| main.rs:771:5:771:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
-| main.rs:771:5:771:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
-| main.rs:772:5:772:6 | my | main.rs:1:1:1:7 | mod my |
-| main.rs:772:5:772:9 | ...::f | my.rs:5:1:7:1 | fn f |
-| main.rs:773:5:773:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
-| main.rs:773:5:773:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
-| main.rs:773:5:773:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
-| main.rs:773:5:773:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
-| main.rs:774:5:774:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
-| main.rs:775:5:775:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
-| main.rs:776:5:776:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) |
-| main.rs:776:5:776:12 | ...::h | main.rs:56:1:75:1 | fn h |
-| main.rs:777:5:777:6 | m1 | main.rs:19:1:43:1 | mod m1 |
-| main.rs:777:5:777:10 | ...::m2 | main.rs:24:5:42:5 | mod m2 |
-| main.rs:777:5:777:13 | ...::g | main.rs:29:9:33:9 | fn g |
-| main.rs:778:5:778:6 | m1 | main.rs:19:1:43:1 | mod m1 |
-| main.rs:778:5:778:10 | ...::m2 | main.rs:24:5:42:5 | mod m2 |
-| main.rs:778:5:778:14 | ...::m3 | main.rs:35:9:41:9 | mod m3 |
-| main.rs:778:5:778:17 | ...::h | main.rs:36:27:40:13 | fn h |
-| main.rs:779:5:779:6 | m4 | main.rs:45:1:52:1 | mod m4 |
-| main.rs:779:5:779:9 | ...::i | main.rs:48:5:51:5 | fn i |
-| main.rs:780:5:780:5 | h | main.rs:56:1:75:1 | fn h |
-| main.rs:781:5:781:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
-| main.rs:782:5:782:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
-| main.rs:783:5:783:5 | j | main.rs:103:1:107:1 | fn j |
-| main.rs:784:5:784:6 | m6 | main.rs:115:1:126:1 | mod m6 |
-| main.rs:784:5:784:9 | ...::g | main.rs:120:5:125:5 | fn g |
-| main.rs:785:5:785:6 | m7 | main.rs:128:1:147:1 | mod m7 |
-| main.rs:785:5:785:9 | ...::f | main.rs:139:5:146:5 | fn f |
-| main.rs:786:5:786:6 | m8 | main.rs:149:1:203:1 | mod m8 |
-| main.rs:786:5:786:9 | ...::g | main.rs:187:5:202:5 | fn g |
-| main.rs:787:5:787:6 | m9 | main.rs:205:1:213:1 | mod m9 |
-| main.rs:787:5:787:9 | ...::f | main.rs:208:5:212:5 | fn f |
-| main.rs:788:5:788:7 | m11 | main.rs:236:1:273:1 | mod m11 |
-| main.rs:788:5:788:10 | ...::f | main.rs:241:5:244:5 | fn f |
-| main.rs:789:5:789:7 | m15 | main.rs:304:1:373:1 | mod m15 |
-| main.rs:789:5:789:10 | ...::f | main.rs:360:5:372:5 | fn f |
-| main.rs:790:5:790:7 | m16 | main.rs:375:1:467:1 | mod m16 |
-| main.rs:790:5:790:10 | ...::f | main.rs:442:5:466:5 | fn f |
-| main.rs:791:5:791:20 | trait_visibility | main.rs:469:1:519:1 | mod trait_visibility |
-| main.rs:791:5:791:23 | ...::f | main.rs:496:5:518:5 | fn f |
-| main.rs:792:5:792:7 | m17 | main.rs:521:1:551:1 | mod m17 |
-| main.rs:792:5:792:10 | ...::f | main.rs:545:5:550:5 | fn f |
-| main.rs:793:5:793:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
-| main.rs:793:5:793:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
-| main.rs:794:5:794:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
-| main.rs:794:5:794:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f |
-| main.rs:795:5:795:7 | my3 | my2/mod.rs:18:1:18:12 | mod my3 |
-| main.rs:795:5:795:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f |
-| main.rs:796:5:796:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
-| main.rs:797:5:797:7 | m18 | main.rs:553:1:571:1 | mod m18 |
-| main.rs:797:5:797:12 | ...::m19 | main.rs:558:5:570:5 | mod m19 |
-| main.rs:797:5:797:17 | ...::m20 | main.rs:563:9:569:9 | mod m20 |
-| main.rs:797:5:797:20 | ...::g | main.rs:564:13:568:13 | fn g |
-| main.rs:798:5:798:7 | m23 | main.rs:600:1:625:1 | mod m23 |
-| main.rs:798:5:798:10 | ...::f | main.rs:620:5:624:5 | fn f |
-| main.rs:799:5:799:7 | m24 | main.rs:627:1:695:1 | mod m24 |
-| main.rs:799:5:799:10 | ...::f | main.rs:681:5:694:5 | fn f |
-| main.rs:800:5:800:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) |
-| main.rs:800:5:800:11 | ...::h | main.rs:56:1:75:1 | fn h |
-| main.rs:801:5:801:13 | z_changed | main.rs:700:1:700:8 | fn z_changed |
-| main.rs:802:5:802:11 | AStruct | main.rs:702:1:702:17 | struct AStruct |
-| main.rs:802:5:802:22 | ...::z_on_type | main.rs:706:5:706:16 | fn z_on_type |
-| main.rs:803:5:803:11 | AStruct | main.rs:702:1:702:17 | struct AStruct |
+| main.rs:778:7:778:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) |
+| main.rs:778:7:778:26 | ...::identity | proc_macro.rs:15:1:18:1 | fn identity |
+| main.rs:779:10:779:15 | ATrait | main.rs:774:5:776:5 | trait ATrait |
+| main.rs:779:21:779:23 | i64 | {EXTERNAL LOCATION} | struct i64 |
+| main.rs:781:11:781:13 | i64 | {EXTERNAL LOCATION} | struct i64 |
+| main.rs:787:17:787:19 | Foo | main.rs:772:5:772:15 | struct Foo |
+| main.rs:787:17:787:19 | Foo | main.rs:779:27:782:9 | type Foo |
+| main.rs:792:5:792:6 | my | main.rs:1:1:1:7 | mod my |
+| main.rs:792:5:792:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
+| main.rs:792:5:792:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
+| main.rs:792:5:792:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 |
+| main.rs:792:5:792:35 | ...::f | my/nested.rs:3:9:5:9 | fn f |
+| main.rs:793:5:793:6 | my | main.rs:1:1:1:7 | mod my |
+| main.rs:793:5:793:9 | ...::f | my.rs:5:1:7:1 | fn f |
+| main.rs:794:5:794:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
+| main.rs:794:5:794:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
+| main.rs:794:5:794:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
+| main.rs:794:5:794:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f |
+| main.rs:795:5:795:5 | f | my2/nested2.rs:3:9:5:9 | fn f |
+| main.rs:796:5:796:5 | g | my2/nested2.rs:7:9:9:9 | fn g |
+| main.rs:797:5:797:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) |
+| main.rs:797:5:797:12 | ...::h | main.rs:56:1:75:1 | fn h |
+| main.rs:798:5:798:6 | m1 | main.rs:19:1:43:1 | mod m1 |
+| main.rs:798:5:798:10 | ...::m2 | main.rs:24:5:42:5 | mod m2 |
+| main.rs:798:5:798:13 | ...::g | main.rs:29:9:33:9 | fn g |
+| main.rs:799:5:799:6 | m1 | main.rs:19:1:43:1 | mod m1 |
+| main.rs:799:5:799:10 | ...::m2 | main.rs:24:5:42:5 | mod m2 |
+| main.rs:799:5:799:14 | ...::m3 | main.rs:35:9:41:9 | mod m3 |
+| main.rs:799:5:799:17 | ...::h | main.rs:36:27:40:13 | fn h |
+| main.rs:800:5:800:6 | m4 | main.rs:45:1:52:1 | mod m4 |
+| main.rs:800:5:800:9 | ...::i | main.rs:48:5:51:5 | fn i |
+| main.rs:801:5:801:5 | h | main.rs:56:1:75:1 | fn h |
+| main.rs:802:5:802:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f |
+| main.rs:803:5:803:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g |
+| main.rs:804:5:804:5 | j | main.rs:103:1:107:1 | fn j |
+| main.rs:805:5:805:6 | m6 | main.rs:115:1:126:1 | mod m6 |
+| main.rs:805:5:805:9 | ...::g | main.rs:120:5:125:5 | fn g |
+| main.rs:806:5:806:6 | m7 | main.rs:128:1:147:1 | mod m7 |
+| main.rs:806:5:806:9 | ...::f | main.rs:139:5:146:5 | fn f |
+| main.rs:807:5:807:6 | m8 | main.rs:149:1:203:1 | mod m8 |
+| main.rs:807:5:807:9 | ...::g | main.rs:187:5:202:5 | fn g |
+| main.rs:808:5:808:6 | m9 | main.rs:205:1:213:1 | mod m9 |
+| main.rs:808:5:808:9 | ...::f | main.rs:208:5:212:5 | fn f |
+| main.rs:809:5:809:7 | m11 | main.rs:236:1:273:1 | mod m11 |
+| main.rs:809:5:809:10 | ...::f | main.rs:241:5:244:5 | fn f |
+| main.rs:810:5:810:7 | m15 | main.rs:304:1:373:1 | mod m15 |
+| main.rs:810:5:810:10 | ...::f | main.rs:360:5:372:5 | fn f |
+| main.rs:811:5:811:7 | m16 | main.rs:375:1:467:1 | mod m16 |
+| main.rs:811:5:811:10 | ...::f | main.rs:442:5:466:5 | fn f |
+| main.rs:812:5:812:20 | trait_visibility | main.rs:469:1:519:1 | mod trait_visibility |
+| main.rs:812:5:812:23 | ...::f | main.rs:496:5:518:5 | fn f |
+| main.rs:813:5:813:7 | m17 | main.rs:521:1:551:1 | mod m17 |
+| main.rs:813:5:813:10 | ...::f | main.rs:545:5:550:5 | fn f |
+| main.rs:814:5:814:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
+| main.rs:814:5:814:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
+| main.rs:815:5:815:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
+| main.rs:815:5:815:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f |
+| main.rs:816:5:816:7 | my3 | my2/mod.rs:18:1:18:12 | mod my3 |
+| main.rs:816:5:816:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f |
+| main.rs:817:5:817:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
+| main.rs:818:5:818:7 | m18 | main.rs:553:1:571:1 | mod m18 |
+| main.rs:818:5:818:12 | ...::m19 | main.rs:558:5:570:5 | mod m19 |
+| main.rs:818:5:818:17 | ...::m20 | main.rs:563:9:569:9 | mod m20 |
+| main.rs:818:5:818:20 | ...::g | main.rs:564:13:568:13 | fn g |
+| main.rs:819:5:819:7 | m23 | main.rs:600:1:625:1 | mod m23 |
+| main.rs:819:5:819:10 | ...::f | main.rs:620:5:624:5 | fn f |
+| main.rs:820:5:820:7 | m24 | main.rs:627:1:695:1 | mod m24 |
+| main.rs:820:5:820:10 | ...::f | main.rs:681:5:694:5 | fn f |
+| main.rs:821:5:821:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) |
+| main.rs:821:5:821:11 | ...::h | main.rs:56:1:75:1 | fn h |
+| main.rs:822:5:822:13 | z_changed | main.rs:700:1:700:8 | fn z_changed |
+| main.rs:823:5:823:11 | AStruct | main.rs:702:1:702:17 | struct AStruct |
+| main.rs:823:5:823:22 | ...::z_on_type | main.rs:706:5:706:16 | fn z_on_type |
+| main.rs:824:5:824:11 | AStruct | main.rs:702:1:702:17 | struct AStruct |
+| main.rs:825:5:825:29 | impl_with_attribute_macro | main.rs:770:1:789:1 | mod impl_with_attribute_macro |
+| main.rs:825:5:825:35 | ...::test | main.rs:785:5:788:5 | fn test |
| my2/mod.rs:5:5:5:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 |
| my2/mod.rs:5:5:5:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 |
| my2/mod.rs:5:5:5:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 |
@@ -436,7 +446,7 @@ resolvePath
| my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g |
| my2/my3/mod.rs:4:5:4:5 | h | main.rs:56:1:75:1 | fn h |
| my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:23:34 | SourceFile |
-| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:804:2 | SourceFile |
+| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:826:2 | SourceFile |
| my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:56:1:75:1 | fn h |
| my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:23:34 | SourceFile |
| my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g |
@@ -482,4 +492,7 @@ resolvePath
| proc_macro.rs:8:21:8:23 | syn | {EXTERNAL LOCATION} | Crate(syn@2.0.103) |
| proc_macro.rs:8:21:8:30 | ...::Ident | {EXTERNAL LOCATION} | struct Ident |
| proc_macro.rs:8:21:8:35 | ...::new | {EXTERNAL LOCATION} | fn new |
+| proc_macro.rs:16:24:16:34 | TokenStream | {EXTERNAL LOCATION} | struct TokenStream |
+| proc_macro.rs:16:43:16:53 | TokenStream | {EXTERNAL LOCATION} | struct TokenStream |
+| proc_macro.rs:16:59:16:69 | TokenStream | {EXTERNAL LOCATION} | struct TokenStream |
testFailures
diff --git a/rust/ql/test/library-tests/path-resolution/proc_macro.rs b/rust/ql/test/library-tests/path-resolution/proc_macro.rs
index c95fc6fe640..11e3a7024ae 100644
--- a/rust/ql/test/library-tests/path-resolution/proc_macro.rs
+++ b/rust/ql/test/library-tests/path-resolution/proc_macro.rs
@@ -8,5 +8,11 @@ pub fn add_suffix(attr: TokenStream, item: TokenStream) -> TokenStream {
ast.sig.ident = syn::Ident::new(&format!("{}_{}", ast.sig.ident, suff), ast.sig.ident.span());
quote! {
#ast
- }.into()
+ }
+ .into()
+}
+
+#[proc_macro_attribute]
+pub fn identity(_attr: TokenStream, item: TokenStream) -> TokenStream {
+ item
}
From d88bc8e4086b3d90e80601b8489ed521c3cacdb2 Mon Sep 17 00:00:00 2001
From: Napalys Klicius
Date: Fri, 19 Sep 2025 14:23:40 +0200
Subject: [PATCH 044/160] JS: Add test case for `GraphQLObjectType`
---
.../CWE-094/CodeInjection/graph-ql.js | 28 ++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/graph-ql.js b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/graph-ql.js
index f68f47cf3ac..c4b68e16990 100644
--- a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/graph-ql.js
+++ b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/graph-ql.js
@@ -1,5 +1,5 @@
const express = require('express');
-const { graphql, buildSchema } = require('graphql');
+const { graphql, buildSchema, GraphQLObjectType, GraphQLString } = require('graphql');
const app = express();
app.use(express.json());
@@ -53,4 +53,30 @@ app.post('/graphql', async (req, res) => {
rootValue: root1,
variableValues: variables
});
+
+ const MutationType = new GraphQLObjectType({
+ name: 'Mutation',
+ fields: {
+ runEval: {
+ type: GraphQLString,
+ args: {
+ value: { type: GraphQLString }
+ },
+ resolve: (_, { value }, context) => { // $ MISSING: Source[js/code-injection]
+ return eval(value); // $ MISSING: Alert[js/code-injection]
+ }
+ }
+ }
+ });
+
+ const schema = new GraphQLSchema({
+ query: QueryType,
+ mutation: MutationType
+ });
+
+ await graphql({
+ schema,
+ source: query,
+ variableValues: variables
+ });
});
From 60ceb89f01be59ecba08fc972d5a9bdd84e11ff2 Mon Sep 17 00:00:00 2001
From: Simon Friis Vindum
Date: Fri, 19 Sep 2025 13:26:36 +0200
Subject: [PATCH 045/160] Rust: Add debug predicate for `ItemNode`
---
rust/ql/lib/codeql/rust/internal/PathResolution.qll | 2 ++
1 file changed, 2 insertions(+)
diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll
index 980033811dd..6b7df0db58a 100644
--- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll
+++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll
@@ -1807,6 +1807,8 @@ private module Debug {
path = p.toStringDebug()
}
+ predicate debugItemNode(ItemNode item) { item = getRelevantLocatable() }
+
ItemNode debugResolvePath(RelevantPath path) {
path = getRelevantLocatable() and
result = resolvePath(path)
From 72103adacc7cf9712acd464a38adebeb240d5fb5 Mon Sep 17 00:00:00 2001
From: Simon Friis Vindum
Date: Fri, 19 Sep 2025 13:27:02 +0200
Subject: [PATCH 046/160] Rust: Fix spurious path resolution
The annotated impl block was filtered away, but it's children where not. This caused the associated type `Foo` to appear as if it was an item in the scope outside of the impl block.
---
.../codeql/rust/internal/PathResolution.qll | 20 ++++++++++++++++++-
.../library-tests/path-resolution/main.rs | 2 +-
.../path-resolution/path-resolution.expected | 1 -
3 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll
index 6b7df0db58a..46197b6189e 100644
--- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll
+++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll
@@ -78,6 +78,24 @@ private ItemNode getAChildSuccessor(ItemNode item, string name, SuccessorKind ki
)
}
+/**
+ * Holds if `n` is superceded by an attribute macro expansion. That is, `n` is
+ * an item or a transitive child of an item with an attribute macro expansion.
+ */
+predicate supercededByAttributeMacroExpansion(AstNode n) {
+ n.(Item).hasAttributeMacroExpansion()
+ or
+ exists(AstNode parent |
+ n.getParentNode() = parent and
+ supercededByAttributeMacroExpansion(parent) and
+ // Don't exclude expansions themselves as they supercede other nodes.
+ not n = parent.(Item).getAttributeMacroExpansion() and
+ // Don't consider attributes themselves to be superceded. E.g., in `#[a] fn
+ // f() {}` the macro expansion supercedes `fn f() {}` but not `#[a]`.
+ not n instanceof Attr
+ )
+}
+
/**
* An item that may be referred to by a path, and which is a node in
* the _item graph_.
@@ -158,7 +176,7 @@ private ItemNode getAChildSuccessor(ItemNode item, string name, SuccessorKind ki
abstract class ItemNode extends Locatable {
ItemNode() {
// Exclude items that are superceded by the expansion of an attribute macro.
- not this.(Item).hasAttributeMacroExpansion()
+ not supercededByAttributeMacroExpansion(this)
}
/** Gets the (original) name of this item. */
diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs
index 42107ec5fd4..9051f7f8412 100644
--- a/rust/ql/test/library-tests/path-resolution/main.rs
+++ b/rust/ql/test/library-tests/path-resolution/main.rs
@@ -784,7 +784,7 @@ mod impl_with_attribute_macro {
pub fn test() {
// This should resolve to the struct, not the associated type.
- let _x: Foo; // $ item=IFoo SPURIOUS: item=IATrait_i64_Foo
+ let _x: Foo; // $ item=IFoo
} // impl_with_attribute_macro::test
}
diff --git a/rust/ql/test/library-tests/path-resolution/path-resolution.expected b/rust/ql/test/library-tests/path-resolution/path-resolution.expected
index e9bb668f681..a908ec1e5c1 100644
--- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected
+++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected
@@ -356,7 +356,6 @@ resolvePath
| main.rs:779:21:779:23 | i64 | {EXTERNAL LOCATION} | struct i64 |
| main.rs:781:11:781:13 | i64 | {EXTERNAL LOCATION} | struct i64 |
| main.rs:787:17:787:19 | Foo | main.rs:772:5:772:15 | struct Foo |
-| main.rs:787:17:787:19 | Foo | main.rs:779:27:782:9 | type Foo |
| main.rs:792:5:792:6 | my | main.rs:1:1:1:7 | mod my |
| main.rs:792:5:792:14 | ...::nested | my.rs:1:1:1:15 | mod nested |
| main.rs:792:5:792:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 |
From afb6d307624ce482bf7f6f09c18b29353829bd34 Mon Sep 17 00:00:00 2001
From: Simon Friis Vindum
Date: Fri, 19 Sep 2025 14:27:14 +0200
Subject: [PATCH 047/160] Rust: Fix typo in superseded
---
rust/ql/lib/codeql/rust/internal/PathResolution.qll | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll
index 46197b6189e..44e8b452255 100644
--- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll
+++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll
@@ -79,18 +79,18 @@ private ItemNode getAChildSuccessor(ItemNode item, string name, SuccessorKind ki
}
/**
- * Holds if `n` is superceded by an attribute macro expansion. That is, `n` is
+ * Holds if `n` is superseded by an attribute macro expansion. That is, `n` is
* an item or a transitive child of an item with an attribute macro expansion.
*/
-predicate supercededByAttributeMacroExpansion(AstNode n) {
+predicate supersededByAttributeMacroExpansion(AstNode n) {
n.(Item).hasAttributeMacroExpansion()
or
exists(AstNode parent |
n.getParentNode() = parent and
- supercededByAttributeMacroExpansion(parent) and
+ supersededByAttributeMacroExpansion(parent) and
// Don't exclude expansions themselves as they supercede other nodes.
not n = parent.(Item).getAttributeMacroExpansion() and
- // Don't consider attributes themselves to be superceded. E.g., in `#[a] fn
+ // Don't consider attributes themselves to be superseded. E.g., in `#[a] fn
// f() {}` the macro expansion supercedes `fn f() {}` but not `#[a]`.
not n instanceof Attr
)
@@ -175,8 +175,8 @@ predicate supercededByAttributeMacroExpansion(AstNode n) {
*/
abstract class ItemNode extends Locatable {
ItemNode() {
- // Exclude items that are superceded by the expansion of an attribute macro.
- not supercededByAttributeMacroExpansion(this)
+ // Exclude items that are superseded by the expansion of an attribute macro.
+ not supersededByAttributeMacroExpansion(this)
}
/** Gets the (original) name of this item. */
From 6cfc95015921ab781e16f36ac2ba5ba9a57187ae Mon Sep 17 00:00:00 2001
From: Napalys Klicius
Date: Fri, 19 Sep 2025 14:39:36 +0200
Subject: [PATCH 048/160] JS: Model `GraphQLObjectType` resolve params as
sources
---
javascript/ql/lib/ext/graph-ql.model.yml | 5 +++++
.../Security/CWE-094/CodeInjection/CodeInjection.expected | 6 ++++++
.../CodeInjection/HeuristicSourceCodeInjection.expected | 5 +++++
.../query-tests/Security/CWE-094/CodeInjection/graph-ql.js | 4 ++--
4 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/javascript/ql/lib/ext/graph-ql.model.yml b/javascript/ql/lib/ext/graph-ql.model.yml
index 08233d1135d..2ea1c41ed9f 100644
--- a/javascript/ql/lib/ext/graph-ql.model.yml
+++ b/javascript/ql/lib/ext/graph-ql.model.yml
@@ -4,3 +4,8 @@ extensions:
extensible: summaryModel
data:
- ["graphql", "Member[graphql]", "Argument[0].Member[source,variableValues]", "Argument[0].Member[rootValue].AnyMember.Parameter[0]", "taint"]
+ - addsTo:
+ pack: codeql/javascript-all
+ extensible: sourceModel
+ data:
+ - ["graphql", "Member[GraphQLObjectType].Argument[0].Member[fields].AnyMember.Member[resolve].Parameter[1]", "remote"]
diff --git a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/CodeInjection.expected b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/CodeInjection.expected
index 3f5d8abed8a..fb3e4ad6e6a 100644
--- a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/CodeInjection.expected
+++ b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/CodeInjection.expected
@@ -63,6 +63,7 @@
| fastify.js:108:28:108:50 | reply.l ... tedCode | fastify.js:94:29:94:51 | request ... plyCode | fastify.js:108:28:108:50 | reply.l ... tedCode | This code execution depends on a $@. | fastify.js:94:29:94:51 | request ... plyCode | user-provided value |
| graph-ql.js:20:19:20:22 | expr | graph-ql.js:28:32:28:39 | req.body | graph-ql.js:20:19:20:22 | expr | This code execution depends on a $@. | graph-ql.js:28:32:28:39 | req.body | user-provided value |
| graph-ql.js:39:19:39:30 | name + title | graph-ql.js:28:32:28:39 | req.body | graph-ql.js:39:19:39:30 | name + title | This code execution depends on a $@. | graph-ql.js:28:32:28:39 | req.body | user-provided value |
+| graph-ql.js:66:23:66:27 | value | graph-ql.js:65:22:65:30 | { value } | graph-ql.js:66:23:66:27 | value | This code execution depends on a $@. | graph-ql.js:65:22:65:30 | { value } | user-provided value |
| module.js:9:16:9:29 | req.query.code | module.js:9:16:9:29 | req.query.code | module.js:9:16:9:29 | req.query.code | This code execution depends on a $@. | module.js:9:16:9:29 | req.query.code | user-provided value |
| module.js:11:17:11:30 | req.query.code | module.js:11:17:11:30 | req.query.code | module.js:11:17:11:30 | req.query.code | This code execution depends on a $@. | module.js:11:17:11:30 | req.query.code | user-provided value |
| react-native.js:8:32:8:38 | tainted | react-native.js:7:17:7:33 | req.param("code") | react-native.js:8:32:8:38 | tainted | This code execution depends on a $@. | react-native.js:7:17:7:33 | req.param("code") | user-provided value |
@@ -173,6 +174,8 @@ edges
| graph-ql.js:39:19:39:22 | name | graph-ql.js:39:19:39:30 | name + title | provenance | |
| graph-ql.js:39:26:39:30 | title | graph-ql.js:39:19:39:30 | name + title | provenance | |
| graph-ql.js:54:21:54:29 | variables | graph-ql.js:38:13:38:27 | { name, title } | provenance | |
+| graph-ql.js:65:22:65:30 | { value } | graph-ql.js:65:24:65:28 | value | provenance | |
+| graph-ql.js:65:24:65:28 | value | graph-ql.js:66:23:66:27 | value | provenance | |
| react-native.js:7:7:7:13 | tainted | react-native.js:8:32:8:38 | tainted | provenance | |
| react-native.js:7:7:7:13 | tainted | react-native.js:10:23:10:29 | tainted | provenance | |
| react-native.js:7:17:7:33 | req.param("code") | react-native.js:7:7:7:13 | tainted | provenance | |
@@ -323,6 +326,9 @@ nodes
| graph-ql.js:39:19:39:30 | name + title | semmle.label | name + title |
| graph-ql.js:39:26:39:30 | title | semmle.label | title |
| graph-ql.js:54:21:54:29 | variables | semmle.label | variables |
+| graph-ql.js:65:22:65:30 | { value } | semmle.label | { value } |
+| graph-ql.js:65:24:65:28 | value | semmle.label | value |
+| graph-ql.js:66:23:66:27 | value | semmle.label | value |
| module.js:9:16:9:29 | req.query.code | semmle.label | req.query.code |
| module.js:11:17:11:30 | req.query.code | semmle.label | req.query.code |
| react-native.js:7:7:7:13 | tainted | semmle.label | tainted |
diff --git a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/HeuristicSourceCodeInjection.expected b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/HeuristicSourceCodeInjection.expected
index 3d4022d8fb6..837ae37eaee 100644
--- a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/HeuristicSourceCodeInjection.expected
+++ b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/HeuristicSourceCodeInjection.expected
@@ -72,6 +72,8 @@ edges
| graph-ql.js:39:19:39:22 | name | graph-ql.js:39:19:39:30 | name + title | provenance | |
| graph-ql.js:39:26:39:30 | title | graph-ql.js:39:19:39:30 | name + title | provenance | |
| graph-ql.js:54:21:54:29 | variables | graph-ql.js:38:13:38:27 | { name, title } | provenance | |
+| graph-ql.js:65:22:65:30 | { value } | graph-ql.js:65:24:65:28 | value | provenance | |
+| graph-ql.js:65:24:65:28 | value | graph-ql.js:66:23:66:27 | value | provenance | |
| react-native.js:7:7:7:13 | tainted | react-native.js:8:32:8:38 | tainted | provenance | |
| react-native.js:7:7:7:13 | tainted | react-native.js:10:23:10:29 | tainted | provenance | |
| react-native.js:7:17:7:33 | req.param("code") | react-native.js:7:7:7:13 | tainted | provenance | |
@@ -224,6 +226,9 @@ nodes
| graph-ql.js:39:19:39:30 | name + title | semmle.label | name + title |
| graph-ql.js:39:26:39:30 | title | semmle.label | title |
| graph-ql.js:54:21:54:29 | variables | semmle.label | variables |
+| graph-ql.js:65:22:65:30 | { value } | semmle.label | { value } |
+| graph-ql.js:65:24:65:28 | value | semmle.label | value |
+| graph-ql.js:66:23:66:27 | value | semmle.label | value |
| module.js:9:16:9:29 | req.query.code | semmle.label | req.query.code |
| module.js:11:17:11:30 | req.query.code | semmle.label | req.query.code |
| react-native.js:7:7:7:13 | tainted | semmle.label | tainted |
diff --git a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/graph-ql.js b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/graph-ql.js
index c4b68e16990..167292330d2 100644
--- a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/graph-ql.js
+++ b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/graph-ql.js
@@ -62,8 +62,8 @@ app.post('/graphql', async (req, res) => {
args: {
value: { type: GraphQLString }
},
- resolve: (_, { value }, context) => { // $ MISSING: Source[js/code-injection]
- return eval(value); // $ MISSING: Alert[js/code-injection]
+ resolve: (_, { value }, context) => { // $ Source[js/code-injection]
+ return eval(value); // $ Alert[js/code-injection]
}
}
}
From 3a6a537986133f24bfecbde3f2c770952e4d4642 Mon Sep 17 00:00:00 2001
From: Napalys Klicius
Date: Fri, 19 Sep 2025 14:46:13 +0200
Subject: [PATCH 049/160] JS: Add change note
---
.../ql/lib/change-notes/2025-09-19-graphql-type-object.md | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 javascript/ql/lib/change-notes/2025-09-19-graphql-type-object.md
diff --git a/javascript/ql/lib/change-notes/2025-09-19-graphql-type-object.md b/javascript/ql/lib/change-notes/2025-09-19-graphql-type-object.md
new file mode 100644
index 00000000000..6afa4ece331
--- /dev/null
+++ b/javascript/ql/lib/change-notes/2025-09-19-graphql-type-object.md
@@ -0,0 +1,4 @@
+---
+category: minorAnalysis
+---
+* Added modeling of `GraphQLObjectType` resolver function parameters as remote sources.
From 95a84ad6559f4180039dac0dc07dcd1b4d7756ee Mon Sep 17 00:00:00 2001
From: Taus
Date: Fri, 19 Sep 2025 15:06:46 +0000
Subject: [PATCH 050/160] Python: Fix false positive for unmatchable
dollar/caret
Our previous modelling did not account for the fact that a lookahead can
potentially extend all the way to the end of the input (and similarly,
that a lookbehind can extend all the way to the beginning).
To fix this, I extended `firstPart` and `lastPart` to handle lookbehinds
and lookaheads correctly, and added some test cases (all of which yield
no new results).
Fixes #20429.
---
.../semmle/python/regexp/RegexTreeView.qll | 8 +--
.../python/regexp/internal/ParseRegExp.qll | 70 ++++++++++++-------
...atchable-dollar-and-caret-in-assertions.md | 5 ++
.../query-tests/Expressions/Regex/test.py | 10 ++-
4 files changed, 64 insertions(+), 29 deletions(-)
create mode 100644 python/ql/src/change-notes/2025-09-19-fix-unmatchable-dollar-and-caret-in-assertions.md
diff --git a/python/ql/lib/semmle/python/regexp/RegexTreeView.qll b/python/ql/lib/semmle/python/regexp/RegexTreeView.qll
index a2952a5680b..897c97bb783 100644
--- a/python/ql/lib/semmle/python/regexp/RegexTreeView.qll
+++ b/python/ql/lib/semmle/python/regexp/RegexTreeView.qll
@@ -964,7 +964,7 @@ module Impl implements RegexTreeViewSig {
* ```
*/
class RegExpPositiveLookahead extends RegExpLookahead {
- RegExpPositiveLookahead() { re.positiveLookaheadAssertionGroup(start, end) }
+ RegExpPositiveLookahead() { re.positiveLookaheadAssertionGroup(start, end, _, _) }
override string getPrimaryQLClass() { result = "RegExpPositiveLookahead" }
}
@@ -979,7 +979,7 @@ module Impl implements RegexTreeViewSig {
* ```
*/
additional class RegExpNegativeLookahead extends RegExpLookahead {
- RegExpNegativeLookahead() { re.negativeLookaheadAssertionGroup(start, end) }
+ RegExpNegativeLookahead() { re.negativeLookaheadAssertionGroup(start, end, _, _) }
override string getPrimaryQLClass() { result = "RegExpNegativeLookahead" }
}
@@ -1006,7 +1006,7 @@ module Impl implements RegexTreeViewSig {
* ```
*/
class RegExpPositiveLookbehind extends RegExpLookbehind {
- RegExpPositiveLookbehind() { re.positiveLookbehindAssertionGroup(start, end) }
+ RegExpPositiveLookbehind() { re.positiveLookbehindAssertionGroup(start, end, _, _) }
override string getPrimaryQLClass() { result = "RegExpPositiveLookbehind" }
}
@@ -1021,7 +1021,7 @@ module Impl implements RegexTreeViewSig {
* ```
*/
additional class RegExpNegativeLookbehind extends RegExpLookbehind {
- RegExpNegativeLookbehind() { re.negativeLookbehindAssertionGroup(start, end) }
+ RegExpNegativeLookbehind() { re.negativeLookbehindAssertionGroup(start, end, _, _) }
override string getPrimaryQLClass() { result = "RegExpNegativeLookbehind" }
}
diff --git a/python/ql/lib/semmle/python/regexp/internal/ParseRegExp.qll b/python/ql/lib/semmle/python/regexp/internal/ParseRegExp.qll
index 7e23554e058..d91c4bbd78c 100644
--- a/python/ql/lib/semmle/python/regexp/internal/ParseRegExp.qll
+++ b/python/ql/lib/semmle/python/regexp/internal/ParseRegExp.qll
@@ -554,9 +554,9 @@ class RegExp extends Expr instanceof StringLiteral {
or
this.negativeAssertionGroup(start, end)
or
- this.positiveLookaheadAssertionGroup(start, end)
+ this.positiveLookaheadAssertionGroup(start, end, _, _)
or
- this.positiveLookbehindAssertionGroup(start, end)
+ this.positiveLookbehindAssertionGroup(start, end, _, _)
}
/** Holds if an empty group is found between `start` and `end`. */
@@ -572,7 +572,7 @@ class RegExp extends Expr instanceof StringLiteral {
or
this.negativeAssertionGroup(start, end)
or
- this.positiveLookaheadAssertionGroup(start, end)
+ this.positiveLookaheadAssertionGroup(start, end, _, _)
}
private predicate emptyMatchAtEndGroup(int start, int end) {
@@ -580,7 +580,7 @@ class RegExp extends Expr instanceof StringLiteral {
or
this.negativeAssertionGroup(start, end)
or
- this.positiveLookbehindAssertionGroup(start, end)
+ this.positiveLookbehindAssertionGroup(start, end, _, _)
}
private predicate negativeAssertionGroup(int start, int end) {
@@ -593,32 +593,40 @@ class RegExp extends Expr instanceof StringLiteral {
)
}
- /** Holds if a negative lookahead is found between `start` and `end` */
- predicate negativeLookaheadAssertionGroup(int start, int end) {
- exists(int in_start | this.negative_lookahead_assertion_start(start, in_start) |
- this.groupContents(start, end, in_start, _)
- )
+ /**
+ * Holds if a negative lookahead is found between `start` and `end`, with contents
+ * between `in_start` and `in_end`.
+ */
+ predicate negativeLookaheadAssertionGroup(int start, int end, int in_start, int in_end) {
+ this.negative_lookahead_assertion_start(start, in_start) and
+ this.groupContents(start, end, in_start, in_end)
}
- /** Holds if a negative lookbehind is found between `start` and `end` */
- predicate negativeLookbehindAssertionGroup(int start, int end) {
- exists(int in_start | this.negative_lookbehind_assertion_start(start, in_start) |
- this.groupContents(start, end, in_start, _)
- )
+ /**
+ * Holds if a negative lookbehind is found between `start` and `end`, with contents
+ * between `in_start` and `in_end`.
+ */
+ predicate negativeLookbehindAssertionGroup(int start, int end, int in_start, int in_end) {
+ this.negative_lookbehind_assertion_start(start, in_start) and
+ this.groupContents(start, end, in_start, in_end)
}
- /** Holds if a positive lookahead is found between `start` and `end` */
- predicate positiveLookaheadAssertionGroup(int start, int end) {
- exists(int in_start | this.lookahead_assertion_start(start, in_start) |
- this.groupContents(start, end, in_start, _)
- )
+ /**
+ * Holds if a positive lookahead is found between `start` and `end`, with contents
+ * between `in_start` and `in_end`.
+ */
+ predicate positiveLookaheadAssertionGroup(int start, int end, int in_start, int in_end) {
+ this.lookahead_assertion_start(start, in_start) and
+ this.groupContents(start, end, in_start, in_end)
}
- /** Holds if a positive lookbehind is found between `start` and `end` */
- predicate positiveLookbehindAssertionGroup(int start, int end) {
- exists(int in_start | this.lookbehind_assertion_start(start, in_start) |
- this.groupContents(start, end, in_start, _)
- )
+ /**
+ * Holds if a positive lookbehind is found between `start` and `end`, with contents
+ * between `in_start` and `in_end`.
+ */
+ predicate positiveLookbehindAssertionGroup(int start, int end, int in_start, int in_end) {
+ this.lookbehind_assertion_start(start, in_start) and
+ this.groupContents(start, end, in_start, in_end)
}
private predicate group_start(int start, int end) {
@@ -1049,6 +1057,13 @@ class RegExp extends Expr instanceof StringLiteral {
or
this.alternationOption(x, y, start, end)
)
+ or
+ // Lookbehind assertions can potentially match the start of the string
+ (
+ this.positiveLookbehindAssertionGroup(_, _, start, _) or
+ this.negativeLookbehindAssertionGroup(_, _, start, _)
+ ) and
+ this.item(start, end)
}
/** A part of the regex that may match the end of the string. */
@@ -1074,6 +1089,13 @@ class RegExp extends Expr instanceof StringLiteral {
or
this.alternationOption(x, y, start, end)
)
+ or
+ // Lookahead assertions can potentially match the end of the string
+ (
+ this.positiveLookaheadAssertionGroup(_, _, _, end) or
+ this.negativeLookaheadAssertionGroup(_, _, _, end)
+ ) and
+ this.item(start, end)
}
/**
diff --git a/python/ql/src/change-notes/2025-09-19-fix-unmatchable-dollar-and-caret-in-assertions.md b/python/ql/src/change-notes/2025-09-19-fix-unmatchable-dollar-and-caret-in-assertions.md
new file mode 100644
index 00000000000..cf63dd9ed4d
--- /dev/null
+++ b/python/ql/src/change-notes/2025-09-19-fix-unmatchable-dollar-and-caret-in-assertions.md
@@ -0,0 +1,5 @@
+---
+category: minorAnalysis
+---
+
+- The queries that check for unmatchable `$` and `^` in regular expressions did not account correctly for occurrences inside lookahead and lookbehind assertions. These occurrences are now handled correctly, eliminating this source of false positives.
diff --git a/python/ql/test/query-tests/Expressions/Regex/test.py b/python/ql/test/query-tests/Expressions/Regex/test.py
index 6dadbccb4b6..717663e335c 100644
--- a/python/ql/test/query-tests/Expressions/Regex/test.py
+++ b/python/ql/test/query-tests/Expressions/Regex/test.py
@@ -150,4 +150,12 @@ re.compile(r"[\U00010000-\U0010FFFF]")
re.compile(r"[\u0000-\uFFFF]")
#Allow unicode names
-re.compile(r"[\N{degree sign}\N{EM DASH}]")
\ No newline at end of file
+re.compile(r"[\N{degree sign}\N{EM DASH}]")
+
+#Lookahead assertions. None of these are unmatchable dollars:
+re.compile(r"^(?=a$)[ab]")
+re.compile(r"^(?!a$)[ab]")
+
+#Lookbehind assertions. None of these are unmatchable carets:
+re.compile(r"(?<=^a)a")
+re.compile(r"(?
Date: Fri, 19 Sep 2025 15:39:12 +0000
Subject: [PATCH 051/160] Python: Update test output
---
python/ql/test/library-tests/regex/FirstLast.expected | 2 ++
1 file changed, 2 insertions(+)
diff --git a/python/ql/test/library-tests/regex/FirstLast.expected b/python/ql/test/library-tests/regex/FirstLast.expected
index b187033ee22..0abf9c790c2 100644
--- a/python/ql/test/library-tests/regex/FirstLast.expected
+++ b/python/ql/test/library-tests/regex/FirstLast.expected
@@ -4,6 +4,7 @@
| (?!not-this)^[A-Z_]+$ | first | 12 | 13 |
| (?!not-this)^[A-Z_]+$ | first | 13 | 19 |
| (?!not-this)^[A-Z_]+$ | first | 13 | 20 |
+| (?!not-this)^[A-Z_]+$ | last | 3 | 11 |
| (?!not-this)^[A-Z_]+$ | last | 13 | 19 |
| (?!not-this)^[A-Z_]+$ | last | 13 | 20 |
| (?!not-this)^[A-Z_]+$ | last | 20 | 21 |
@@ -101,6 +102,7 @@
| ^[A-Z_]+$(?
Date: Fri, 19 Sep 2025 16:49:54 +0100
Subject: [PATCH 052/160] Apply suggestions from code review
Co-authored-by: Simon Friis Vindum
---
rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp b/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp
index e4e0fc5eaa9..088f202965a 100644
--- a/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp
+++ b/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp
@@ -4,7 +4,7 @@
-Constructing URLs with the HTTP protocol can lead to unsecured connections.
+Constructing URLs with the HTTP protocol can lead to insecure connections.
Furthermore, constructing URLs with the HTTP protocol can create problems if other parts of the
code expect HTTPS URLs. A typical pattern is to use libraries that expect secure connections,
@@ -14,7 +14,7 @@ which may fail or fall back to insecure behavior when provided with HTTP URLs in
When you construct a URL for network requests, ensure that you use an HTTPS URL rather than an HTTP URL.
-Then, any connections that are made using that URL are secure SSL/TLS connections.
+Then, any connections that are made using that URL are secure TLS connections.
@@ -26,7 +26,7 @@ by attackers:
A better approach is to use HTTPS. When the request is made using an HTTPS URL, the connection
-is a secure SSL/TLS connection:
+is a secure TLS connection:
From 89e9ee43c00159a561bbad75b43296acefd87ef7 Mon Sep 17 00:00:00 2001
From: Chad Bentz <1760475+felickz@users.noreply.github.com>
Date: Fri, 19 Sep 2025 18:28:45 -0400
Subject: [PATCH 053/160] Convert from GrapeHelperMethodTaintStep extends
AdditionalTaintStep to a simplified GrapeHelperMethodTarget extends
AdditionalCallTarget
---
.../2025-09-15-grape-framework-support.md | 2 +-
ruby/ql/lib/codeql/ruby/frameworks/Grape.qll | 39 +++++++------------
.../frameworks/grape/Flow.expected | 36 +++++++++++++++--
.../library-tests/frameworks/grape/app.rb | 4 +-
4 files changed, 49 insertions(+), 32 deletions(-)
diff --git a/ruby/ql/lib/change-notes/2025-09-15-grape-framework-support.md b/ruby/ql/lib/change-notes/2025-09-15-grape-framework-support.md
index 258da40d36c..08ceed887f2 100644
--- a/ruby/ql/lib/change-notes/2025-09-15-grape-framework-support.md
+++ b/ruby/ql/lib/change-notes/2025-09-15-grape-framework-support.md
@@ -1,4 +1,4 @@
---
category: feature
---
-* Initial modeling for the Ruby Grape framework in `Grape.qll` have been added to detect API endpoints, parameters, and headers within Grape API classes.
\ No newline at end of file
+* Initial modeling for the Ruby Grape framework in `Grape.qll` has been added to detect API endpoints, parameters, and headers within Grape API classes.
\ No newline at end of file
diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll b/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll
index a1646b8654c..31632e01948 100644
--- a/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll
+++ b/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll
@@ -3,6 +3,7 @@
*/
private import codeql.ruby.AST
+private import codeql.ruby.CFG
private import codeql.ruby.Concepts
private import codeql.ruby.controlflow.CfgNodes
private import codeql.ruby.DataFlow
@@ -301,32 +302,20 @@ private class GrapeHelperMethod extends Method {
}
/**
- * Additional taint step to model dataflow from method arguments to parameters
- * and from return values back to call sites for Grape helper methods defined in `helpers` blocks.
- * This bridges the gap where standard dataflow doesn't recognize the Grape DSL semantics.
+ * Additional call-target to resolve helper method calls defined in `helpers` blocks.
+ *
+ * This class is responsible for resolving calls to helper methods defined in
+ * `helpers` blocks, allowing the dataflow framework to accurately track
+ * the flow of information between these methods and their call sites.
*/
-private class GrapeHelperMethodTaintStep extends AdditionalTaintStep {
- override predicate step(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) {
- // Map arguments to parameters for helper method calls
- exists(GrapeHelperMethod helperMethod, MethodCall call, int i |
- // Find calls to helper methods from within Grape endpoints or other helper methods
- call.getMethodName() = helperMethod.getName() and
- exists(GrapeApiClass api | call.getParent+() = api.getADeclaration()) and
- // Map argument to parameter
- nodeFrom.asExpr().getExpr() = call.getArgument(i) and
- nodeTo.asParameter() = helperMethod.getParameter(i)
- )
- or
- // Model implicit return values: the last expression in a helper method flows to the call site
- exists(GrapeHelperMethod helperMethod, MethodCall helperCall, Expr lastExpr |
- // Find calls to helper methods from within Grape endpoints or other helper methods
- helperCall.getMethodName() = helperMethod.getName() and
- exists(GrapeApiClass api | helperCall.getParent+() = api.getADeclaration()) and
- // Get the last expression in the helper method (Ruby's implicit return)
- lastExpr = helperMethod.getLastStmt() and
- // Flow from the last expression in the helper method to the call site
- nodeFrom.asExpr().getExpr() = lastExpr and
- nodeTo.asExpr().getExpr() = helperCall
+private class GrapeHelperMethodTarget extends AdditionalCallTarget {
+ override DataFlowCallable viableTarget(CfgNodes::ExprNodes::CallCfgNode call) {
+ // Find calls to helper methods from within Grape endpoints or other helper methods
+ exists(GrapeHelperMethod helperMethod, MethodCall mc |
+ result.asCfgScope() = helperMethod and
+ mc = call.getAstNode() and
+ mc.getMethodName() = helperMethod.getName() and
+ mc.getParent+() = helperMethod.getApiClass().getADeclaration()
)
}
}
diff --git a/ruby/ql/test/library-tests/frameworks/grape/Flow.expected b/ruby/ql/test/library-tests/frameworks/grape/Flow.expected
index 0fd19d4eace..c104b36afb2 100644
--- a/ruby/ql/test/library-tests/frameworks/grape/Flow.expected
+++ b/ruby/ql/test/library-tests/frameworks/grape/Flow.expected
@@ -1,10 +1,15 @@
models
edges
| app.rb:103:13:103:18 | call to params | app.rb:103:13:103:70 | call to select | provenance | |
-| app.rb:103:13:103:70 | call to select | app.rb:149:21:149:31 | call to user_params | provenance | AdditionalTaintStep |
-| app.rb:103:13:103:70 | call to select | app.rb:165:21:165:31 | call to user_params | provenance | AdditionalTaintStep |
-| app.rb:107:13:107:32 | call to source | app.rb:143:18:143:43 | call to vulnerable_helper | provenance | AdditionalTaintStep |
-| app.rb:111:13:111:33 | call to source | app.rb:150:25:150:37 | call to simple_helper | provenance | AdditionalTaintStep |
+| app.rb:103:13:103:18 | call to params | app.rb:103:13:103:70 | call to select : [collection] [element] | provenance | |
+| app.rb:103:13:103:70 | call to select | app.rb:149:21:149:31 | call to user_params | provenance | |
+| app.rb:103:13:103:70 | call to select | app.rb:165:21:165:31 | call to user_params | provenance | |
+| app.rb:103:13:103:70 | call to select : [collection] [element] | app.rb:149:21:149:31 | call to user_params : [collection] [element] | provenance | |
+| app.rb:103:13:103:70 | call to select : [collection] [element] | app.rb:165:21:165:31 | call to user_params : [collection] [element] | provenance | |
+| app.rb:107:13:107:32 | call to source | app.rb:143:18:143:43 | call to vulnerable_helper | provenance | |
+| app.rb:107:13:107:32 | call to source | app.rb:143:18:143:43 | call to vulnerable_helper | provenance | |
+| app.rb:111:13:111:33 | call to source | app.rb:150:25:150:37 | call to simple_helper | provenance | |
+| app.rb:111:13:111:33 | call to source | app.rb:150:25:150:37 | call to simple_helper | provenance | |
| app.rb:126:9:126:15 | user_id | app.rb:133:14:133:20 | user_id | provenance | |
| app.rb:126:19:126:24 | call to params | app.rb:126:19:126:34 | ...[...] | provenance | |
| app.rb:126:19:126:34 | ...[...] | app.rb:126:9:126:15 | user_id | provenance | |
@@ -17,20 +22,31 @@ edges
| app.rb:129:19:129:25 | call to cookies | app.rb:129:19:129:38 | ...[...] | provenance | |
| app.rb:129:19:129:38 | ...[...] | app.rb:129:9:129:15 | session | provenance | |
| app.rb:143:9:143:14 | result | app.rb:144:14:144:19 | result | provenance | |
+| app.rb:143:9:143:14 | result | app.rb:144:14:144:19 | result | provenance | |
+| app.rb:143:18:143:43 | call to vulnerable_helper | app.rb:143:9:143:14 | result | provenance | |
| app.rb:143:18:143:43 | call to vulnerable_helper | app.rb:143:9:143:14 | result | provenance | |
| app.rb:149:9:149:17 | user_data | app.rb:151:14:151:22 | user_data | provenance | |
+| app.rb:149:9:149:17 | user_data : [collection] [element] | app.rb:151:14:151:22 | user_data | provenance | |
| app.rb:149:21:149:31 | call to user_params | app.rb:149:9:149:17 | user_data | provenance | |
+| app.rb:149:21:149:31 | call to user_params : [collection] [element] | app.rb:149:9:149:17 | user_data : [collection] [element] | provenance | |
| app.rb:150:9:150:21 | simple_result | app.rb:152:14:152:26 | simple_result | provenance | |
+| app.rb:150:9:150:21 | simple_result | app.rb:152:14:152:26 | simple_result | provenance | |
+| app.rb:150:25:150:37 | call to simple_helper | app.rb:150:9:150:21 | simple_result | provenance | |
| app.rb:150:25:150:37 | call to simple_helper | app.rb:150:9:150:21 | simple_result | provenance | |
| app.rb:159:13:159:19 | user_id | app.rb:160:18:160:24 | user_id | provenance | |
| app.rb:159:23:159:28 | call to params | app.rb:159:23:159:33 | ...[...] | provenance | |
| app.rb:159:23:159:33 | ...[...] | app.rb:159:13:159:19 | user_id | provenance | |
| app.rb:165:9:165:17 | user_data | app.rb:166:14:166:22 | user_data | provenance | |
+| app.rb:165:9:165:17 | user_data : [collection] [element] | app.rb:166:14:166:22 | user_data | provenance | |
| app.rb:165:21:165:31 | call to user_params | app.rb:165:9:165:17 | user_data | provenance | |
+| app.rb:165:21:165:31 | call to user_params : [collection] [element] | app.rb:165:9:165:17 | user_data : [collection] [element] | provenance | |
nodes
| app.rb:103:13:103:18 | call to params | semmle.label | call to params |
| app.rb:103:13:103:70 | call to select | semmle.label | call to select |
+| app.rb:103:13:103:70 | call to select : [collection] [element] | semmle.label | call to select : [collection] [element] |
| app.rb:107:13:107:32 | call to source | semmle.label | call to source |
+| app.rb:107:13:107:32 | call to source | semmle.label | call to source |
+| app.rb:111:13:111:33 | call to source | semmle.label | call to source |
| app.rb:111:13:111:33 | call to source | semmle.label | call to source |
| app.rb:126:9:126:15 | user_id | semmle.label | user_id |
| app.rb:126:19:126:24 | call to params | semmle.label | call to params |
@@ -48,20 +64,30 @@ nodes
| app.rb:135:14:135:17 | auth | semmle.label | auth |
| app.rb:136:14:136:20 | session | semmle.label | session |
| app.rb:143:9:143:14 | result | semmle.label | result |
+| app.rb:143:9:143:14 | result | semmle.label | result |
+| app.rb:143:18:143:43 | call to vulnerable_helper | semmle.label | call to vulnerable_helper |
| app.rb:143:18:143:43 | call to vulnerable_helper | semmle.label | call to vulnerable_helper |
| app.rb:144:14:144:19 | result | semmle.label | result |
+| app.rb:144:14:144:19 | result | semmle.label | result |
| app.rb:149:9:149:17 | user_data | semmle.label | user_data |
+| app.rb:149:9:149:17 | user_data : [collection] [element] | semmle.label | user_data : [collection] [element] |
| app.rb:149:21:149:31 | call to user_params | semmle.label | call to user_params |
+| app.rb:149:21:149:31 | call to user_params : [collection] [element] | semmle.label | call to user_params : [collection] [element] |
+| app.rb:150:9:150:21 | simple_result | semmle.label | simple_result |
| app.rb:150:9:150:21 | simple_result | semmle.label | simple_result |
| app.rb:150:25:150:37 | call to simple_helper | semmle.label | call to simple_helper |
+| app.rb:150:25:150:37 | call to simple_helper | semmle.label | call to simple_helper |
| app.rb:151:14:151:22 | user_data | semmle.label | user_data |
| app.rb:152:14:152:26 | simple_result | semmle.label | simple_result |
+| app.rb:152:14:152:26 | simple_result | semmle.label | simple_result |
| app.rb:159:13:159:19 | user_id | semmle.label | user_id |
| app.rb:159:23:159:28 | call to params | semmle.label | call to params |
| app.rb:159:23:159:33 | ...[...] | semmle.label | ...[...] |
| app.rb:160:18:160:24 | user_id | semmle.label | user_id |
| app.rb:165:9:165:17 | user_data | semmle.label | user_data |
+| app.rb:165:9:165:17 | user_data : [collection] [element] | semmle.label | user_data : [collection] [element] |
| app.rb:165:21:165:31 | call to user_params | semmle.label | call to user_params |
+| app.rb:165:21:165:31 | call to user_params : [collection] [element] | semmle.label | call to user_params : [collection] [element] |
| app.rb:166:14:166:22 | user_data | semmle.label | user_data |
subpaths
testFailures
@@ -71,7 +97,9 @@ testFailures
| app.rb:135:14:135:17 | auth | app.rb:128:16:128:22 | call to headers | app.rb:135:14:135:17 | auth | $@ | app.rb:128:16:128:22 | call to headers | call to headers |
| app.rb:136:14:136:20 | session | app.rb:129:19:129:25 | call to cookies | app.rb:136:14:136:20 | session | $@ | app.rb:129:19:129:25 | call to cookies | call to cookies |
| app.rb:144:14:144:19 | result | app.rb:107:13:107:32 | call to source | app.rb:144:14:144:19 | result | $@ | app.rb:107:13:107:32 | call to source | call to source |
+| app.rb:144:14:144:19 | result | app.rb:107:13:107:32 | call to source | app.rb:144:14:144:19 | result | $@ | app.rb:107:13:107:32 | call to source | call to source |
| app.rb:151:14:151:22 | user_data | app.rb:103:13:103:18 | call to params | app.rb:151:14:151:22 | user_data | $@ | app.rb:103:13:103:18 | call to params | call to params |
| app.rb:152:14:152:26 | simple_result | app.rb:111:13:111:33 | call to source | app.rb:152:14:152:26 | simple_result | $@ | app.rb:111:13:111:33 | call to source | call to source |
+| app.rb:152:14:152:26 | simple_result | app.rb:111:13:111:33 | call to source | app.rb:152:14:152:26 | simple_result | $@ | app.rb:111:13:111:33 | call to source | call to source |
| app.rb:160:18:160:24 | user_id | app.rb:159:23:159:28 | call to params | app.rb:160:18:160:24 | user_id | $@ | app.rb:159:23:159:28 | call to params | call to params |
| app.rb:166:14:166:22 | user_data | app.rb:103:13:103:18 | call to params | app.rb:166:14:166:22 | user_data | $@ | app.rb:103:13:103:18 | call to params | call to params |
diff --git a/ruby/ql/test/library-tests/frameworks/grape/app.rb b/ruby/ql/test/library-tests/frameworks/grape/app.rb
index 6fbb184cab9..81f46482687 100644
--- a/ruby/ql/test/library-tests/frameworks/grape/app.rb
+++ b/ruby/ql/test/library-tests/frameworks/grape/app.rb
@@ -141,7 +141,7 @@ class UserAPI < Grape::API
# Test helper method parameter passing dataflow
user_id = params[:user_id]
result = vulnerable_helper(user_id)
- sink result # $ hasTaintFlow=paramHelper
+ sink result # $ hasValueFlow=paramHelper
end
post '/users' do
@@ -149,7 +149,7 @@ class UserAPI < Grape::API
user_data = user_params
simple_result = simple_helper
sink user_data # $ hasTaintFlow
- sink simple_result # $ hasTaintFlow=simpleHelper
+ sink simple_result # $ hasValueFlow=simpleHelper
end
# Test route_param block pattern
From f4bbbc346fe5b270f6fbfc3ed351fdfdaee3fa46 Mon Sep 17 00:00:00 2001
From: Chad Bentz <1760475+felickz@users.noreply.github.com>
Date: Fri, 19 Sep 2025 19:06:50 -0400
Subject: [PATCH 054/160] Refactor Grape framework to be encapsulated properly
in Module
---
ruby/ql/lib/codeql/ruby/frameworks/Grape.qll | 550 +++++++++---------
.../library-tests/frameworks/grape/Grape.ql | 14 +-
2 files changed, 285 insertions(+), 279 deletions(-)
diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll b/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll
index 31632e01948..0999be94505 100644
--- a/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll
+++ b/ruby/ql/lib/codeql/ruby/frameworks/Grape.qll
@@ -29,293 +29,299 @@ module Grape {
not exists(GrapeApiClass parent | this != parent and this = parent.getADescendent())
}
}
-}
-/**
- * A class that extends `Grape::API`.
- * For example,
- *
- * ```rb
- * class FooAPI < Grape::API
- * get '/users' do
- * name = params[:name]
- * User.where("name = #{name}")
- * end
- * end
- * ```
- */
-class GrapeApiClass extends DataFlow::ClassNode {
- GrapeApiClass() {
- this = grapeApiBaseClass().getADescendentModule() and
- not exists(DataFlow::ModuleNode m | m = grapeApiBaseClass().asModule() | this = m)
+ /**
+ * A class that extends `Grape::API`.
+ * For example,
+ *
+ * ```rb
+ * class FooAPI < Grape::API
+ * get '/users' do
+ * name = params[:name]
+ * User.where("name = #{name}")
+ * end
+ * end
+ * ```
+ */
+ class GrapeApiClass extends DataFlow::ClassNode {
+ GrapeApiClass() {
+ this = grapeApiBaseClass().getADescendentModule() and
+ not exists(DataFlow::ModuleNode m | m = grapeApiBaseClass().asModule() | this = m)
+ }
+
+ /**
+ * Gets a `GrapeEndpoint` defined in this class.
+ */
+ GrapeEndpoint getAnEndpoint() { result.getApiClass() = this }
+
+ /**
+ * Gets a `self` that possibly refers to an instance of this class.
+ */
+ DataFlow::LocalSourceNode getSelf() {
+ result = this.getAnInstanceSelf()
+ or
+ // Include the module-level `self` to recover some cases where a block at the module level
+ // is invoked with an instance as the `self`.
+ result = this.getModuleLevelSelf()
+ }
+ }
+
+ private DataFlow::ConstRef grapeApiBaseClass() {
+ result = DataFlow::getConstant("Grape").getConstant("API")
+ }
+
+ private API::Node grapeApiInstance() { result = any(GrapeApiClass cls).getSelf().track() }
+
+ /**
+ * A Grape API endpoint (get, post, put, delete, etc.) call within a `Grape::API` class.
+ */
+ class GrapeEndpoint extends DataFlow::CallNode {
+ private GrapeApiClass apiClass;
+
+ GrapeEndpoint() {
+ this =
+ apiClass.getAModuleLevelCall(["get", "post", "put", "delete", "patch", "head", "options"])
+ }
+
+ /**
+ * Gets the HTTP method for this endpoint (e.g., "GET", "POST", etc.)
+ */
+ string getHttpMethod() { result = this.getMethodName().toUpperCase() }
+
+ /**
+ * Gets the API class containing this endpoint.
+ */
+ GrapeApiClass getApiClass() { result = apiClass }
+
+ /**
+ * Gets the block containing the endpoint logic.
+ */
+ DataFlow::BlockNode getBody() { result = this.getBlock() }
+
+ /**
+ * Gets the path pattern for this endpoint, if specified.
+ */
+ string getPath() { result = this.getArgument(0).getConstantValue().getString() }
}
/**
- * Gets a `GrapeEndpoint` defined in this class.
+ * A `RemoteFlowSource::Range` to represent accessing the
+ * Grape parameters available via the `params` method within an endpoint.
*/
- GrapeEndpoint getAnEndpoint() { result.getApiClass() = this }
+ class GrapeParamsSource extends Http::Server::RequestInputAccess::Range {
+ GrapeParamsSource() { this.asExpr().getExpr() instanceof GrapeParamsCall }
- /**
- * Gets a `self` that possibly refers to an instance of this class.
- */
- DataFlow::LocalSourceNode getSelf() {
- result = this.getAnInstanceSelf()
- or
- // Include the module-level `self` to recover some cases where a block at the module level
- // is invoked with an instance as the `self`.
- result = this.getModuleLevelSelf()
- }
-}
+ override string getSourceType() { result = "Grape::API#params" }
-private DataFlow::ConstRef grapeApiBaseClass() {
- result = DataFlow::getConstant("Grape").getConstant("API")
-}
-
-private API::Node grapeApiInstance() { result = any(GrapeApiClass cls).getSelf().track() }
-
-/**
- * A Grape API endpoint (get, post, put, delete, etc.) call within a `Grape::API` class.
- */
-class GrapeEndpoint extends DataFlow::CallNode {
- private GrapeApiClass apiClass;
-
- GrapeEndpoint() {
- this =
- apiClass.getAModuleLevelCall(["get", "post", "put", "delete", "patch", "head", "options"])
+ override Http::Server::RequestInputKind getKind() {
+ result = Http::Server::parameterInputKind()
+ }
}
/**
- * Gets the HTTP method for this endpoint (e.g., "GET", "POST", etc.)
+ * A call to `params` from within a Grape API endpoint or helper method.
*/
- string getHttpMethod() { result = this.getMethodName().toUpperCase() }
-
- /**
- * Gets the API class containing this endpoint.
- */
- GrapeApiClass getApiClass() { result = apiClass }
-
- /**
- * Gets the block containing the endpoint logic.
- */
- DataFlow::BlockNode getBody() { result = this.getBlock() }
-
- /**
- * Gets the path pattern for this endpoint, if specified.
- */
- string getPath() { result = this.getArgument(0).getConstantValue().getString() }
-}
-
-/**
- * A `RemoteFlowSource::Range` to represent accessing the
- * Grape parameters available via the `params` method within an endpoint.
- */
-class GrapeParamsSource extends Http::Server::RequestInputAccess::Range {
- GrapeParamsSource() { this.asExpr().getExpr() instanceof GrapeParamsCall }
-
- override string getSourceType() { result = "Grape::API#params" }
-
- override Http::Server::RequestInputKind getKind() { result = Http::Server::parameterInputKind() }
-}
-
-/**
- * A call to `params` from within a Grape API endpoint or helper method.
- */
-private class GrapeParamsCall extends ParamsCallImpl {
- GrapeParamsCall() {
- // Params calls within endpoint blocks
- exists(GrapeApiClass api |
- this.getMethodName() = "params" and
- this.getParent+() = api.getADeclaration()
- )
- or
- // Params calls within helper methods (defined in helpers blocks)
- exists(GrapeApiClass api, DataFlow::CallNode helpersCall |
- helpersCall = api.getAModuleLevelCall("helpers") and
- this.getMethodName() = "params" and
- this.getParent+() = helpersCall.getBlock().asExpr().getExpr()
- )
- }
-}
-
-/**
- * A call to `headers` from within a Grape API endpoint or headers block.
- * Headers can also be a source of user input.
- */
-class GrapeHeadersSource extends Http::Server::RequestInputAccess::Range {
- GrapeHeadersSource() {
- this.asExpr().getExpr() instanceof GrapeHeadersCall
- or
- this.asExpr().getExpr() instanceof GrapeHeadersBlockCall
- }
-
- override string getSourceType() { result = "Grape::API#headers" }
-
- override Http::Server::RequestInputKind getKind() { result = Http::Server::headerInputKind() }
-}
-
-/**
- * A call to `headers` from within a Grape API endpoint.
- */
-private class GrapeHeadersCall extends MethodCall {
- GrapeHeadersCall() {
- exists(GrapeEndpoint endpoint |
- this.getParent+() = endpoint.getBody().asCallableAstNode() and
- this.getMethodName() = "headers"
- )
- or
- // Also handle cases where headers is called on an instance of a Grape API class
- this = grapeApiInstance().getAMethodCall("headers").asExpr().getExpr()
- }
-}
-
-/**
- * A call to `request` from within a Grape API endpoint.
- * The request object can contain user input.
- */
-class GrapeRequestSource extends Http::Server::RequestInputAccess::Range {
- GrapeRequestSource() { this.asExpr().getExpr() instanceof GrapeRequestCall }
-
- override string getSourceType() { result = "Grape::API#request" }
-
- override Http::Server::RequestInputKind getKind() { result = Http::Server::parameterInputKind() }
-}
-
-/**
- * A call to `route_param` from within a Grape API endpoint.
- * Route parameters are extracted from the URL path and can be a source of user input.
- */
-class GrapeRouteParamSource extends Http::Server::RequestInputAccess::Range {
- GrapeRouteParamSource() { this.asExpr().getExpr() instanceof GrapeRouteParamCall }
-
- override string getSourceType() { result = "Grape::API#route_param" }
-
- override Http::Server::RequestInputKind getKind() { result = Http::Server::parameterInputKind() }
-}
-
-/**
- * A call to `request` from within a Grape API endpoint.
- */
-private class GrapeRequestCall extends MethodCall {
- GrapeRequestCall() {
- exists(GrapeEndpoint endpoint |
- this.getParent+() = endpoint.getBody().asCallableAstNode() and
- this.getMethodName() = "request"
- )
- or
- // Also handle cases where request is called on an instance of a Grape API class
- this = grapeApiInstance().getAMethodCall("request").asExpr().getExpr()
- }
-}
-
-/**
- * A call to `route_param` from within a Grape API endpoint.
- */
-private class GrapeRouteParamCall extends MethodCall {
- GrapeRouteParamCall() {
- exists(GrapeEndpoint endpoint |
- this.getParent+() = endpoint.getBody().asExpr().getExpr() and
- this.getMethodName() = "route_param"
- )
- or
- // Also handle cases where route_param is called on an instance of a Grape API class
- this = grapeApiInstance().getAMethodCall("route_param").asExpr().getExpr()
- }
-}
-
-/**
- * A call to `headers` block within a Grape API class.
- * This is different from the headers() method call - this is the DSL block for defining header requirements.
- */
-private class GrapeHeadersBlockCall extends MethodCall {
- GrapeHeadersBlockCall() {
- exists(GrapeApiClass api |
- this.getParent+() = api.getADeclaration() and
- this.getMethodName() = "headers" and
- exists(this.getBlock())
- )
- }
-}
-
-/**
- * A call to `cookies` block within a Grape API class.
- * This DSL block defines cookie requirements and those cookies are user-controlled.
- */
-private class GrapeCookiesBlockCall extends MethodCall {
- GrapeCookiesBlockCall() {
- exists(GrapeApiClass api |
- this.getParent+() = api.getADeclaration() and
- this.getMethodName() = "cookies" and
- exists(this.getBlock())
- )
- }
-}
-
-/**
- * A call to `cookies` method from within a Grape API endpoint or cookies block.
- * Similar to headers, cookies can be accessed as a method and are user-controlled input.
- */
-class GrapeCookiesSource extends Http::Server::RequestInputAccess::Range {
- GrapeCookiesSource() {
- this.asExpr().getExpr() instanceof GrapeCookiesCall
- or
- this.asExpr().getExpr() instanceof GrapeCookiesBlockCall
- }
-
- override string getSourceType() { result = "Grape::API#cookies" }
-
- override Http::Server::RequestInputKind getKind() { result = Http::Server::cookieInputKind() }
-}
-
-/**
- * A call to `cookies` method from within a Grape API endpoint.
- */
-private class GrapeCookiesCall extends MethodCall {
- GrapeCookiesCall() {
- exists(GrapeEndpoint endpoint |
- this.getParent+() = endpoint.getBody().asCallableAstNode() and
- this.getMethodName() = "cookies"
- )
- or
- // Also handle cases where cookies is called on an instance of a Grape API class
- this = grapeApiInstance().getAMethodCall("cookies").asExpr().getExpr()
- }
-}
-
-/**
- * A method defined within a `helpers` block in a Grape API class.
- * These methods become available in endpoint contexts through Grape's DSL.
- */
-private class GrapeHelperMethod extends Method {
- private GrapeApiClass apiClass;
-
- GrapeHelperMethod() {
- exists(DataFlow::CallNode helpersCall |
- helpersCall = apiClass.getAModuleLevelCall("helpers") and
- this.getParent+() = helpersCall.getBlock().asExpr().getExpr()
- )
+ private class GrapeParamsCall extends ParamsCallImpl {
+ GrapeParamsCall() {
+ // Params calls within endpoint blocks
+ exists(GrapeApiClass api |
+ this.getMethodName() = "params" and
+ this.getParent+() = api.getADeclaration()
+ )
+ or
+ // Params calls within helper methods (defined in helpers blocks)
+ exists(GrapeApiClass api, DataFlow::CallNode helpersCall |
+ helpersCall = api.getAModuleLevelCall("helpers") and
+ this.getMethodName() = "params" and
+ this.getParent+() = helpersCall.getBlock().asExpr().getExpr()
+ )
+ }
}
/**
- * Gets the API class that contains this helper method.
+ * A call to `headers` from within a Grape API endpoint or headers block.
+ * Headers can also be a source of user input.
*/
- GrapeApiClass getApiClass() { result = apiClass }
-}
+ class GrapeHeadersSource extends Http::Server::RequestInputAccess::Range {
+ GrapeHeadersSource() {
+ this.asExpr().getExpr() instanceof GrapeHeadersCall
+ or
+ this.asExpr().getExpr() instanceof GrapeHeadersBlockCall
+ }
-/**
- * Additional call-target to resolve helper method calls defined in `helpers` blocks.
- *
- * This class is responsible for resolving calls to helper methods defined in
- * `helpers` blocks, allowing the dataflow framework to accurately track
- * the flow of information between these methods and their call sites.
- */
-private class GrapeHelperMethodTarget extends AdditionalCallTarget {
- override DataFlowCallable viableTarget(CfgNodes::ExprNodes::CallCfgNode call) {
- // Find calls to helper methods from within Grape endpoints or other helper methods
- exists(GrapeHelperMethod helperMethod, MethodCall mc |
- result.asCfgScope() = helperMethod and
- mc = call.getAstNode() and
- mc.getMethodName() = helperMethod.getName() and
- mc.getParent+() = helperMethod.getApiClass().getADeclaration()
- )
+ override string getSourceType() { result = "Grape::API#headers" }
+
+ override Http::Server::RequestInputKind getKind() { result = Http::Server::headerInputKind() }
+ }
+
+ /**
+ * A call to `headers` from within a Grape API endpoint.
+ */
+ private class GrapeHeadersCall extends MethodCall {
+ GrapeHeadersCall() {
+ exists(GrapeEndpoint endpoint |
+ this.getParent+() = endpoint.getBody().asCallableAstNode() and
+ this.getMethodName() = "headers"
+ )
+ or
+ // Also handle cases where headers is called on an instance of a Grape API class
+ this = grapeApiInstance().getAMethodCall("headers").asExpr().getExpr()
+ }
+ }
+
+ /**
+ * A call to `request` from within a Grape API endpoint.
+ * The request object can contain user input.
+ */
+ class GrapeRequestSource extends Http::Server::RequestInputAccess::Range {
+ GrapeRequestSource() { this.asExpr().getExpr() instanceof GrapeRequestCall }
+
+ override string getSourceType() { result = "Grape::API#request" }
+
+ override Http::Server::RequestInputKind getKind() {
+ result = Http::Server::parameterInputKind()
+ }
+ }
+
+ /**
+ * A call to `route_param` from within a Grape API endpoint.
+ * Route parameters are extracted from the URL path and can be a source of user input.
+ */
+ class GrapeRouteParamSource extends Http::Server::RequestInputAccess::Range {
+ GrapeRouteParamSource() { this.asExpr().getExpr() instanceof GrapeRouteParamCall }
+
+ override string getSourceType() { result = "Grape::API#route_param" }
+
+ override Http::Server::RequestInputKind getKind() {
+ result = Http::Server::parameterInputKind()
+ }
+ }
+
+ /**
+ * A call to `request` from within a Grape API endpoint.
+ */
+ private class GrapeRequestCall extends MethodCall {
+ GrapeRequestCall() {
+ exists(GrapeEndpoint endpoint |
+ this.getParent+() = endpoint.getBody().asCallableAstNode() and
+ this.getMethodName() = "request"
+ )
+ or
+ // Also handle cases where request is called on an instance of a Grape API class
+ this = grapeApiInstance().getAMethodCall("request").asExpr().getExpr()
+ }
+ }
+
+ /**
+ * A call to `route_param` from within a Grape API endpoint.
+ */
+ private class GrapeRouteParamCall extends MethodCall {
+ GrapeRouteParamCall() {
+ exists(GrapeEndpoint endpoint |
+ this.getParent+() = endpoint.getBody().asExpr().getExpr() and
+ this.getMethodName() = "route_param"
+ )
+ or
+ // Also handle cases where route_param is called on an instance of a Grape API class
+ this = grapeApiInstance().getAMethodCall("route_param").asExpr().getExpr()
+ }
+ }
+
+ /**
+ * A call to `headers` block within a Grape API class.
+ * This is different from the headers() method call - this is the DSL block for defining header requirements.
+ */
+ private class GrapeHeadersBlockCall extends MethodCall {
+ GrapeHeadersBlockCall() {
+ exists(GrapeApiClass api |
+ this.getParent+() = api.getADeclaration() and
+ this.getMethodName() = "headers" and
+ exists(this.getBlock())
+ )
+ }
+ }
+
+ /**
+ * A call to `cookies` block within a Grape API class.
+ * This DSL block defines cookie requirements and those cookies are user-controlled.
+ */
+ private class GrapeCookiesBlockCall extends MethodCall {
+ GrapeCookiesBlockCall() {
+ exists(GrapeApiClass api |
+ this.getParent+() = api.getADeclaration() and
+ this.getMethodName() = "cookies" and
+ exists(this.getBlock())
+ )
+ }
+ }
+
+ /**
+ * A call to `cookies` method from within a Grape API endpoint or cookies block.
+ * Similar to headers, cookies can be accessed as a method and are user-controlled input.
+ */
+ class GrapeCookiesSource extends Http::Server::RequestInputAccess::Range {
+ GrapeCookiesSource() {
+ this.asExpr().getExpr() instanceof GrapeCookiesCall
+ or
+ this.asExpr().getExpr() instanceof GrapeCookiesBlockCall
+ }
+
+ override string getSourceType() { result = "Grape::API#cookies" }
+
+ override Http::Server::RequestInputKind getKind() { result = Http::Server::cookieInputKind() }
+ }
+
+ /**
+ * A call to `cookies` method from within a Grape API endpoint.
+ */
+ private class GrapeCookiesCall extends MethodCall {
+ GrapeCookiesCall() {
+ exists(GrapeEndpoint endpoint |
+ this.getParent+() = endpoint.getBody().asCallableAstNode() and
+ this.getMethodName() = "cookies"
+ )
+ or
+ // Also handle cases where cookies is called on an instance of a Grape API class
+ this = grapeApiInstance().getAMethodCall("cookies").asExpr().getExpr()
+ }
+ }
+
+ /**
+ * A method defined within a `helpers` block in a Grape API class.
+ * These methods become available in endpoint contexts through Grape's DSL.
+ */
+ private class GrapeHelperMethod extends Method {
+ private GrapeApiClass apiClass;
+
+ GrapeHelperMethod() {
+ exists(DataFlow::CallNode helpersCall |
+ helpersCall = apiClass.getAModuleLevelCall("helpers") and
+ this.getParent+() = helpersCall.getBlock().asExpr().getExpr()
+ )
+ }
+
+ /**
+ * Gets the API class that contains this helper method.
+ */
+ GrapeApiClass getApiClass() { result = apiClass }
+ }
+
+ /**
+ * Additional call-target to resolve helper method calls defined in `helpers` blocks.
+ *
+ * This class is responsible for resolving calls to helper methods defined in
+ * `helpers` blocks, allowing the dataflow framework to accurately track
+ * the flow of information between these methods and their call sites.
+ */
+ private class GrapeHelperMethodTarget extends AdditionalCallTarget {
+ override DataFlowCallable viableTarget(CfgNodes::ExprNodes::CallCfgNode call) {
+ // Find calls to helper methods from within Grape endpoints or other helper methods
+ exists(GrapeHelperMethod helperMethod, MethodCall mc |
+ result.asCfgScope() = helperMethod and
+ mc = call.getAstNode() and
+ mc.getMethodName() = helperMethod.getName() and
+ mc.getParent+() = helperMethod.getApiClass().getADeclaration()
+ )
+ }
}
}
diff --git a/ruby/ql/test/library-tests/frameworks/grape/Grape.ql b/ruby/ql/test/library-tests/frameworks/grape/Grape.ql
index c9aa7c29082..c5f0798f7a6 100644
--- a/ruby/ql/test/library-tests/frameworks/grape/Grape.ql
+++ b/ruby/ql/test/library-tests/frameworks/grape/Grape.ql
@@ -3,20 +3,20 @@ import codeql.ruby.frameworks.Grape
import codeql.ruby.Concepts
import codeql.ruby.AST
-query predicate grapeApiClasses(GrapeApiClass api) { any() }
+query predicate grapeApiClasses(Grape::GrapeApiClass api) { any() }
-query predicate grapeEndpoints(GrapeApiClass api, GrapeEndpoint endpoint, string method, string path) {
+query predicate grapeEndpoints(Grape::GrapeApiClass api, Grape::GrapeEndpoint endpoint, string method, string path) {
endpoint = api.getAnEndpoint() and
method = endpoint.getHttpMethod() and
path = endpoint.getPath()
}
-query predicate grapeParams(GrapeParamsSource params) { any() }
+query predicate grapeParams(Grape::GrapeParamsSource params) { any() }
-query predicate grapeHeaders(GrapeHeadersSource headers) { any() }
+query predicate grapeHeaders(Grape::GrapeHeadersSource headers) { any() }
-query predicate grapeRequest(GrapeRequestSource request) { any() }
+query predicate grapeRequest(Grape::GrapeRequestSource request) { any() }
-query predicate grapeRouteParam(GrapeRouteParamSource routeParam) { any() }
+query predicate grapeRouteParam(Grape::GrapeRouteParamSource routeParam) { any() }
-query predicate grapeCookies(GrapeCookiesSource cookies) { any() }
+query predicate grapeCookies(Grape::GrapeCookiesSource cookies) { any() }
From bdeeb3217ec087d58345cdfcf813d3a56a5050ad Mon Sep 17 00:00:00 2001
From: Tom Hvitved
Date: Fri, 19 Sep 2025 15:06:47 +0200
Subject: [PATCH 055/160] Rust: Add path resolution tests
---
.../PathResolutionInlineExpectationsTest.qll | 12 +++++++----
.../library-tests/path-resolution/my2/mod.rs | 2 ++
.../path-resolution/my2/my3/mod.rs | 4 ++++
.../path-resolution/path-resolution.expected | 20 +++++++++++--------
4 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll b/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll
index 8d2fdb2d2eb..df668194c07 100644
--- a/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll
+++ b/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll
@@ -25,10 +25,14 @@ private module ResolveTest implements TestSig {
private predicate item(ItemNode i, string value) {
exists(string filepath, int line, boolean inMacro | itemAt(i, filepath, line, inMacro) |
- commmentAt(value, filepath, line)
- or
- not commmentAt(_, filepath, line) and
- value = i.getName()
+ if i instanceof SourceFile
+ then value = i.getFile().getBaseName()
+ else (
+ commmentAt(value, filepath, line)
+ or
+ not commmentAt(_, filepath, line) and
+ value = i.getName()
+ )
)
}
diff --git a/rust/ql/test/library-tests/path-resolution/my2/mod.rs b/rust/ql/test/library-tests/path-resolution/my2/mod.rs
index 85edb683202..6b86c78237c 100644
--- a/rust/ql/test/library-tests/path-resolution/my2/mod.rs
+++ b/rust/ql/test/library-tests/path-resolution/my2/mod.rs
@@ -15,6 +15,8 @@ pub use nested2::nested7::nested8::{ // $ item=I118
use nested2::nested5::nested6::f as nested6_f; // $ item=I116
+use std::ops::Deref; // $ item=Deref
+
pub mod my3;
#[path = "renamed.rs"]
diff --git a/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs b/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs
index b459ca05aa6..1a98df1b560 100644
--- a/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs
+++ b/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs
@@ -8,3 +8,7 @@ use super::super::h; // $ item=I25
use super::g; // $ item=I9
use super::nested6_f; // $ item=I116
+
+use super::*; // $ item=mod.rs
+
+trait MyTrait: Deref {} // $ MISSING: item=Deref
diff --git a/rust/ql/test/library-tests/path-resolution/path-resolution.expected b/rust/ql/test/library-tests/path-resolution/path-resolution.expected
index a908ec1e5c1..1a925a31cce 100644
--- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected
+++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected
@@ -33,8 +33,8 @@ mod
| main.rs:712:1:764:1 | mod associated_types |
| main.rs:770:1:789:1 | mod impl_with_attribute_macro |
| my2/mod.rs:1:1:1:16 | mod nested2 |
-| my2/mod.rs:18:1:18:12 | mod my3 |
-| my2/mod.rs:20:1:21:10 | mod mymod |
+| my2/mod.rs:20:1:20:12 | mod my3 |
+| my2/mod.rs:22:1:23:10 | mod mymod |
| my2/nested2.rs:1:1:11:1 | mod nested3 |
| my2/nested2.rs:2:5:10:5 | mod nested4 |
| my2/nested2.rs:13:1:19:1 | mod nested5 |
@@ -406,7 +406,7 @@ resolvePath
| main.rs:814:5:814:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
| main.rs:815:5:815:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 |
| main.rs:815:5:815:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f |
-| main.rs:816:5:816:7 | my3 | my2/mod.rs:18:1:18:12 | mod my3 |
+| main.rs:816:5:816:7 | my3 | my2/mod.rs:20:1:20:12 | mod my3 |
| main.rs:816:5:816:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f |
| main.rs:817:5:817:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f |
| main.rs:818:5:818:7 | m18 | main.rs:553:1:571:1 | mod m18 |
@@ -440,17 +440,21 @@ resolvePath
| my2/mod.rs:16:5:16:20 | ...::nested5 | my2/nested2.rs:13:1:19:1 | mod nested5 |
| my2/mod.rs:16:5:16:29 | ...::nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 |
| my2/mod.rs:16:5:16:32 | ...::f | my2/nested2.rs:15:9:17:9 | fn f |
-| my2/mod.rs:23:9:23:13 | mymod | my2/mod.rs:20:1:21:10 | mod mymod |
-| my2/mod.rs:23:9:23:16 | ...::f | my2/renamed.rs:1:1:1:13 | fn f |
+| my2/mod.rs:18:5:18:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) |
+| my2/mod.rs:18:5:18:12 | ...::ops | {EXTERNAL LOCATION} | mod ops |
+| my2/mod.rs:18:5:18:19 | ...::Deref | {EXTERNAL LOCATION} | trait Deref |
+| my2/mod.rs:25:9:25:13 | mymod | my2/mod.rs:22:1:23:10 | mod mymod |
+| my2/mod.rs:25:9:25:16 | ...::f | my2/renamed.rs:1:1:1:13 | fn f |
| my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g |
| my2/my3/mod.rs:4:5:4:5 | h | main.rs:56:1:75:1 | fn h |
-| my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:23:34 | SourceFile |
+| my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:25:34 | SourceFile |
| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:826:2 | SourceFile |
| my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:56:1:75:1 | fn h |
-| my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:23:34 | SourceFile |
+| my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:25:34 | SourceFile |
| my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g |
-| my2/my3/mod.rs:10:5:10:9 | super | my2/mod.rs:1:1:23:34 | SourceFile |
+| my2/my3/mod.rs:10:5:10:9 | super | my2/mod.rs:1:1:25:34 | SourceFile |
| my2/my3/mod.rs:10:5:10:20 | ...::nested6_f | my2/nested2.rs:15:9:17:9 | fn f |
+| my2/my3/mod.rs:12:5:12:9 | super | my2/mod.rs:1:1:25:34 | SourceFile |
| my.rs:3:5:3:10 | nested | my.rs:1:1:1:15 | mod nested |
| my.rs:3:5:3:13 | ...::g | my/nested.rs:19:1:22:1 | fn g |
| my.rs:11:5:11:5 | g | my/nested.rs:19:1:22:1 | fn g |
From 223ab5e60cc654b3255520c581ba8cdbd9716335 Mon Sep 17 00:00:00 2001
From: Tom Hvitved
Date: Sun, 21 Sep 2025 15:22:40 +0200
Subject: [PATCH 056/160] Rust: Add missing model
---
rust/ql/lib/codeql/rust/frameworks/async-rs.model.yml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/rust/ql/lib/codeql/rust/frameworks/async-rs.model.yml b/rust/ql/lib/codeql/rust/frameworks/async-rs.model.yml
index 9e65ba1b196..706170d44b8 100644
--- a/rust/ql/lib/codeql/rust/frameworks/async-rs.model.yml
+++ b/rust/ql/lib/codeql/rust/frameworks/async-rs.model.yml
@@ -4,3 +4,9 @@ extensions:
extensible: sourceModel
data:
- ["::connect", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "remote", "manual"]
+ - addsTo:
+ pack: codeql/rust-all
+ extensible: summaryModel
+ data:
+ - ["<_ as async_std::io::read::ReadExt>::read", "Argument[self]", "Argument[0].Reference", "taint", "manual"]
+ - ["<_ as async_std::io::read::ReadExt>::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"]
\ No newline at end of file
From 8d5d219c0f1d5372249c12a6f59ef3bf1046cd04 Mon Sep 17 00:00:00 2001
From: Tom Hvitved
Date: Sun, 21 Sep 2025 15:36:22 +0200
Subject: [PATCH 057/160] Rust: Update expected test output
---
.../dataflow/sources/InlineFlow.expected | 600 +++++++++---------
1 file changed, 308 insertions(+), 292 deletions(-)
diff --git a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected
index db0cb969d5a..af0e73ca2c0 100644
--- a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected
+++ b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected
@@ -33,108 +33,110 @@ models
| 32 | Source: tokio::fs::read_link::read_link; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file |
| 33 | Source: tokio::fs::read_to_string::read_to_string; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file |
| 34 | Source: tokio::io::stdin::stdin; ReturnValue; stdin |
-| 35 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value |
-| 36 | Summary: <_ as core::iter::traits::iterator::Iterator>::collect; Argument[self].Element; ReturnValue.Element; value |
-| 37 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value |
-| 38 | Summary: <_ as futures_io::if_std::AsyncBufRead>::poll_fill_buf; Argument[self].Reference; ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]; taint |
-| 39 | Summary: <_ as futures_util::io::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 40 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self].Reference; Argument[0].Reference; taint |
-| 41 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint |
-| 42 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self].Reference; Argument[1].Reference; taint |
-| 43 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint |
-| 44 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint |
-| 45 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint |
-| 46 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint |
-| 47 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint |
-| 48 | Summary: <_ as std::io::BufRead>::lines; Argument[self]; ReturnValue; taint |
-| 49 | Summary: <_ as std::io::BufRead>::read_line; Argument[self]; Argument[0].Reference; taint |
-| 50 | Summary: <_ as std::io::BufRead>::read_until; Argument[self]; Argument[1].Reference; taint |
-| 51 | Summary: <_ as std::io::BufRead>::split; Argument[self]; ReturnValue; taint |
-| 52 | Summary: <_ as std::io::Read>::bytes; Argument[self]; ReturnValue; taint |
-| 53 | Summary: <_ as std::io::Read>::chain; Argument[0]; ReturnValue; taint |
-| 54 | Summary: <_ as std::io::Read>::chain; Argument[self]; ReturnValue; taint |
-| 55 | Summary: <_ as std::io::Read>::read; Argument[self]; Argument[0].Reference; taint |
-| 56 | Summary: <_ as std::io::Read>::read_exact; Argument[self]; Argument[0].Reference; taint |
-| 57 | Summary: <_ as std::io::Read>::read_to_end; Argument[self]; Argument[0].Reference; taint |
-| 58 | Summary: <_ as std::io::Read>::read_to_string; Argument[self]; Argument[0].Reference; taint |
-| 59 | Summary: <_ as std::io::Read>::take; Argument[self]; ReturnValue; taint |
-| 60 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 61 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::lines; Argument[self]; ReturnValue; taint |
-| 62 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint |
-| 63 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint |
-| 64 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::split; Argument[self]; ReturnValue; taint |
-| 65 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint |
-| 66 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf; Argument[self]; Argument[0].Reference; taint |
-| 67 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact; Argument[self]; Argument[0].Reference; taint |
-| 68 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 69 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 70 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 71 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint |
-| 72 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self]; Argument[0].Reference; taint |
-| 73 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 74 | Summary: ::as_bytes; Argument[self]; ReturnValue; value |
-| 75 | Summary: ::as_str; Argument[self]; ReturnValue; value |
-| 76 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
-| 77 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
-| 78 | Summary: ::new; Argument[0].Reference; ReturnValue; value |
-| 79 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::__pointer]; value |
-| 80 | Summary: ::new; Argument[0]; ReturnValue; value |
-| 81 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
-| 82 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
-| 83 | Summary: ::as_bytes; Argument[self]; ReturnValue; value |
-| 84 | Summary: ::as_str; Argument[self]; ReturnValue; value |
-| 85 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
-| 86 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 87 | Summary: ::new; Argument[0]; ReturnValue; taint |
-| 88 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 89 | Summary: ::chunk; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint |
-| 90 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
-| 91 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
-| 92 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
-| 93 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
-| 94 | Summary: ::read; Argument[self]; Argument[0].Reference; taint |
-| 95 | Summary: ::read; Argument[self]; Argument[0]; taint |
-| 96 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint |
-| 97 | Summary: ::read_to_end; Argument[self]; Argument[0]; taint |
-| 98 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint |
-| 99 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint |
-| 100 | Summary: ::next; Argument[self]; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; taint |
-| 101 | Summary: ::fill_buf; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
-| 102 | Summary: ::buffer; Argument[self]; ReturnValue; taint |
-| 103 | Summary: ::new; Argument[0]; ReturnValue; taint |
-| 104 | Summary: ::read; Argument[self]; Argument[0].Reference; taint |
-| 105 | Summary: ::read; Argument[self]; Argument[0]; taint |
-| 106 | Summary: ::read_exact; Argument[self]; Argument[0].Reference; taint |
-| 107 | Summary: ::read_exact; Argument[self]; Argument[0]; taint |
-| 108 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint |
-| 109 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint |
-| 110 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint |
-| 111 | Summary: ::lock; Argument[self]; ReturnValue; taint |
-| 112 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint |
-| 113 | Summary: ::read; Argument[self]; Argument[0].Reference; taint |
-| 114 | Summary: ::as_path; Argument[self]; ReturnValue; value |
-| 115 | Summary: ::buffer; Argument[self]; ReturnValue; taint |
-| 116 | Summary: ::new; Argument[0]; ReturnValue; taint |
-| 117 | Summary: ::next_line; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint |
-| 118 | Summary: ::next_segment; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint |
-| 119 | Summary: ::peek; Argument[self]; Argument[0].Reference; taint |
-| 120 | Summary: ::try_read; Argument[self]; Argument[0].Reference; taint |
-| 121 | Summary: ::try_read_buf; Argument[self]; Argument[0].Reference; taint |
+| 35 | Summary: <_ as async_std::io::read::ReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint |
+| 36 | Summary: <_ as async_std::io::read::ReadExt>::read; Argument[self]; Argument[0].Reference; taint |
+| 37 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value |
+| 38 | Summary: <_ as core::iter::traits::iterator::Iterator>::collect; Argument[self].Element; ReturnValue.Element; value |
+| 39 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value |
+| 40 | Summary: <_ as futures_io::if_std::AsyncBufRead>::poll_fill_buf; Argument[self].Reference; ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]; taint |
+| 41 | Summary: <_ as futures_util::io::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 42 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self].Reference; Argument[0].Reference; taint |
+| 43 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint |
+| 44 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self].Reference; Argument[1].Reference; taint |
+| 45 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint |
+| 46 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint |
+| 47 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint |
+| 48 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint |
+| 49 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint |
+| 50 | Summary: <_ as std::io::BufRead>::lines; Argument[self]; ReturnValue; taint |
+| 51 | Summary: <_ as std::io::BufRead>::read_line; Argument[self]; Argument[0].Reference; taint |
+| 52 | Summary: <_ as std::io::BufRead>::read_until; Argument[self]; Argument[1].Reference; taint |
+| 53 | Summary: <_ as std::io::BufRead>::split; Argument[self]; ReturnValue; taint |
+| 54 | Summary: <_ as std::io::Read>::bytes; Argument[self]; ReturnValue; taint |
+| 55 | Summary: <_ as std::io::Read>::chain; Argument[0]; ReturnValue; taint |
+| 56 | Summary: <_ as std::io::Read>::chain; Argument[self]; ReturnValue; taint |
+| 57 | Summary: <_ as std::io::Read>::read; Argument[self]; Argument[0].Reference; taint |
+| 58 | Summary: <_ as std::io::Read>::read_exact; Argument[self]; Argument[0].Reference; taint |
+| 59 | Summary: <_ as std::io::Read>::read_to_end; Argument[self]; Argument[0].Reference; taint |
+| 60 | Summary: <_ as std::io::Read>::read_to_string; Argument[self]; Argument[0].Reference; taint |
+| 61 | Summary: <_ as std::io::Read>::take; Argument[self]; ReturnValue; taint |
+| 62 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 63 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::lines; Argument[self]; ReturnValue; taint |
+| 64 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint |
+| 65 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint |
+| 66 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::split; Argument[self]; ReturnValue; taint |
+| 67 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint |
+| 68 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf; Argument[self]; Argument[0].Reference; taint |
+| 69 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact; Argument[self]; Argument[0].Reference; taint |
+| 70 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 71 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 72 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 73 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint |
+| 74 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self]; Argument[0].Reference; taint |
+| 75 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 76 | Summary: ::as_bytes; Argument[self]; ReturnValue; value |
+| 77 | Summary: ::as_str; Argument[self]; ReturnValue; value |
+| 78 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
+| 79 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value |
+| 80 | Summary: ::new; Argument[0].Reference; ReturnValue; value |
+| 81 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::__pointer]; value |
+| 82 | Summary: ::new; Argument[0]; ReturnValue; value |
+| 83 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
+| 84 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value |
+| 85 | Summary: ::as_bytes; Argument[self]; ReturnValue; value |
+| 86 | Summary: ::as_str; Argument[self]; ReturnValue; value |
+| 87 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
+| 88 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 89 | Summary: ::new; Argument[0]; ReturnValue; taint |
+| 90 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 91 | Summary: ::chunk; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint |
+| 92 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint |
+| 93 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
+| 94 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
+| 95 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
+| 96 | Summary: ::read; Argument[self]; Argument[0].Reference; taint |
+| 97 | Summary: ::read; Argument[self]; Argument[0]; taint |
+| 98 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint |
+| 99 | Summary: ::read_to_end; Argument[self]; Argument[0]; taint |
+| 100 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint |
+| 101 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint |
+| 102 | Summary: ::next; Argument[self]; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; taint |
+| 103 | Summary: ::fill_buf; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint |
+| 104 | Summary: ::buffer; Argument[self]; ReturnValue; taint |
+| 105 | Summary: ::new; Argument[0]; ReturnValue; taint |
+| 106 | Summary: ::read; Argument[self]; Argument[0].Reference; taint |
+| 107 | Summary: ::read; Argument[self]; Argument[0]; taint |
+| 108 | Summary: ::read_exact; Argument[self]; Argument[0].Reference; taint |
+| 109 | Summary: ::read_exact; Argument[self]; Argument[0]; taint |
+| 110 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint |
+| 111 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint |
+| 112 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint |
+| 113 | Summary: ::lock; Argument[self]; ReturnValue; taint |
+| 114 | Summary: